Kompromisse bei der Betrachtung von SPI oder I2C?

117

Welche Nachteile sollte ich bei der Entscheidung für eine SPI- oder I2C-Schnittstelle berücksichtigen?

Dieses Beschleunigungsmesser- / Gyro-Breakout-Board ist in zwei Modellen erhältlich, eines für jede Schnittstelle. Wäre eine davon einfacher in ein Arduino-Projekt zu integrieren?

http://www.sparkfun.com/products/11028

Bildbeschreibung hier eingeben

Mark Harrison
quelle
13
I2C und SPI haben ihre Stärken. I2C ist komplexer einzurichten, sobald es stabil ist, können Sie es so einfach erweitern (solange Ihre Busverkabelung nicht zu lang oder zu groß wird). SPI ist einfach einzurichten. Sie können es bei Bedarf sehr einfach bitbangen. Bei der Erweiterung wird die E / A mit allen ausgewählten Chips belegt. Wenn ich den Luxus von E / A und Anschlussraum habe und keine Busse benötige, würde ich mich immer für SPI entscheiden.
Hans
Wie ist I2C komplexer? Ich habe beide Busse auf verschiedenen Mikros (kleine PICs und anständige ARMs) verwendet und in jedem Fall war das I2C-Setup einfacher (dh es mussten weniger Register geschrieben werden). Wenn überhaupt, ist SPI aufgrund der Taktpolarität und der Datenabtastoptionen komplexer.
Armandas
6
@Armandas - auf keinen Fall! SPI verfügt über 4 mögliche Modi für die Takt- / Datenpolarität, von denen zwei dominieren: Fast alle SPI-Geräte aktualisieren ihren MISO-Ausgang bei der fallenden Flanke eines Takts und lesen ihren MOSI-Eingang bei der steigenden Flanke eines Takts. Sie können herausfinden, welche in ein paar Minuten, indem Sie sich das Datenblatt ansehen, und dann sind Sie fertig. Wenn Sie versehentlich den falschen Modus gewählt haben, werden Sie ihn schnell herausfinden, wenn Sie sich die Oszilloskopspuren ansehen. SPI-Datenfehler sind selten und führen nicht dazu, dass Sie in komischen Zuständen stecken bleiben wie bei I2C.
Jason S
6
Ich sage, I2C ist viel komplexer, weil ich einmal einen I2C-Treiber bei einem ARM-Prozessor schreiben musste. Ich verfolgte die Zustandsmaschine von NXP-Dokumenten und sie war ungefähr 20 Zustände lang. Ich brauchte eine anständige Zeit, um die Bestätigung herauszufinden, wann das letzte Byte gelesen / geschrieben wurde usw. Ich hatte noch nie eines dieser Probleme mit SPI, musste nur die Uhr und die Daten in eine Reihe bringen.
Hans
1
@JonL, ehrlich gesagt, ich bin der einzige, der eine vollständige Antwort gegeben hat, da ich der einzige bin, der das Thema des speziellen Breakout-Boards bespricht, das das OP verwenden möchte, und darauf hinweist, dass es in nicht verfügbar ist Sowohl SPI als auch I2C, aber nur I2C - also muss er I2C verwenden, wenn er diese bestimmte Karte verwenden möchte. Die anderen behandelten nur, welche Schnittstelle (SPI oder I2C) einfacher zu bedienen ist, was ich auch behandelte.
Tcrosley

Antworten:

98

Zusammenfassung

  • SPI ist schneller.
  • I2C ist komplexer und nicht so einfach zu bedienen, wenn Ihr Mikrocontroller keinen I2C-Controller hat.
  • I2C benötigt nur 2 Leitungen.

I2C ist ein Bussystem mit bidirektionalen Daten auf der SDA-Leitung. SPI ist eine Punkt-zu-Punkt-Verbindung mit Datenein- und -ausgängen auf separaten Leitungen (MOSI und MISO).

Im Wesentlichen besteht SPI aus zwei Schieberegistern, in denen Sie Daten in ein Schieberegister takten, während Sie Daten aus dem anderen takten. Normalerweise werden Daten in Bytes geschrieben, indem jeweils 8 Taktimpulse hintereinander liegen. Dies ist jedoch keine SPI-Anforderung. Sie können auch Wortlängen von 16 Bit oder sogar 13 Bit haben, wenn Sie möchten. Während in I2C die Synchronisation durch die Startsequenz in SPI erfolgt, wird SS auf High gesetzt (SS ist aktiv auf Low). Sie entscheiden selbst, nach wie vielen Takten dies ist. Wenn Sie 13-Bit-Wörter verwenden, speichert die SS die zuletzt getakteten Bits nach 13 Taktimpulsen.
Da sich die bidirektionalen Daten auf zwei separaten Leitungen befinden, ist die Schnittstelle einfach.

NN+3N+2

Wie Tcrosley sagt, kann SPI mit einer viel höheren Frequenz arbeiten als I2C.

I2C ist etwas komplexer. Da es sich um einen Bus handelt, müssen Geräte adressiert werden. Ihre Kommunikation beginnt mit einer eindeutigen Startsequenz: Die Datenleitung (SDA) wird nach unten gezogen, während die Uhr (SCL) hoch ist. Der Rest der Kommunikationsdaten darf sich nur ändern, wenn die Uhr niedrig ist. Diese Startsequenz synchronisiert jede Kommunikation.
Da die Kommunikation die Adressierung beinhaltet, werden für eine beliebige Anzahl von Geräten (bis zu 127) nur zwei Leitungen benötigt.

edit
Es ist offensichtlich, dass die Datenleitung bidirektional ist, aber es ist erwähnenswert, dass dies auch für die Taktleitung gilt. Slaves können die Uhr verlängern , um die Busgeschwindigkeit zu steuern. Dies macht I2C für die Pegelverschiebung oder -pufferung weniger geeignet. (SPI-Leitungen im Standardmodus sind alle unidirektional.)

Nachdem jedes Byte (Adresse oder Daten) gesendet wurde, muss der Empfänger den Empfang bestätigen, indem er einen Bestätigungsimpuls auf SDA legt. Wenn Ihr Mikrocontroller über eine I2C-Schnittstelle verfügt, wird dies automatisch erledigt. Sie können es immer noch mit einem Bit-Bang spielen, wenn Ihr Mikrocontroller es nicht unterstützt, aber Sie müssen den E / A-Pin für jedes Quittieren oder Lesen von Daten vom Ausgang zum Eingang umschalten, es sei denn, Sie verwenden einen E / A-Pin zum Lesen und Lesen eine zum Schreiben.

Bei 400 kHz ist Standard-I2C viel langsamer als SPI. Es gibt Hochgeschwindigkeits-I2C-Geräte, die mit 1 MHz arbeiten und immer noch viel langsamer als 20 MHz SPI sind.

stevenvh
quelle
7
Ich habe noch keinen Mikrocontroller kennengelernt, der alle Eckfälle von I2C abdeckt, die eine ordnungsgemäße Fehlererkennung und -behebung auf eine Weise erfordern, die ohne I2C-Fachkenntnisse nutzbar ist. Ich musste immer wieder von einem "intelligenten" I2C-Peripheriegerät auf Bitbangen zurückgreifen, um den Fall der versäumten Uhr zu bewältigen, wenn der SDA niedrig gehalten wird. Das ist ein kompletter Schmerz./
Jason S
(aber +1, da ich mit dem Rest Ihrer Antwort einverstanden bin)
Jason S
Es gibt sogar I2C-Geräte, die mit 3,4 MHz arbeiten, aber ich bin nicht sicher, ob diese mit langsameren Geräten kombiniert werden können (da alle Geräte in der Lage sein müssen, der Busadressierung zu folgen). Ich glaube auch, dass das Timing von 3,4 MHz I2C ein bisschen anders ist.
Hans
@Hans - HS I2C scheint zu sein , abwärtskompatibel mit den häufigeren 400kbit Geräten. Ehrlich gesagt (ohne gründliche Recherche) habe ich (noch) keinen Mikrocontroller gesehen, der HS unterstützt, deshalb wollte ich ihn nicht erwähnen.
Stevenvh
@stevenvh: Bei einigen Zweidraht-Implementierungen von Controllern (z. B. Cypress PSOC) muss der SCK für mindestens ein oder zwei Zyklen eines internen Takts niedrig sein, bevor er zwischengespeichert wird. Ich weiß nicht, warum sie eine I2C-Startbedingung ohne einen Systemtaktimpuls nicht erkennen und im Takt dehnen können, aber solche Verhaltensweisen bedeuten, dass alle I2C-Transaktionen auf dem Bus ausgeführt werden müssen, wenn ein solcher Chip mit einer niedrigen Systemtaktgeschwindigkeit ausgeführt wird langsam laufen). Selbst ein 400-kHz-Betrieb ist für einen PSOC mit 3 MHz zu schnell.
Supercat
39

(redigieren Sie: Um klar zu sein, haben viele der folgenden Interessen mit der Signalintegrität zu tun, die durch die Board-to-Board-Verwendung von I2C / SPI-Geräten verursacht wird, wie Olin richtig hervorhebt.)

Wenn Sie keine Einschränkungen haben, die Sie stark in Richtung weniger Drähte drücken (wir hatten ein Projekt mit einem hermetisch abgedichteten Steckverbinder, bei dem jeder zusätzliche Kontakt ziemlich teuer war), vermeiden Sie I2C, wenn möglich, und bleiben Sie bei SPI.

SPI ist auf Hardware- und Softwarebasis recht einfach zu handhaben. In der Hardware gibt es zwei gemeinsam genutzte Datenleitungen, Master In Slave Out (MISO oder SOMI) und Master Out Slave In (MOSI oder SIMO), einen vom Master generierten gemeinsam genutzten Takt und eine Chipauswahl pro Gerät. Die CS-Leitung geht auf LOW, der Takt zykliert und verschiebt im wesentlichen die Eingangsbits und verschiebt die Ausgangsbits, bis die Transaktion beendet ist. An diesem Punkt geht die CS-Leitung auf HIGH. Wenn ihre CS-Leitung hoch ist, kommunizieren Slave-Geräte nicht: Sie ignorieren die CLK- und MOSI-Leitungen und versetzen ihren MISO-Pin in einen hochohmigen Zustand, damit andere ihn verwenden können.

Wenn Sie einen Mikrocontroller mit mehreren SPI-Geräten und einem integrierten SPI-Peripheriegerät haben, senden Sie den CS-Ausgang des Mikrocontrollers an einen Demultiplexer (z. B. 74HC138) und steuern Sie die Adressleitungen, um das Gerät zwischen SPI-Transaktionen auszuwählen. Sie schreiben Wörter in ein Register, um sie für die Ausgabe in die Warteschlange zu stellen, und lesen sie zurück, nachdem der CS-Pin auf Hoch angehoben wurde.

Da alle SPI-Signale unidirektional sind, können sie gepuffert, über eine Isolationsbarriere mit digitalen Isolatoren verwendet und mit Leitungstreibern wie LVDS von Karte zu Karte gesendet werden. Das einzige, worüber Sie sich Sorgen machen müssen, ist die Umlaufverzögerung, die Ihre maximale Frequenz begrenzt.


I2C ist eine ganz andere Geschichte. Vom Standpunkt der Verdrahtung ist es zwar viel einfacher, mit nur zwei Drähten SCL und SDA, aber beide Leitungen sind gemeinsam genutzte bidirektionale Leitungen, die Open-Drain-Geräte mit einem externen Pullup verwenden. Es gibt ein Protokoll für I2C, das mit der Übertragung einer Geräteadresse beginnt, sodass mehrere Geräte verwendet werden können, wenn jedes seine eigene Adresse hat.

Vom Standpunkt der Hardware aus ist es sehr schwierig, I2C in Systemen zu verwenden, die signifikante Störungen aufweisen. Um I2C-Leitungen zu puffern oder zu isolieren, müssen Sie auf exotische ICs zurückgreifen - ja, es gibt sie, aber es gibt nicht viele: Wir haben eins in einem Projekt verwendet und festgestellt, dass Sie einen Isolator verwenden können, aber nicht Verwenden Sie zwei in Reihe - es wurden kleine Spannungsabfälle verwendet, um herauszufinden, welche Seite das treibende Ende der Dinge war, und zwei in Reihe auftretende Abfälle waren zwei große.

Die Schwellenwerte für den Logikpegel von I2C hängen von Vcc ab. Sie müssen also sehr vorsichtig sein, wenn Sie 3-V- / 3,3-V- und 5-V-Geräte im selben System verwenden.

Alle Signale, die ein Kabel mit einer Länge von mehr als einem oder zwei Fuß verwenden, müssen sich um die Kabelkapazität kümmern. Eine Kapazität von 100pf / Meter ist für Mehrleiterkabel nicht ungewöhnlich. Dies führt dazu, dass Sie den Bus verlangsamen oder niedrigere Pullup-Widerstände verwenden müssen, um in der Lage zu sein, mit der zusätzlichen Kapazität richtig umzugehen und die Anforderungen an die Anstiegszeit zu erfüllen.

Nehmen wir also an, Sie haben ein System, das Ihrer Meinung nach gut entwickelt ist, und Sie können die meisten Probleme mit der Signalintegrität lösen, und Rauschen ist selten (aber immer noch vorhanden). Worüber müssen Sie sich Sorgen machen?

Es gibt eine Reihe von Fehlerbedingungen, auf die Sie vorbereitet sein müssen:

  • Slave-Gerät erkennt ein bestimmtes Byte nicht. Sie müssen dies erkennen und die Kommunikationssequenz stoppen und neu starten. (Mit SPI können Sie normalerweise die gesendeten Daten zurücklesen, wenn Sie sicherstellen möchten, dass sie fehlerfrei empfangen wurden.)

  • Sie lesen ein Datenbyte von einem Slave-Gerät und das Gerät ist aufgrund von Rauschen auf der Taktleitung "hypnotisiert": Sie haben die erforderlichen 8 Takte zum Lesen dieses Bytes gesendet, aber das Slave-Gerät denkt es aufgrund von Rauschen hat 7 Takte empfangen und sendet immer noch eine 0 auf der Datenleitung. Wenn das Gerät den achten Takt empfangen hätte, hätte es die Datenleitung auf Hochpegel freigegeben, so dass der Master die Datenleitung anheben oder absenken könnte, um ein ACK- oder NACK-Bit zu senden, oder der Master könnte eine Stoppbedingung (P) senden. Aber der Slave hält die Datenleitung immer noch niedrig und wartet vergeblich auf eine weitere Uhr. Wenn ein Master nicht bereit ist, zusätzliche Uhren zu testen, steckt der I2C-Bus in einem Deadlock. Während ich mehrere Mikrocontroller verwendet habe, die die normalen ACK / NACK-Bedingungen handhaben,

  • Der wirklich schreckliche Fall ist, wenn ein Master Daten auf ein Slave-Gerät schreibt und ein anderer Slave die Geräteadresse falsch interpretiert und der Meinung ist, dass die übertragenen Daten für dieses Gerät bestimmt sind. Es gab I2C-Geräte (I / O-Expander), bei denen die Register gelegentlich falsch eingestellt waren. Es ist fast unmöglich, diesen Fall zu erkennen, und um robust gegen Rauschen zu sein, müssen Sie regelmäßig alle Register einstellen, damit dieser Fehler nach kurzer Zeit behoben wird, wenn Sie auf diesen Fehler stoßen. (SPI hat dieses Problem nie - wenn Sie zufällig einen Fehler in der CS-Leitung haben, wird dieser niemals lange anhalten und Sie erhalten keine Daten, die versehentlich vom falschen Slave-Gerät gelesen wurden.)

Viele dieser Bedingungen könnten im Protokoll ordnungsgemäß behandelt werden, wenn Fehlererkennung (CRC-Codes) vorhanden wäre, aber nur wenige Geräte verfügen über diese.


Ich stelle fest, dass ich in meinem I2C-Master-Gerät komplexe Software erstellen muss, um diesen Bedingungen gerecht zu werden. Meiner Meinung nach lohnt es sich nur, wenn die Einschränkungen bei der Verkabelung uns zwingen, I2C und nicht SPI zu verwenden.

Jason S
quelle
5
Ihre religiöse Abneigung gegen IIC hat hier keinen Platz. Sowohl IIC als auch SPI sind gut in dem, was sie tun, und jeder hat seinen Platz. Die meisten Ihrer Einwände gegen IIC sind auf eine unangemessene Verwendung zurückzuführen. IIC sollte nur an Bord betrachtet werden, obwohl es in der Stromversorgungsindustrie routinemäßig zur Steuerung intelligenter Stromversorgungen eingesetzt wird. Wenn Sie IIC-Puffer benötigen, ist dies ein starkes Indiz dafür, dass IIC nicht die richtige Lösung ist. IIC funktioniert jedoch sehr gut für Geräte mit niedriger Geschwindigkeit, die sich alle auf derselben Platine befinden.
Olin Lathrop
2
Die Schwellenwerte für den Logikpegel von I2C hängen von Vcc ab. Sie müssen also sehr vorsichtig sein, wenn Sie 3-V- / 3,3-V- und 5-V-Geräte im selben System verwenden . Nein, das ist falsch. IIC-Logikschwellenwerte liegen bei festen Spannungen. Sie können 5-V- und 3,3-V-Systeme trivial mischen, indem Sie die Leitungen auf nur 3,3 V hochziehen.
Olin Lathrop
5
Es ist keine religiöse Abneigung gegen I2C, es ist eine praktische Abneigung gegen I2C. Sie haben Recht damit, dass es mit Bordsystemen viel einfacher ist. Ich werde es verwenden, wenn es Sinn macht, aber es erhöht die Softwarekosten, und zu viele Hardware-Ingenieure kleben einfach ein I2C-Gerät auf eine Platine, ohne die Kompromisse zu diskutieren, die mehr Software-Kopfschmerzen verursachen.
Jason S
3
IIC ist etwas einfacher elektrisch zu implementieren, und SPI ist in der Firmware möglicherweise etwas einfacher. Beide sind jedoch in beider Hinsicht ziemlich einfach und unkompliziert.
Olin Lathrop
2
@Olin - Die feste Schwelle von 1,5 V scheint in der Vergangenheit verwendet worden zu sein, aber nach der neuesten Version der Spezifikation liegen die Schwellenwerte tatsächlich bei 0,3 Vcc und 0,7 Vcc. In diesem Zitat aus der Spezifikation werden die 1,5 V für ältere Geräte erwähnt.
stevenvh
16

Das Breakout Board für das Gerät bei SparkFun ist eigentlich nur für die I2C-Version (MPU-6500). Die MPU-6000-Version hat sowohl SPI- als auch I2C-Schnittstellen auf demselben Chip, und ich sehe nicht, dass SparkFun eine Platine mit diesem Chip hat. Ich glaube, Sie können nur I2C verwenden, wenn Sie diese bestimmte Karte verwenden möchten. Aber ich würde I2C aus den folgenden Gründen trotzdem in Ihrer Situation empfehlen.

Im Allgemeinen werden Sie feststellen, dass der I2C-Bus vom Standpunkt der Hardware aus einfacher zu bedienen ist als der SPI-Bus. I2C ist ein 2-Draht-Bus (SCL / SDA):

SCL – Serial clock.
SDA – Serial data (bidirectional).

SPI ist ein 4-Draht-Bus (SCLK / MOSI / MISO / CS):

SCLK– Serial clock.
MOSI – Master-out, Slave-in. Data from the CPU to the peripheral.
MISO – Master-in, Slave out. Data from the peripheral back to the CPU.
CS – Chip select.

Sie können mehrere Geräte an einen I2C-Bus anschließen. Jedes Gerät verfügt über eigene Adressen, die in den Chip integriert sind. Die Adresse wird tatsächlich als erstes Byte jedes Befehls (zusammen mit einem Lese- / Schreibbit) über den Bus gesendet. Dies erfordert zusammen mit einigem anderen Overhead, dass mehr Bits über einen I2C-Bus versus SPI für dieselbe Funktionalität gesendet werden.

Unterschiedliche Geräteklassen (Speicher, E / A, LCD usw.) haben unterschiedliche Adressbereiche. Einige Geräte, die in einem System häufig mehrmals verwendet werden (z. B. der PCF8574-E / A-Expander), verwenden eine oder mehrere Adressleitungen (AD0-2 für den PCF8574), die hoch oder niedrig gebunden werden können, um die niedrigen Bits anzugeben der Adresse. Die MPU-6500 verfügt über eine solche Adressleitung (AD0), sodass zwei davon im selben System verwendet werden können.

Sie können auch mehrere Geräte an einen SPI-Bus anschließen, aber jedes Gerät muss über eine eigene Chip-Select-Leitung (CS) verfügen. Daher ist die 4-Draht-Beschreibung ein bisschen eine Fehlbezeichnung - es ist wirklich eine 3-Draht-Schnittstelle + ein zusätzlicher Draht pro Gerät. Ich habe keine Erfahrung mit der Arduino-Serie von Boards, aber ich glaube, dies würde die Verwendung von SPI auf dem Arduino erschweren, da dies bei der Verwendung vieler Chip-Select-Leitungen mit den von den verschiedenen Shields verwendeten gemeinsamen Pin-Zuordnungen unangenehm werden würde .

Ich glaube, die meisten Arduino-Boards arbeiten mit 5 Volt, einige neuere mit 3,3 Volt. Die MPU-6500 wird mit 3,3 V betrieben. Wenn die minimale Eingangs-Hochspannung für den I2C-Bus auf einer 5-V-CPU 3 V oder weniger beträgt, können Sie Pegelumwandlungsprobleme vermeiden, indem Sie lediglich 10-K-Pullup-Widerstände auf 3,3 V auf den SCL- und SDA-Leitungen bereitstellen, da der Bus offen ist. Kollektor. Stellen Sie sicher, dass alle internen 5-V-Pullups auf einer CPU deaktiviert sind.

Ich habe jedoch das Datenblatt für den ATmega2560 überprüft (am Beispiel des ADK 5v Arduino), und seine minimale Eingangsspannung beträgt 0,7 * Vcc oder 3,5 V, was mehr als 3,3 V ist. Sie benötigen also eine Art aktiven Pegel Der TI PCA9306 , für den Pull-Up-Widerstände auf der 5-V- und der 3,3-V-Seite des Chips erforderlich sind, kostet in Einzelmengen nur 78 Cent.

Warum sollte man dann SPI über I2C wählen? Hauptsächlich, weil SPI viel schneller ausgeführt werden kann - in einigen Fällen bis zu 10 MHz. I2C ist im Allgemeinen auf 400 kHz begrenzt. Dies ist jedoch für den Beschleunigungssensor MPU-6050/6000 kein wirkliches Problem, da er für I2C mit 400 kHz und für SPI nur mit 1 MHz arbeitet - kein so großer Unterschied.

Tcrosley
quelle
3
Ein weiterer Grund, sich für SPI über I2C zu entscheiden: Alle Leitungen sind unidirektional, was Dinge wie Pegelverschiebungen ein wenig erleichtert.
Markrages
3
I2C ist einfacher als SPI ?! Das Einzige, was an I2C einfacher ist, ist die Konnektivität, wenn Sie einfach alles miteinander verbinden können. Andernfalls ist die Signalintegrität in I2C schwieriger und die robuste Softwareimplementierung in I2C schwieriger.
Jason S
2
@JasonS, ich habe Dutzende von Embedded-Software-Projekten mit I2C abgeschlossen und bin noch nie auf die in Ihrem Beitrag erwähnten Probleme mit der Überbrückung gestoßen. Ich kann verstehen, dass Sie es aufgrund Ihrer schlechten Erfahrungen nicht mögen. Derzeit ist ein Produkt auf dem Markt, das einen I2C-DAC zur Audioausgabe verwendet und gleichzeitig den nächsten Datenpuffer von einer SD-Karte über SPI liest. Funktioniert super. Ich konnte SPI nicht sowohl für den DAC als auch für die SD-Karte verwenden, da ich Buskonflikte bekam und der Ton ausfiel. Das Mikro (ein Low-End-Mikro) verfügt nur über einen SPI- und einen I2C-Anschluss.
Tcrosley
1
Ich bin beeindruckt, dass Sie Audio an einen I2C-DAC ausgeben können! (Wie hoch ist die maximale Taktrate?) Wenn Sie Onboard-ICs mit kurzen Auflagen verwenden, ist die Wahrscheinlichkeit, dass Sie auf eine Überbrückung stoßen, äußerst gering, sie besteht jedoch weiterhin. (Außerdem würden Sie nie darauf stoßen, wenn Sie nur Daten auf I2C schreiben. Dazu müssen Sie von einem Gerät lesen, das bereit ist, ewig auf eine vermisste / zusätzliche Uhr zu warten.)
Jason S
1
@JasonS, das Audio ist nur Sprachqualität, 8KHz - ich verwende einen 128-us-Interrupt, um jedes 16-Bit-Sample auszugeben. Der I2C läuft auch auf einem eigenen Interrupt. Die Freizeit wird zum Auslesen von Daten von der SD-Karte verwendet. Ein guter Punkt, wenn es darum geht, dass beim Schreiben niemals eine Überbrückung auftritt. Mit Ausnahme von ADCs habe ich im Allgemeinen I2C für Ausgabegeräte verwendet. Wussten Sie jedoch, dass die schreibgeschützte Schnittstelle (2 Tasten, Beschleunigungsmesser und Joystick) zwischen der Wii-Fernbedienung und Wii Nunchuck (über ein 3-Zoll-Kabel) I2C bei 400 KHz ist? Viele Informationen im Web hacken diese Geräteschnittstelle.
Tcrosley
15

Im Allgemeinen ist SPI ein schnellerer Bus - die Taktfrequenz kann in einem Bereich von MHz liegen. SPI erfordert jedoch mindestens 3 Leitungen für die bidirektionale Kommunikation und eine zusätzliche Slave-Auswahl für jedes Gerät am Bus.

I2C benötigt nur 2 Leitungen, unabhängig davon, wie viele Geräte Sie haben (natürlich in Grenzen). Die Geschwindigkeit liegt jedoch im Bereich von kHz (100-400 kHz ist typisch).

Die meisten Mikrocontroller verfügen heutzutage über Hardware-Unterstützung für beide Busse, sodass beide gleich einfach zu bedienen sind.

Armandas
quelle
4
@Jason: Sie scheinen einige Vorurteile gegen IIC zu haben, aber es ist unfair, andere Leute deswegen zu betrügen. Sowohl IIC als auch SPI sind "einfach", wobei jede ihre eigenen Falten hat. SPI benötigt zusätzliche Leitungen, was nicht einfach sein kann. IIC ist etwas komplizierter, aber es ist immer noch einfach, alle Firmware-Implementierungen durchzuführen, die ich vielleicht mal gemacht habe. Es braucht nicht viel Code. Beide haben ihren Platz und beide sind leicht genug, um für niemanden, der weiß, was sie tun, ein Faktor zu sein.
Olin Lathrop
5
@Jason: Ich habe gerade nachgesehen, und mein generischer IIC-Code für die Firmware- Implementierung von IIC auf 8-Bit-PICs besteht nur aus 311 Zeilen, und wahrscheinlich sind mehr als die Hälfte davon Kommentare. Dadurch erhalten Sie eine prozedurale Schnittstelle zum IIC-Bus auf der Ebene der Routinen für Start, Put, Get, Stop usw. Große Sache. Ein Modul, das dieses zum Ansteuern eines einfachen EEPROM aufruft, besteht aus 272 Zeilen, wahrscheinlich wiederum aus 1/2 Kommentaren, und enthält einige Verwaltungsfunktionen auf hoher Ebene wie Standarddaten, UART-Debug-Schnittstelle usw. Dies ist alles so trivial, dass darüber gestritten wird, ob 10 Anweisungen weniger erforderlich sind als SPI ist sinnlos.
Olin Lathrop
2
@ Andrew Kohlsmith - I2C is designed for on-board applications.- Offensichtlich sind sich die Hersteller von I2C-Geräten nicht einig . Nimm den TMP100 . Auf der Produktseite heißt es ausdrücklich: The TMP100 and TMP101 are ideal for extended temperature measurement in a variety of communication, computer, consumer, environmental, industrial, and instrumentation applications.Gleiches gilt für den TMP75
Connor Wolf
5
@FakeName Du bist falsch; Ich habe 13 Jahre lang industrielle Leistungselektronik betrieben. (Das Starten und Überwachen von GROSSEN dreiphasigen Motoren ist eine SEHR laute Umgebung.) Es geht nicht darum, dass SPI zuverlässiger ist, es geht darum, das System mit allen geplanten und berücksichtigten Fehlermodi zu entwerfen und bei Bedarf Wiederherstellungsoptionen in das System zu integrieren. Ich habe noch nie einen Noise Spike bekommen, der meine I2C (oder SPI) -Kommunikation abbrach, aber ich habe mich auch nie ausschließlich auf den I2C-Controller verlassen, um alles für mich zu tun. Es geht um Planung und Design, nicht darum, dass ein Bus besser ist.
Akohlsmith
2
@akohlsmith: Single-Master-Single-Slave-I2C sollte mit einem "Bit-Bang" -Master robust sein. Wenn es mehrere Slaves gibt und zwei gleichzeitig auf unterschiedliche Weise "verwirrt" werden, kann der Bus unwiederbringlich blockiert werden (z. B. wenn zwei oder mehr Speicherchips, die beide mit Nullen gefüllt sind, glauben, dass der Master versucht, sie zu lesen, aber ihre Bitzähler out of sync sind, lassen sie jeder wird dann nur SDA in Zeiten , wenn der andere es zu behaupten, und nichts , was der Meister tun können , den Bus freigeben, es sei denn , es eine „hohe“ stark genug fahren , um alle Sklaven Overdrive.
supercat
12

SPI kann viel schneller als I2C ausgeführt werden (einige SPI-Geräte gehen über 60 MHz; ich weiß nicht, ob die "offizielle" I2C-Spezifikation Geräte über 1 MHz zulässt). Die Implementierung eines Slave-Geräts unter Verwendung eines der beiden Protokolle erfordert Hardware-Unterstützung, während beide die einfache Implementierung von "Software-Bit-Bang" -Mastern ermöglichen. Mit relativ minimaler Hardware kann ein I2C-kompatibler Slave erstellt werden, der auch dann ordnungsgemäß funktioniert, wenn der Host willkürlich entscheidet, den Bus für bis zu 500us gleichzeitig zu ignorieren, ohne dass zusätzliche Handshake-Drähte erforderlich sind. Zuverlässige SPI Betrieb jedoch auch mit Hardware - Unterstützung , erfordert in der Regel , dass man entweder einen Handshake Draht hinzufügen, oder aber , dass der Host „ von Hand“ eine Verzögerung nach jedem Byte gleich den Worst-Case - Reaktionszeit des Slave hinzufügen.

Wenn ich meine Druthers hätte, würde die SPI-Unterstützung der Controller einige einfache zusätzliche Funktionen enthalten, um bidirektionale 8-Bit-transparente Datenübertragungen zwischen Controllern mit Handshake- und Wake-up-Fähigkeiten unter Verwendung von insgesamt drei unidirektionalen Kabeln (Clock und MOSI [Master -out-slave-in] vom Master; MISO [master-in-slave-out] vom Slave). Im Vergleich dazu erfordert eine effiziente und zuverlässige Kommunikation zwischen Mikrocontrollern mit "serienmäßigen" SPI-Ports, wenn beide Prozessoren unabhängig voneinander für eine beliebige Zeitspanne verzögert werden, die Verwendung von viel mehr Drähten (Chip-Select, Clock, MISO und MOSI), um zu starten Wenn der Slave möglicherweise asynchron beginnt, Daten zu senden (z. B. weil jemand eine Taste gedrückt hat), muss entweder noch eine andere Leitung als "Wakeup" verwendet werden.

I2C bietet nicht alle Fähigkeiten, die mein "verbessertes" SPI haben würde, aber es bietet eingebaute Handshake-Fähigkeiten, die SPI nicht bietet, und in vielen Implementierungen kann es auch als Wake-up-Funktion angesehen werden, selbst wenn der Master a ist Software-Bit-Bang. Für die Kommunikation zwischen Prozessoren empfehle ich daher dringend I2C über SPI, außer wenn höhere Geschwindigkeiten erforderlich sind, als SPI liefern kann, und die Verwendung zusätzlicher Pins akzeptabel ist. Für Interprozessor-Kommunikationen, bei denen eine geringe Pin-Anzahl erforderlich ist, können UARTs diese sehr empfehlen.

Superkatze
quelle
Es gibt eine Hochgeschwindigkeitsversion von I2C, die 1 MHz zulässt. normaler I2C ist 400kHz.
Der Widerstand
@TheResistance: Ich weiß, dass normaler I2C 400 kHz war, aber Versionen wurden bis zu 1 MHz spezifiziert. Was ich nicht weiß ist, ob schnellere Versionen angegeben wurden.
Supercat
Laut Spezifikation ist 400 kbit / s (nicht kHz, ich habe dort die falschen Einheiten verwendet) Fast-Mode, 1 Mbit / s ist Fast-Mode Plus, und es gibt einen High-Speed-Modus mit bis zu 3,4 Mbit / s. Ultraschnell geht bis zu 5 Mbit / s, ist aber unidirektional.
Der Widerstand
@TheResistance: Danke. Ich hatte noch nie von diesen späteren Versionen gehört. Was genau meinst du mit "unidirektional"? Ich weiß, dass die Geschwindigkeit der SPI-Kommunikation von Slave zu Master schneller sein kann als die von Master zu Slave, da der Slave garantiert seine Uhr nach dem Master erhält, aber ich bin mir nicht sicher, ob es ein gleichwertiges Konzept für I2C gibt. Hast du einen Linky?
Supercat
Finden Sie die spec hier . Auf Seite 23 heißt es, dass Ultra-Fast für Geräte verwendet werden kann, die keine Daten zurücksenden (nur Schreiben), nicht einmal ACK.
Der Widerstand
8

Diese Frage wurde in den hervorragenden Antworten hier gründlich untersucht, aber vielleicht gibt es noch einen weiteren Gesichtspunkt für I 2 C, den ich aus der Sicht eines Chipherstellers anbieten könnte.

Die elektrische Schnittstelle des I 2 C ist ein offener Kollektor . Jetzt atme und denke über die Auswirkungen nach. Mit I 2 C kann ich einen Chip entwerfen, der völlig unabhängig von der Betriebsspannung des Busses ist. Alles, was ich tun muss, ist, die SDA-Leitung nach unten zu ziehen, wenn es mir gefällt, und die Spannungen von SCL und SDA mit einer auf Masse bezogenen Schwellenspannung zu vergleichen, die ich wählen kann. Und wenn ich die normalen High-Side-Schutzstrukturen weglasse und durch andere Strukturen ersetze, kann ich einen Chip herstellen, der völlig unabhängig vom Rest des Systems sein eigenes Leben führen kann - SCL, SDA speisen niemals Strom in meinen Chip und ich Mit Sicherheit wird diesen Pins kein Strom zugeführt. Das ist der Grund, warum es so ein schöner Bus für Echtzeituhren und andere Sachen mit geringem Stromverbrauch ist.

PkP
quelle
4

Eine Sache, die ich in den anderen Antworten nicht gesehen habe, ist, dass I2C mehrere Master am selben Bus unterstützt. Wenn Sie bidirektionale Kommunikation benötigen und keine abrufbasierte Methode verwenden möchten, erledigt I2C die Aufgabe.

Über größere Entfernungen verfügt CAN über die gleichen Fähigkeiten und ist robuster. Bei CAN handelt es sich jedoch um ein asynchrones Protokoll, für das Hardware-Unterstützung und ein Transceiver erforderlich sind. In einem kostengünstigen System ist dies möglicherweise keine Option.

Adam Haun
quelle
Guter Punkt (auf Multi-Master), ich habe auch SPI-Geräte mit Interrupt-Pins gesehen, während ein Gerät immer noch der Master ist, können beide die (bidirektionale) Kommunikation instanziieren. Für entfernte Geräte gibt es natürlich solidere und bessere Optionen (wie z. B. CAN).
Paul
0

Verwenden Sie das SPI-Protokoll und schreiben Sie Ihre Bits immer dann direkt in das Gerät, wenn die Synchronisationszeit ansteigt. Die xnor-Logikschaltung kann verwendet werden, um die "hausgemachte" Adresse aus einem Speicher abzugleichen, um das gewünschte Gerät auszuwählen, als ob es ein i2c-Gerät wäre.

Der i2c integriert den Autorenkreislauf in das Format des Geräts, Standard ... usw. sind komplex und unterschiedlich. Mit einem SPI können Sie einen SPI-Speicher verwenden, um ein Video auf dem Bildschirm anzuzeigen, nicht jedoch i2c.

lansuperman
quelle