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).
Antworten:
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.
quelle
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.
quelle
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!
quelle
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.
quelle
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.
quelle