Kann ich den CS-Pin sicher umschalten, ohne Daten zu senden?

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.


schematisch

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?

Datenblätter sagen?
@IgnacioVazquez-Abrams Wenn Sie wollten, dass ich die Links zu den Datenblättern hinzufüge, habe ich genau das getan. Ich verwende nicht den von NXP hergestellten 138, aber ich nehme an, das spielt keine Rolle.
Er meinte, Sie sollten sie lesen.
Ihre "SPI-Geräte" sind also 74HC595-Schieberegister? Wenn ja, dann ist Ihr Problem, dass ein 74HC595 kein SPI-Gerät ist. Nur weil es einen getakteten seriellen Eingang hat, ist es kein SPI, und Sie sollten nicht erwarten, dass es sich wie eines verhält.
@brhans Ich denke, das könnte eine Antwort sein. Sie sind nicht nur die 595er; Ich habe auch einen MAX7219AWG und plane weitere hinzuzufügen. Wenn der 595 jedoch verlangt, dass ich seinen "CS" -Pin hoch halte, sollte das eine einfache Lösung für meinen Umschalter sein. Wie in, war die Frage eher "korrigiere mich, wenn ich falsch liege" als "was los ist"; Ich versuche zu recherchieren, bevor ich frage.
Ein vollständiger Schaltplan würde helfen. Binden Sie zum Beispiel die STCP- und SHCP-Signale des 595er zusammen? Teilen Sie diese Leitungen mit Chip Select für die SPI-Geräte? Usw.
@ThePhoton Nein, der SHCP ist mit der Taktleitung des SPI-Busses verbunden und der STCP ist mit einem der Ausgänge des 138 verbunden. Der 138 fungiert also als CS-Selektor. Aber basierend auf den Antworten denke ich, dass es meine Probleme mit dem vorübergehenden Umschalten des falschen CS beheben sollte, wenn ich einfach den 138 dazu bringe, alle Pins hoch zu bekommen und dann nur das gewünschte Gerät niedrig zu bekommen.
@ThePhoton Ich habe den Schaltplan hinzugefügt, um den Schaltungseditor auszuprobieren :)

Antworten (2)

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 muxBits 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.