Ist mein SPI-Multiplexing-Design korrekt?

Ich möchte, dass ein RPi als SPI-Master fungiert und mit 24 SPI-Slaves kommunizieren kann. Die SPI-Verbindung ist Vollduplex. Die SPI-Slaves sind etwa 50 cm vom Master entfernt (SPI läuft auf Drähten zu einer anderen hier nicht berücksichtigten Leiterplatte). Die 24 Slaves werden Blue Pill STM32- Boards sein, ich muss DMA auf dem SPI-Slave verwenden (CPU ist sehr beschäftigt).

Ich habe erfolgreich über SPI mit ungeschirmten 50-cm-Kabeln mit einer angemessenen Baudrate für meine Anwendung (9 MHz) kommuniziert.

Ich bin mir ziemlich sicher (obwohl ich es nicht getestet habe), dass ich wegen der mehreren SPI-Slaves und langen Drähte auf Probleme stoßen werde, also habe ich einen Schaltplan entworfen und möchte, dass Sie mir sagen, was funktionieren kann und was nicht. Es gibt wahrscheinlich auch Raum für Vereinfachungen.

Design

  • Ich plane, 3 verkettete 74HC595Schieberegister zu verwenden, um 24 Ausgänge zu erzeugen, die bestimmen, mit welchem ​​​​SPI-Slave das RPi verbunden wird.
  • Ich plane, Quad-Tri-State-Puffer zu verwenden CD54HC125, um die anderen SPI-Slaves zu isolieren, wenn sie mit einem verbunden sind. Diese würden von den Schieberegisterausgängen angesteuert.

Himbeer-Pi

Himbeer-Pi

  • SER, SRCLKund RCLKtreiben die Schieberegister an
  • SPI_CS, SPI_MISO, SPI_MOSIund SPI_SCLKsteuern die SPI-Kommunikation (RPi ist der Master)

Schieberegister

Schieberegister

  • SER, SRCLKund RCLKvom RPi angetrieben
  • Gänseblümchen angekettet
  • Jeder SPI_xAusgang treibt einen Tri-State-Puffer

Tri-State-SPI-Puffer

Tri-State-SPI-Puffer

  • Es gibt 24 ähnliche Blöcke wie diesen, nur die SPI_xÄnderungen
  • Jeder 01x04Stecker führt zu einem SPI-Slave
  • Die Ausgangsfreigabe wird von einem der Schieberegisterausgänge angesteuert (hier SPI_0)
  • SPI_MISOist invertiert, da es sich um einen Ausgangspin des Slaves handelt

Dies ist mein erstes KiCAD-Design, Überprüfung und Kommentare wären sehr willkommen, bevor ich Komponenten kaufe und versuche, sie auf einem Steckbrett zu testen! Danach plane ich, die Platine zu layouten und herstellen zu lassen.

Bearbeiten (Juli 2018): Test in der realen Welt

Ich habe gerade die Kommunikation zwischen einem Raspberry Pi (Master) und 6 Blue Pill (STM32) Boards getestet, Vollduplex.

RPi- und Blue-Pill-Test

Ohne Zusatzgerät und trotz schlechter Verkabelung funktioniert die Kommunikation zuverlässig auf 10 MHz; 99,6 % über 12.000 Meldungen (geprüft mit einer Flechter-Summe)

Ob dies auf 24 Geräte skaliert oder nicht, bleibt eine Frage :)

Diese Puffer sind ineffizient. Du brauchst nur einen.
Arbeiten die Slaves mit unterschiedlichen Spannungen? Sie können in Reihe geschaltet werden, wenn es Ihnen nichts ausmacht, die Geschwindigkeit zu verlieren.
Warum ist es Ihrer Meinung nach notwendig, MISO/MOSI/SCK für jeden Slave einzeln zu isolieren und zu puffern? Warum verwenden Sie nicht einfach Ihre x595, um einzelne CS zu jedem Slave zu treiben und alle anderen SPI-Signale miteinander zu verbinden? Ein richtig implementierter SPI-Slave sollte am Bus vollständig passiv sein, wenn sein CS inaktiv ist.
Ich wusste nicht, dass die Hardware, die den SPI verwaltet, die Pins (alle außer CS?) Auf hohe Impedanz schalten würde, wenn sie nicht durch CS bestätigt wird! Ich werde überprüfen, ob dies beim STM32F1 der Fall ist

Antworten (1)

Warum würden Sie "die anderen SPI-Slaves isolieren, wenn sie mit einem verbunden sind"? Der springende Punkt bei der Verwendung von SPI ist, dass die CS-Leitung jeweils nur einen Slave aktiviert.

Geht es um die Fan-Out-Last auf SCK- und MOSI-Leitungen? Hierfür würde ein einfaches Puffertreibersignal "Bus" ausreichen.

Oder soll es auch das SCK-Signal multiplexen? Ich glaube nicht, dass du das tun musst. Anstatt Schieberegister zum Multiplexen von Signalen zu verwenden, können Sie sie verwenden, um CS-Pins der Slaves direkt anzusteuern. Wenn Ihre Software kein Taktsignal ausgibt, bis der richtige Slave ausgewählt ist, schadet es absolut nicht, sie nacheinander ohne tatsächliche Übertragung zu "aktivieren".

Ich denke, der begrenzende Faktor in Ihrem Design ist die Leitungskapazität, die unabhängig davon wächst, was Sie an RPi-Ausgänge, Puffer oder Slaves anschließen.

Verwenden Sie also Schieberegister, um CS-Pins auf Slaves zu aktivieren, und verwenden Sie einfache Leitungspuffer auf SCK und MOSI.

AKTUALISIEREN:

Ich habe nach anderen Dingen gesucht und diesen Chip gefunden, der meiner Meinung nach perfekt in Ihre Anwendung passt. ADG731 ist ein 32-Kanal-SPI-gesteuerter Multiplexer/Demultiplexer. Sie können es also auf denselben SPI-Kanal wie Ihre Slaves legen, um die CS-Leitung zwischen ihnen umzuschalten (der Mux-CS ist natürlich separat).

Dies würde sogar noch besser funktionieren, als CS mit Schieberegistern umzuschalten, wie ich oben vorgeschlagen habe, da
a) Sie beim Umschalten nicht sofort Slaves aktivieren würden,
b) Sie jeden Slave in beliebiger Reihenfolge anvisieren können und
c) Sie 2 davon befreien werden E/A-Leitungen zur Steuerung von Schieberegistern

Fügen Sie einen winzigen Doppelpuffer für SCK und MOSI hinzu, und Sie haben eine schnellere direkt adressierbare 2-Chip-Lösung anstelle von 27 Chips mit Adressverschiebung.

Mein Verständnis ist, dass mit CMOS-Logik das Fan-Out leicht sehr hoch ist (> 1000), also in meinem Fall nicht relevant ist. Ich bin mir nicht sicher, was ein "einfacher Zeilenpuffer" ist, ein Beispiel wäre wünschenswert
Ich meinte nichts Besonderes, nur dass Sie keinen Chip mit 4 unabhängigen 3-State-Puffer benötigen. So etwas oder eine hohe Geschwindigkeit würde für Ihre Anwendung ausreichen. Wenn Sie bereits HC125- oder VHC125-Puffer haben, sollten sie natürlich gut funktionieren.
"Der ADG731 schaltet einen von 32 Eingängen (S1–S32) auf einen gemeinsamen Ausgang" ... brauchen Sie nicht das Gegenteil, um stattdessen 32 CS/-Leitungen anzusteuern?
@Eric nur ein paar Absätze darunter finden Sie "Diese Teile können sowohl als Multiplexer als auch als Demultiplexer gleichermaßen funktionieren".
Danke @Maple, das habe ich nicht gesehen. Es ist seltsam, dass sie es nicht oben auf das Datenblatt schreiben. Es ist eine ziemlich wichtige Information.
@Eric Nicht wirklich wichtig, da die meisten analogen Multiplexer so arbeiten. Sie können sie sich als einfache mechanische Schalter vorstellen. Dies ist der Hauptunterschied zu digitalen Multiplexern, die bestimmte Spannungspegel an den Eingängen erfordern und häufig zusätzliche Logik enthalten, wie beispielsweise I2C-Zustandsmaschinen in Busschaltern.