Gemeinsame Nutzung von Takt und Daten für die Schieberegister 74HC595 und CD4021B?

Können Ausgangsschieberegister (74HC595) und Eingangsschieberegister (CD4021B) auf Arduino mit SPI dieselben Takt- und Datenleitungen teilen, wobei unterschiedliche Latch-Pins entweder die Kette für die Eingangs- oder die Ausgangsverschiebung "aktivieren"?

Ich denke, das sollte funktionieren, aber ich habe noch nicht alle Teile, die ich brauche, um es zu prototypisieren. Ich habe bereits alle diese Teile für eine Lösung, die NICHT funktioniert, und versuche, diesen Schritt "opps, das funktioniert nicht" zu überspringen. :-)

Ich verwende derzeit SPI von einem Arduino Pro Micro (5 V), um eine Kette von 74HC595- Schieberegistern für eine Multiplex-Bank von 7-Segment-Anzeigetafeln anzusteuern. Jede "Anzeigetafel" verfügt über zwei 74HC595, um eine Reihe von Anzeigen anzusteuern, und ist über ein Flachbandkabel mit der nächsten (identischen) Tafel verbunden, die die nächste Anzeige in einer Reihe von verketteten Anzeigetafeln ist. Das ist gebaut und funktioniert super. Ich verwende eine der folgenden Schleifen, um Daten in die 74HC595-Schieberegister zu schreiben.

SPI.transfer(myByteOut);

Ich möchte jedem Board einen IR-Sensor (Vishay TSOP75356WTR) hinzufügen. Der Arduino könnte erkennen, ob der IR-Sensor auf jeder verketteten Platine hoch oder niedrig ist.

Mein Plan ist es, das vorhandene Display-Board-Setup zu erweitern, indem eine parallele Kette von Eingangsschieberegistern ( CD4021B ?) hinzugefügt wird, um die IR-Sensorwerte von jedem Board zurück zum Arduino zu verschieben. Dies würde über eine Schleife von erfolgen

myByteIn = SPI.transfer(0);

Kann eine Kette von 74HC595 und eine Kette von CD4021B die gleichen Daten- und Taktleitungen teilen und unterschiedliche "Latch" -Pins verwenden, um zwischen dem Lesen meines Eingangs (CD4021B) und dem Schreiben meines Ausgangs (74HC595) umzuschalten?

Es ist eine hohe Geschwindigkeit erforderlich, und Arduino verfügt nur über ein hardwarebasiertes Hochgeschwindigkeitspaar, sodass ich die Takt- und Datenpins teilen müsste. Wird es funktionieren? Sonst noch was falsch an meinem Plan?

Wenn Sie von einer parallelen Kette von Eingangsschieberegistern sprechen, meinen Sie vermutlich, dass Sie das Datensignal multiplexen würden, anstatt den CD4021B an das Ende der 74HC595-Register am Datenausgang der 595-Register anzuschließen?

Antworten (2)

Wenn ich meine Frage selbst beantworten darf. Es sollte funktionieren. Hier ist, wie mit Arduino über SPI.

void setup() {
    //Setup SPI
    SPI.begin();
    //Setup CD4021
    pinMode(CD4021_PSC_PIN9, OUTPUT);
    digitalWrite(CD4021_PSC_PIN9,HIGH);
    //Setup 74HC595
    pinMode(HC595_LATCH_PIN12, OUTPUT);
    digitalWrite(HC595_LATCH_PIN12,HIGH);
}

void loop(){
    //Shift out to 74HC595
    digitalWrite(HC595_LATCH_PIN12,LOW);
    SPI.transfer(BYTE_DATAOUT);
    digitalWrite(HC595_LATCH_PIN12,HIGH);

    //Shift in from CD4021B
    digitalWrite(CD4021_PSC_PIN9,LOW);
    BYTE_DATAIN = SPI.transfer(0x00);
    digitalWrite(CD4021_PSC_PIN9,HIGH);
}

Von hier gelernt , von jemandem, der diese genaue Implementierung zuvor durchgeführt hat.

Ich kann bestätigen, dass das funktioniert.

Wenn beide mit einer gemeinsamen SPI-Taktfrequenz arbeiten können, sehe ich kein Problem. SPI ist ein Single-Ended-Kommunikationsprotokoll, daher sollte es kein Problem geben, zwei Drähte an dieselbe Verbindung anzuschließen.

Sie müssen nur sicherstellen, dass Sie immer im Auge behalten, welche Bits derzeit in den Registern gespeichert sind, damit Sie sicherstellen können, dass Sie zum richtigen Zeitpunkt einrasten.

Was den Code betrifft, bin ich mir nicht sicher, ob die Arduino-Umgebung es Ihnen erlaubt, zwei Geräte an dasselbe SPI-Objekt anzuschließen, da es einen eigenen Latch an das Objekt anhängen wird, aber lassen Sie es wissen, dass alle Daten ein SPI ausgehen Die Datenleitung geht zu beiden Geräten, Sie müssen sie nur auf intelligente Weise verriegeln.

Das denke ich auch, habe aber keine Erfahrung um es zu bestätigen.