Was ist der beliebteste eingebettete serielle Bus? [geschlossen]

8

Ich entwerfe ein eingebettetes Gerät, das ich über einen seriellen Bus mit Peripheriegeräten von Drittanbietern interoperabel machen möchte. Sollte ich SPI, I²C oder einen anderen Bus wählen?

Die Peripheriegeräte haben eine relativ geringe Bandbreite (einige Sensoren, die über den Bus kommunizieren, werden regelmäßig abgefragt) und höchstwahrscheinlich innerhalb eines Meters oder weniger vom Controller entfernt. Die einzige Aufgabe des Controllers besteht darin, die Sensordaten zu sammeln, auf irgendeine Weise zu verpacken und dann über einen anderen Bus an ein Funkmodul zu senden (obwohl der Sensorbus möglicherweise auch dafür wiederverwendet werden könnte).

pfyon
quelle
3
Es hängt davon ab, mit welchen Peripheriegeräten Sie zusammenarbeiten möchten, mit welchen Spannungen, mit welchen Geschwindigkeiten und in welcher Entfernung.
Toby Jaffey
1
Ich habe der Frage weitere Details hinzugefügt
pfyon
1
Ich kann nicht glauben, dass UART überhaupt nicht erwähnt wurde ... ich sage nur.
Vicatcu
Korrigieren Sie mich, wenn ich falsch liege, aber ich dachte nicht, dass UART ein Bus ist. Ich dachte, es sei nur serielle Kommunikation zwischen zwei Geräten.
Pfyon
Ein Bus ist also nicht für die serielle Kommunikation zwischen zwei Geräten geeignet? Diskontieren Sie es, weil es manchmal nur Punkt-zu-Punkt verwendet wird? PCIe, SATA, HT sind im Allgemeinen Punkt-zu-Punkt. Unabhängig davon können die meisten UART-Peripheriegeräte für RS-422, RS-485 oder LIN verwendet werden, die Multi-Drop-Peripheriegeräte sind.
Nick T

Antworten:

12

Wenn Sie sich nicht sicher sind und Ihre Anforderungen ziemlich vage sind, würde ich I²C wählen.

Der Hauptunterschied zwischen SPI und I²C besteht darin, dass SPI für jedes Peripheriegerät eine Chipauswahlleitung benötigt. I²C sendet zu Beginn der Kommunikation eine Peripherieadresse, sodass keine Chipauswahlleitungen erforderlich sind. Chip-Select-Leitungen werden nach den ersten paar umständlich.

Auf der anderen Seite ist SPI wahrscheinlich einfacher zu implementieren und zu debuggen. Es könnte der Gewinner sein, wenn Sie nur eine Verbindung zu einigen Geräten herstellen möchten.

Ich würde USB ausschließen, es sei denn, Sie benötigen hohe Datenraten über relativ große Entfernungen (m statt cm). Ich würde auch RS-232 ausschließen, es sei denn, es ist noch 1976 und Ihre Peripheriegeräte benötigen ein massives Signal, um ein wenig von Rauschen zu unterscheiden.

Sie könnten Dallas 1-Draht in Betracht ziehen, aber ich vermute, dass es nicht so häufig ist wie I²C, und ein "1-Draht" -Bus, der 2 Drähte benötigt, um zu funktionieren, schien mir immer ein wenig faul zu sein.

pingswept
quelle
1
Ich denke, wenn Sie einen sehr einfachen Controller haben und Bit-Banging verwenden müssen (im Grunde genommen manuell die Uhr bedienen), ist es viel einfacher, SPI auf 4 verbleibenden GPIO-Ports zu implementieren.
Wouter Simons
1
Ich denke, Sie haben Recht damit, dass es einfacher ist, SPI als I2C zu bitbangen. Ich hoffe, es kommt nicht darauf an, ein bisschen zu hämmern.
Pfyon
3
+1 für die Fischigkeit des 2-Draht-Systems, das als "1-Draht" vermarktet wird.
Semaj
Und um es noch schlimmer zu machen, benötigen viele Chips, die das 1-Draht-System (+ Masse) implementieren, einen dritten Pin - Vcc -, weil sie nicht mit parasitärer Energie betrieben werden können! Wenn ich an einen 1-Draht-Bus denke, stelle ich mir einen kapazitiv gekoppelten Aufbau mit einem strombegrenzten Brückengleichrichter und einem selbsttaktenden Leitungscode vor. nicht 2 oder 3 Drähte.
Kevin Vermeer
"1-Draht" hätte "1-Draht" heißen sollen, da dies eher das ist, was es ist. Die zusätzlichen Drähte sind GND und (manchmal) eine stabile Stromleitung.
Johan
3

Da Sie sagten, dass es eine geringe Bandbreite sein würde, würde ich genug E / A zuweisen, um sowohl SPI als auch I2C zu verarbeiten. Ich würde auch, wenn möglich, zusätzliche CS-Leitungen haben, damit Sie mehrere SPI-Geräte ausführen können. Vergessen Sie auch nicht zu sehen, wie Sie das Peripheriegerät mit Strom versorgen. Wenn der Akku leer ist, um eine maximale Lebensdauer zu erreichen, müssen Sie das Gerät in den Energiesparmodus versetzen oder die Stromversorgung unterbrechen, wenn Sie es nicht verwenden. Verwenden Sie auch das serielle Controller-Modul Ihres Controllers, wenn möglich. Viele Controller muxen SPI, I2C und seriell. Wenn Sie das Funkgerät vom Sensor trennen können, ist es einfacher, Geräte herunterzufahren, wenn sie nicht verwendet werden. Einige Sensoren haben auch eine Leitung, die dem Controller mitteilt, wann sie gewartet werden müssen, sodass Sie auch ein zusätzliches E / A in einen Pin einspeisen möchten, idealerweise einen, aus dem Sie einen Interrupt generieren können.

Rex Logan
quelle
2

Die Frage ist aufgrund von Definitionsproblemen ein kleines Problem.

Serialisierte Kommunikation ist im Grunde das, was Sie benötigen, wenn Sie mit einem externen Peripheriegerät kommunizieren möchten, ohne mehrere Ports an Ihrem Controller zu verwenden. Grundsätzlich benötigt jede serielle Kommunikationsmethode eine Uhr und eine Konfiguration für den Umgang mit Datenverbindungen.

SPI ist ein 4-Draht-Bus. I2C ist ein 2-Draht-Bus.

Jeder hat unterschiedliche Eigenschaften. Sie müssen antworten, wie schnell Ihre Kommunikation sein muss, wie zuverlässig sie sein muss, welche Optionen Ihr Mikrocontroller bietet usw.

Dieser Wikipedia- Artikel und diese Referenzseite erklären viel klarer als ich, folgen Sie auch den Referenzen, um noch mehr zu erfahren!

Wouter Simons
quelle
2

Grundsätzlich sollten Sie zwischen I2C und SPI wählen.

Unabhängig davon, welchen Bus Sie verwenden, sollten Sie den Spannungspegel Ihrer Sensoren und Peripheriegeräte von Drittanbietern berücksichtigen. Sie können dies tun, indem Sie Ihren eigenen Konverter mit zwei MOSFETs herstellen (nur in eine Richtung - Aufnehmen / keine Änderung oder Ab / keine Änderung; nur ein Problem, wenn Sie Ihre Sensoren mit 3,3 betreiben und mit 1,8- und 5-V-Mastern verbinden müssen). Siehe AN10441 von NXP [PDF]. Dies funktioniert auch für SPI (Entfernen Sie einfach die Klimmzüge). Sie müssen Ihrem Anschluss eine Leitung hinzufügen, um eine Referenzspannung herzustellen (falls Sie dies noch nicht tun).

Ein Nachteil von I2C ist, dass Sie auf die langsamste Uhr im Bus beschränkt sind. Wenn ein Sensor nur 100 kHz unterstützt und Sie mit 400 kHz oder 1 MHz (beide gültige Geschwindigkeiten) mit Ihrem Speicher sprechen möchten, ist das Verhalten Ihres langsameren Sensors nicht spezifiziert. Wenn Sie SPI verwenden, bedeutet die Chipauswahlleitung, dass der langsamere Sensor nicht einmal hört, was sich auf dem Bus befindet, und Sie können unterschiedliche Geschwindigkeiten für verschiedene Sensoren ausführen.

Kevin Vermeer
quelle
1

Ich würde I2C verwenden. Stellen Sie einfach sicher, dass Sie ein drahtloses Modul erhalten, das über I2C kommunizieren kann, wenn Sie es auf demselben Bus wie Ihre Sensoren haben möchten. Die meisten Kommunikationsperipheriegeräte, die ich gesehen habe, verwenden SPI, nicht I2C.

mjh2007
quelle