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.
74HC595
Schieberegister zu verwenden, um 24 Ausgänge zu erzeugen, die bestimmen, mit welchem SPI-Slave das RPi verbunden wird.CD54HC125
, um die anderen SPI-Slaves zu isolieren, wenn sie mit einem verbunden sind. Diese würden von den Schieberegisterausgängen angesteuert.SER
, SRCLK
und RCLK
treiben die Schieberegister anSPI_CS
, SPI_MISO
, SPI_MOSI
und SPI_SCLK
steuern die SPI-Kommunikation (RPi ist der Master)SER
, SRCLK
und RCLK
vom RPi angetriebenSPI_x
Ausgang treibt einen Tri-State-PufferSPI_x
Änderungen01x04
Stecker führt zu einem SPI-SlaveSPI_0
)SPI_MISO
ist invertiert, da es sich um einen Ausgangspin des Slaves handeltDies 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.
Ich habe gerade die Kommunikation zwischen einem Raspberry Pi (Master) und 6 Blue Pill (STM32) Boards getestet, Vollduplex.
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 :)
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.
Lange Pham
Lange Pham
brhans
Viktor Lamoine