I2C- und SPI-Bus-Routing

Wenn Sie einen I2C-Bus (SDA, SCL) oder einen SPI-Bus (SCLK, MOSI, MISO) an mehrere Slaves weiterleiten, sollten Sie die Slaves vorzugsweise parallel oder in Reihe verdrahten? Unten sind zwei Diagramme mit beschrifteten Entfernungen, um bei der Beantwortung zu helfen. In allen Schaltplänen sehe ich, dass die Leute in Reihe zu schalten scheinen, aber warum ist das der Fall - was ist, wenn die Kapazität des Pfades (A + B + C) < Kapazität von (MNP) ist?

Parallel:Geben Sie hier die Bildbeschreibung ein

Serie:Geben Sie hier die Bildbeschreibung ein

Antworten (2)

Ich stimme Madmangurumans Aussage nicht zu: "Sowohl für 'normales' I2C als auch für 'normales' SPI benötigt jeder Slave eine direkte Verbindung zum Master, sodass alle Slaves unabhängig von der physischen Platzierung der Geräte parallel sind." Schieberegister sind sehr oft in Reihe geschaltet, was eine große Schleife ergibt, die mehrere Verschiebungen erfordert, um die Daten zu zirkulieren. Das ist nur ein Beispiel für eine gültige Reihenschaltung und es gibt noch viele mehr. Parallel ist wahrscheinlich häufiger, wie ich unten erklären werde, wenn die Slave-Geräte keine einfachen oder buchstäblichen Schieberegister sind. Wie Sie dies tun, hängt ganz von den Anforderungen Ihres Designs sowie der Funktionalität Ihrer Slave-Geräte ab.

Mehr Details:

Die Verwendung des Wortes Reihe macht tatsächlich Sinn. Was Sie sagen, ist, dass der MOSI-Pin (Master out / Slave in) am Master mit dem seriellen Dateneingang von Slave 1 verbunden ist. Der serielle Datenausgang von Slave 1 ist mit dem seriellen Dateneingang von Slave 2 und dem seriellen verbunden Der Datenausgang von Slave 2 ist mit dem seriellen Dateneingang von Slave 3 verbunden. Schließlich, um die Schleife zu vervollständigen (vorausgesetzt, Sie möchten eine bidirektionale Kommunikation), würden Sie den seriellen Datenausgang von Slave 3 mit dem seriellen Dateneingang des Masters verbinden. Damit dies funktioniert, muss die vom Master generierte Uhr mit jedem Slave verbunden werden. Außerdem muss wahrscheinlich jeder Slave auf demselben Chipauswahlsignal liegen, um sicherzustellen, dass die SPI-Hardware reagiert. Um von allen drei Slaves zu lesen, müssten Sie drei Übertragungen vom Master senden.

Wenn Sie alles parallel schalten, benötigen Sie jetzt für jeden Slave einen diskreten Chip-Select. Die Kapazität der Datensignale sollte in dieser Konfiguration trivial höher sein, und die Kapazität des Taktsignals wird sich wahrscheinlich nicht drastisch unterscheiden.

Was das Routing angeht, spielt es wahrscheinlich keine Rolle, solange Sie unter 100 MHz oder so bleiben. Höhere Frequenzen beginnen, andere Probleme einzuführen. Unabhängig davon gibt es viele Gründe, in beide Richtungen zu gehen. Es kann sicherlich von Ihren Firmware-Einschränkungen abhängen. Bearbeiten: Wie von MartinThompson hervorgehoben, ist es möglich, dass Reflexionen Probleme verursachen können, wenn Ihre Route mit einem starken Fahrer (schnelle Flankenrate) lang ist. Wenn Sie eine Multidrop-Route erstellen und schnelle Flankenraten erwarten, sollte das Beenden des Signals erheblich helfen. Dies könnte ein weiteres Gespräch sein, aber es genügt zu sagen, dass Sie Reihen- oder massebezogene Terminatoren hinzufügen können, um die Energie zu absorbieren und Reflexionen zu verhindern.

Beispielsweise ermöglichen viele Mikrocontroller die Interaktion mit SPI-Geräten über DMA. Wenn sich alle Slaves auf demselben Chip Select befinden, ist es weniger Code, um mit allen zu kommunizieren, aber die Latenz ist höher, da Sie mehr Daten verschieben müssen, um die Transaktion abzuschließen. Auch Slaves können signalisieren, dass sie senden wollen, aber da der Master den Takt generiert, kann die Reihenschaltung hier etwas Kopfzerbrechen bereiten. Wenn Sie sich jedoch nicht für diesen Anwendungsfall interessieren, vereinfacht die Reihenschaltung die DMA-Konfiguration. Es ist möglich, DMA zur Kommunikation mit mehreren Peripheriegeräten zu verwenden, indem die Chipauswahl in die Daten eingebettet wird, wodurch der DMA-Controller einen Handshake mit dem entsprechenden Slave durchführt. Möglicherweise haben Sie nicht einmal DMA, aber ich dachte, ich sollte dies erklären, um Ihnen ein Beispiel zu geben, warum eine Reihenschaltung unter Umständen vorteilhaft sein kann. DMA trivialisiert auch parallele Verbindungen, um fair zu sein, und recht häufig sind parallele Verbindungen in dieser Art von Situation viel wünschenswerter.

Die parallele Verkabelung ist meiner Erfahrung nach wahrscheinlich der traditionellere Weg, wenn das Slave-Gerät auf einer höheren Ebene als das einfache Schalten funktioniert. Ich verdrahte Schieberegister die ganze Zeit in Reihe, aber ich schließe häufig mehrere Slave-Mikrocontroller parallel an den SPI-Bus an, damit sie jeweils ihre eigene Chipauswahl und Slave-Auswahl erhalten (die Slave-Auswahl ist für die Slave->-Master-Kommunikation zugewiesen, was im Grunde besagt "Hey, ich muss Daten senden, gib mir eine Uhr").

Schließlich können Sie I2C nicht in Reihe schalten, es sei denn, Sie möchten unterschiedliche I2C-Busse für nachgeschaltete Geräte verwenden. I2C erfordert, dass alle Geräte parallel geschaltet sind. Das einzige, worum Sie sich elektrisch kümmern müssen, ist, dass Sie den richtigen Wert für den externen Pull-up-Widerstand gewählt haben. Da viele Geräte (im Wert von 7 Bit) an den I2C-Bus angeschlossen sein können, könnte ein schwacher Pull-up dazu führen, dass die Bussignale aus der Perspektive aller, die den Bus auf eingehende Daten überwachen, metastabil sind. Sie möchten sicherstellen, dass die SDA-Leitung vor dem nächsten Taktzyklus fest hoch ist, und Sie tun dies, indem Sie den Pull-up-Widerstand richtig dimensionieren.

Ich würde bei SCLK-Frequenzen weit unter 100 MHz vorsichtig sein. Wenn SCLK von einem schnellen Treiber angesteuert wird und die Spur lang genug ist, kann es selbst bei 1 MHz zu schrecklichen Übertragungsleitungseffekten und Mehrfachtaktung kommen ...
@MartinThompson Du hast recht. Danke für den Hinweis. Ich werde das zu meiner Antwort hinzufügen.

Ich bin mir nicht sicher, was Sie mit der Verdrahtung der Busse in Reihe meinen. Sowohl für „normales“ I2C als auch für „normales“ SPI benötigt jeder Slave eine direkte Verbindung zum Master, sodass alle Slaves unabhängig von der physischen Platzierung der Geräte parallel sind.

Ihr Seriendiagramm impliziert, dass Slave 3 irgendwie durch Slave 2 und Slave 1 gehen muss, um den Master zu erreichen. Bus N und Bus P sind nicht mit dem Master verbunden, es handelt sich also nicht um gewöhnliches I2C oder SPI. I2C und SPI funktionieren einfach nicht auf diese Weise, es sei denn, die Slaves 2 und 1 fungieren sowohl als Master als auch als Slaves und leiten Nachrichten auf dedizierten Bussen weiter - ein schrecklich ineffizientes und kompliziertes Schema.

Überdenken Sie, was Sie gesehen haben und wonach Sie fragen.

Sie haben Recht, dass die Unterscheidung zwischen parallel und seriell falsch ist - in Wirklichkeit handelt es sich in beiden Fällen um parallel geschaltete Busse. Ich denke, was ich frage, ist, wie die Slaves platziert werden sollten, um die Gesamtbuslänge zu reduzieren?
Es macht keinen großen Unterschied, wenn die Frequenz niedrig ist. Die Wellenlänge von 400 kHz beträgt 750 m. Selbst wenn Sie I2C mit 400 kHz betreiben, macht es kaum einen Unterschied, wie die Spuren bei dieser Frequenz geroutet werden. Die Wellenlänge von 10 MHz beträgt 30 m. Für 10 MHz SPI wird es also wahrscheinlich auch keinen großen Unterschied machen. Es wäre jedoch wahrscheinlich eine gute Idee, die Länge aller "Stummel" zu minimieren, die von den Spuren (insbesondere der Taktspur) hängen, da sie störende Reflexionen erzeugen können, wenn die Uhr eine scharfe Kante hat. Eine "Reihenschaltung" würde dabei erheblich helfen.