SPI oder I²C?
Wenn Ihrem Mikrocontroller eine Funktion fehlt, gibt es sicher irgendeinen Chip mit SPI oder I²C, der genau diese Funktion bietet. Egal was fehlt – ob es an Flash- oder SRAM-Speicher mangelt, Sie Temperatur messen oder ein digitales Potentiometer anbinden möchten – es gibt sicher eine Lösung. Wie entscheiden Sie sich, wenn Sie zwischen SPI oder I²C wählen können?
Wenn Ihrem Mikrocontroller eine Funktion fehlt, gibt es sicher irgendeinen Chip mit SPI oder I²C, der genau diese Funktion bietet. Egal was fehlt – ob es an Flash- oder SRAM-Speicher mangelt, Sie Temperatur messen oder ein digitales Potentiometer anbinden möchten – es gibt sicher eine Lösung.
Wie entscheiden Sie sich, wenn Sie zwischen SPI oder I²C wählen können?
Beide Schnittstellen wurden in den 1980er Jahren entwickelt und dienen zur Kommunikation zwischen integrierten ICs auf Platinenebene. Tatsächlich steht I²C für „Inter-Integrated Circuit“. Die Schnittstellen sind synchron, eines der ICs den Takt liefert. Dadurch wird klar gestellt, zu welchem Zeitpunkt jedes übertragene Datenbit gültig ist.
Im Gegensatz zu den zur Fernkommunikation gedachten seriellen Schnittstellen wie RS-485 oder CAN benötigen weder I²C noch SPI einen Transceiver. Daher ist es für Chipdesigner recht einfach, sie sowohl in Mikrocontroller als auch in die Vielzahl von Peripherie-Chips zu integrieren. Dies erklärt die Verbreitung dieser Schnittstellen.
Chips oder kleine Platinen benötigen deshalb für den Anschluss an einen Mikrocontroller oder ein entsprechendes Board nur vier Pins: SDA, SCL, Stromversorgung und Masse. Einige Module sind in winzigen Ausführungen verfügbar, die kaum größer als der Chip selbst sind. Dies wirft einige Fragen auf: Woher weiß ein Sklave, ob mit ihm gesprochen wird? Und sollte er dann Daten empfangen oder senden?
Die Adressierung kann bei I²C durchaus herausfordernd sein. Viele Slave-Chips sind mit einer festen Adresse programmiert. Wenn Sie vier Temperatursensoren an eine Platine anschließen möchten, können aber nicht alle dieselbe Adresse verwenden. Einige Peripherie-Chips umgehen dies, indem sie zusätzliche Pins bereitstellen, die über Pull-Up- oder Pull-Down-Widerstände oder Brücken die Auswahl einer Adresse aus einem kleinen Bereich ermöglichen. Der achtpolige Temperatursensor MCP9800 von Mikrochip erlaubt Adressen von 0x48 bis 0x4F.
Doch auch der volle 7-bit-Adressraum erlaubt noch immer nicht, 127 Geräte an einen I²C-Master anzuschließen. Die Gesamtkapazität des Busses ist nämlich per Definition auf 400 pF begrenzt. Dies reicht etwa für 20 Geräte aus.
Das Protokoll erfordert auch ein Start- und Stoppbit, mit denen jede Nachricht anfängt und endet. Zusätzlich muss jedes Datenbyte entweder mit einem ACK oder einem NACK bestätigt werden. Dies führt dazu, dass für jedes übertragene Datenbyte neun Taktimpulse benötigt werden.
Die I²C-Spezifikation enthält in Kapitel 7 zwei Gleichungen, die obere und untere Grenzwerte angeben. Der obere Grenzwert hängt von der maximal zulässigen Signalanstiegszeit (1000 ns bei 100 kHz, 300 ns bei 400 kHz) und der Bus-Gesamtkapazität ab. Die untere Grenze hängt von der Versorgungsspannung, dem maximalen Low-Pegel (typischerweise 0,4 V) und dem Ausgangsstrom (typischerweise 3 mA) ab. Somit kann der Pull-up-Widerstand bei einem 5-V-System mit einem Takt von 100 kHz- und einer kapazitiven Last von 50 pF zwischen 23,6 und 1,5 kΩ liegen.
Wie entscheiden Sie sich, wenn Sie zwischen SPI oder I²C wählen können?
Beide Schnittstellen wurden in den 1980er Jahren entwickelt und dienen zur Kommunikation zwischen integrierten ICs auf Platinenebene. Tatsächlich steht I²C für „Inter-Integrated Circuit“. Die Schnittstellen sind synchron, eines der ICs den Takt liefert. Dadurch wird klar gestellt, zu welchem Zeitpunkt jedes übertragene Datenbit gültig ist.
Im Gegensatz zu den zur Fernkommunikation gedachten seriellen Schnittstellen wie RS-485 oder CAN benötigen weder I²C noch SPI einen Transceiver. Daher ist es für Chipdesigner recht einfach, sie sowohl in Mikrocontroller als auch in die Vielzahl von Peripherie-Chips zu integrieren. Dies erklärt die Verbreitung dieser Schnittstellen.
Was ist I²C?
I²C wurde von Philips Semiconductors (jetzt als NXP firmierend) definiert und ist ein Halbduplex-Kommunikationsstandard. Es werden nur zwei Pins verwendet: eine für den seriellen Takt (SCL) und eine für die seriellen Daten (SDA) gedachte bidirektionale Datenleitung. Ein Basissystem besteht normalerweise aus einem Mikrocontroller als Master, an den u.U. mehrere Slave-Chips angeschlossen sind. Die Details wurden z. B. hier in Elektor schon ausführlich beschrieben.Chips oder kleine Platinen benötigen deshalb für den Anschluss an einen Mikrocontroller oder ein entsprechendes Board nur vier Pins: SDA, SCL, Stromversorgung und Masse. Einige Module sind in winzigen Ausführungen verfügbar, die kaum größer als der Chip selbst sind. Dies wirft einige Fragen auf: Woher weiß ein Sklave, ob mit ihm gesprochen wird? Und sollte er dann Daten empfangen oder senden?
Wie viele Geräte kann I²C unterstützen?
Die meisten I²C-Chips unterstützen eine 7-bit-Adresse. Der Master sendet die Adresse zusammen mit einem achten Bit über den Bus. Das achte Bit entscheidet darüber, ob es sich bei dieser Message um eine Lese- oder Schreibanforderung handelt. Auf eine Schreibanforderung folgen ein oder mehrere Datenbytes. Slave-Chips antworten beim Empfang einer Leseanforderung mit einem oder mehreren Datenbytes.Die Adressierung kann bei I²C durchaus herausfordernd sein. Viele Slave-Chips sind mit einer festen Adresse programmiert. Wenn Sie vier Temperatursensoren an eine Platine anschließen möchten, können aber nicht alle dieselbe Adresse verwenden. Einige Peripherie-Chips umgehen dies, indem sie zusätzliche Pins bereitstellen, die über Pull-Up- oder Pull-Down-Widerstände oder Brücken die Auswahl einer Adresse aus einem kleinen Bereich ermöglichen. Der achtpolige Temperatursensor MCP9800 von Mikrochip erlaubt Adressen von 0x48 bis 0x4F.
Doch auch der volle 7-bit-Adressraum erlaubt noch immer nicht, 127 Geräte an einen I²C-Master anzuschließen. Die Gesamtkapazität des Busses ist nämlich per Definition auf 400 pF begrenzt. Dies reicht etwa für 20 Geräte aus.
Wie schnell ist I²C?
I²C-Geräte arbeiten normalerweise mit Taktfrequenzen von 100 oder 400 kHz. Dank einer Erweiterung der Spezifikation erlauben moderne Chips auch einen Takt von 5 MHz. Nach heutigen Maßstäben sind selbst diese höheren Geschwindigkeiten nicht besonders beeindruckend und der reale Datendurchsatz ist leider etwas langsamer. Da die Geräteauswahl und die Lese/Schreibsteuerung seriell erfolgen (Steuerdaten werden auf demselben Kanal wie die eigentlichen Daten gesendet), wird ein Teil der verfügbaren Bandbreite davon aufgefressen.Das Protokoll erfordert auch ein Start- und Stoppbit, mit denen jede Nachricht anfängt und endet. Zusätzlich muss jedes Datenbyte entweder mit einem ACK oder einem NACK bestätigt werden. Dies führt dazu, dass für jedes übertragene Datenbyte neun Taktimpulse benötigt werden.
Wie berechne ich Pull-up-Widerstände für I²C?
Im Gegensatz zu typischen I/O-Pins für Mikrocontroller sind I²C-Pins als Open-Collector ausgeführt. Dadurch sind Pull-up-Widerstände notwendig, um das Signal auf die Versorgungsspannung hochzuziehen. Ohne Pull-ups funktioniert der Bus nicht. Eine häufige Frage lautet: Wie berechne ich den richtigen Widerstandswert?Die I²C-Spezifikation enthält in Kapitel 7 zwei Gleichungen, die obere und untere Grenzwerte angeben. Der obere Grenzwert hängt von der maximal zulässigen Signalanstiegszeit (1000 ns bei 100 kHz, 300 ns bei 400 kHz) und der Bus-Gesamtkapazität ab. Die untere Grenze hängt von der Versorgungsspannung, dem maximalen Low-Pegel (typischerweise 0,4 V) und dem Ausgangsstrom (typischerweise 3 mA) ab. Somit kann der Pull-up-Widerstand bei einem 5-V-System mit einem Takt von 100 kHz- und einer kapazitiven Last von 50 pF zwischen 23,6 und 1,5 kΩ liegen.
Rpull-up(max) = tr ÷ (0,8473 × Cb) = 1000 ns ÷ (0,8473 × 50 pF) = 23,6 kΩ
mit tr = 1,000 ns @ 100 kHz oder 300 s @ 400 kHz, und Cb = gesamte Bus-Kapazität.
Rpull-up(min) = ( VDD – VOL(max) ) ÷ IOL = ( 5,0 V – 0,4 V) ÷ 3 mA = 1,5 kΩ
mit VOL(max) = 0,4 V, und IOL = 3 mA für 100- und 400-kHz-Betrieb.
Die I²C-Spezifikation enthält Gleichungen zur Berechnung des maximalen und minimalen Werte der Pull-up-Widerstände.mit tr = 1,000 ns @ 100 kHz oder 300 s @ 400 kHz, und Cb = gesamte Bus-Kapazität.
Rpull-up(min) = ( VDD – VOL(max) ) ÷ IOL = ( 5,0 V – 0,4 V) ÷ 3 mA = 1,5 kΩ
mit VOL(max) = 0,4 V, und IOL = 3 mA für 100- und 400-kHz-Betrieb.