Update: Ich habe die Lösung, die ich in den Kommentaren vorgeschlagen habe, in der Praxis ausprobiert (Verwendung des E-Pins auf dem 138 IC während des Wechsels des Zielgeräts) und es hat tatsächlich funktioniert. Lesen Sie das Ganze, wenn Sie mehr Details wünschen.
Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan
Ich versuche, mehrere SPI-Geräte mit einem 74HC138 3-zu-8-Multiplexer zu multiplexen . Meine Programmlogik änderte sich von typischem "Setze CS niedrig, SPI aus, setze CS hoch" zu etwas wie:
void selectDevice(int n) {
digitalWrite(mux0, n & (1 << 0));
digitalWrite(mux1, n & (1 << 1));
digitalWrite(mux2, n & (1 << 2));
}
selectDevice(3); // my device
spiOut();
selectDevice(7); // dummy, not used
Es funktioniert perfekt, wenn ich nur mit einem Gerät spreche. Es gibt jedoch einige Probleme, wenn zwei oder mehr Geräte auf diese Weise verwendet werden.
Diese brillante Antwort hat folgendes:
Die CS-Leitung geht auf Low, der Takt läuft und verschiebt im Wesentlichen Eingabebits hinein und Ausgangsbits heraus, bis die Transaktion beendet ist, an welchem Punkt die CS-Leitung auf High geht. Wenn ihre CS-Leitung hoch ist, kommunizieren Slave-Geräte nicht: Sie ignorieren die CLK- und MOSI-Leitungen und versetzen ihren MISO-Pin in einen hochohmigen Zustand, damit jemand anderes ihn verwenden kann.
Dies wäre sinnvoll, scheint aber dem 74HC595-Schieberegisterverhalten für den Übergang von niedrigen -> hohen ST_CP-Pins (also meinem CS) direkt zu widersprechen:
Inhalte von Schieberegisterstufen (internes QnS) werden an die Speicherregister und parallelen Ausgangsstufen übertragen
Die Verhaltenstabelle und das Funktionsdiagramm geben grundsätzlich an, dass ST_CP irrelevant ist, wenn die Daten auf SH_CP/DS eingehen, und sie werden im Schieberegister gespeichert. Das würde bedeuten, dass ich, wenn ich einige Daten auf andere Geräte schreibe und dann kurz den ST_CP-Pin umschalte, diesen Müll ausschreibe! (unter der Annahme, dass der Ausgang immer aktiviert ist).
Aus meiner Sicht macht mein Auswahlcode genau das, weil die Bits nicht sofort umkehren; Der Multiplexer geht durch andere Pins. Bedeutet das, dass ich einen separaten Pin benötige, um alle Mux-Ausgänge während des Umschaltens zu deaktivieren (high zu machen)? Verstehe ich das richtig?
Der HC595 hat keinen CS-Eingang, es ist kein 'SPI'-Gerät, obwohl es mit Vorsicht von einem SPI-Master angesteuert werden kann. Daten werden immer mit der Taktleitung in das Schieberegister getaktet. Der Latch-Eingang kann gezwungen werden, einen Teil der Aufgaben einer CS-Leitung zu übernehmen, wie z. B. das Übertragen der S/R-Daten in die Ausgangs-Latches, aber er kann nicht zum Deaktivieren des S/R-Eingangs verwendet werden .
Es gibt mehrere Möglichkeiten, HC595s von einem SPI-Master anzusteuern.
a) Verbinden Sie alle Geräte in einer langen Kette und verschieben Sie gültige Daten in alle.
b) Haben Sie eine separate Taktleitung, die zu jeder Gruppe von 595 geht, mit gemeinsam genutzten Daten und CS, damit die Daten in ihren S/Rs nicht gestört werden, sodass sie in den Ausgängen zwischengespeichert werden können.
c) Oder haben Sie eine separate CS/Latch-Leitung zu jeder 595-Gruppe, mit gemeinsamer Uhr und Daten, so dass Müll zwar in den S/R verschoben wird, aber nicht an den Ausgängen zwischengespeichert wird, und wenn Sie möchten aktualisieren Sie sie, verschieben Sie gültige Daten.
Abhängig von Ihrer SPI-Bibliothek kann dies einige manuelle Bit-Knallen erfordern, um die Gruppen zu trennen.
Bedeutet das, dass ich einen separaten Pin benötige, um alle Mux-Ausgänge während des Umschaltens zu deaktivieren (high zu machen)?
Ja.
Wenn der 138 dauerhaft aktiviert ist, reagiert er auf Zwischencodes, die auftreten können, wenn Sie jedes der drei mux
Bits setzen. Mit anderen Worten, es werden Ausgaben „gestört“, die Sie nicht wollten.
Der 138 hat drei Freigabeeingänge, die aktiviert werden müssen (/E1,/E2 = niedrig, E3 = hoch), um die dekodierte Ausgabe zu aktivieren. Sie sollten einen dieser Freigabeeingänge so steuern, dass beim Einstellen der Gerätenummer die 138 deaktiviert wird, wodurch alle Ausgänge hoch bleiben. Nach dem Einstellen der Gerätenummer können Sie den 138 aktivieren und deaktivieren, um den decodierten Ausgang zu pulsieren.
Ignacio Vazquez-Abrams
Bartek Banachewicz
Eugen Sch.
brhans
Bartek Banachewicz
Das Photon
Bartek Banachewicz
Bartek Banachewicz