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.
 

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.

 
MCP9800 I2C temperature sensor on circuit board
Der I²C-Temperatursensor MCP9800
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 t = 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.

Was ist SPI?

SPI ist ein Akronym von „Serial Peripheral Interface“. Diese Schnittstelle wurde von Motorola entwickelt und z. B. in diesem Elektor-Artikel genauer beschrieben. Hier werden drei Pins verwendet: SCLK für den vom Master-Gerät generierten Takt und zusätzlich zwei unidirektionale Datenleitungen. MOSI (Master Out Slave In) sendet Daten vom Master an die Slaves. Bei MISO (Master In Slave Out), empfängt der Master die Daten von den Slaves. Auf diese Weise kann ein Slave Daten parallel zum Empfang an den Master zurückgeben.

Wie viele Geräte unterstützt SPI?

TC77 connected to microcontroller via SPI
Der Temperatursensor TC77 angebunden via SPI. 
Für mehr als einen angeschlossenen Slave ist ein Out-of-Band-Auswahlmechanismus implementiert, um den richtigen Chip auszuwählen. Für jedes an den Mikrocontroller angeschlossenen SPI-Chip ist ein SS-Signal (Slave Select, aktiv low ) erforderlich. Ein Mikrocontroller benötigt daher 3 + N Pins zur Unterstützung von SPI, wobei N der Anzahl adressierbarer Slaves entspricht. SPI belegt also deutlich mehr Pins des Mikrocontrollers als I²C.

Wie schnell ist SPI und wo ist die Spezifikation?

Die SPI-Schnittstelle wurde nie wirklich standardisiert. Aus diesem Grund gibt es dafür etliche Bezeichnungen. Unklarheiten bezüglich des Ruhezustands bei SCLK und der Gültigkeit der steigenden oder Fallenden Flanke des Takts für die Datenbits können die Konfiguration erschweren. Etliche Chips unterstützen jedoch Taktraten von vielen Megahertz. In Verbindung mit dem effizienten Vollduplex-Kommunikationsprotokoll ist SPI einfach schneller als I²C. Dies wird z. B. wichtig, wenn man die Daten in einem externen EEPROM zum Booten eines Mikroprozessors verwendet oder wenn es um Firmware-Updates per Funk (OTA) geht.
 
Comparison of 16-bit read using SPI and I2C
I²C (oben) benötigt für ein gelesenes 16-Bit-Register etwa doppelt so lange wie SPI (unten) bei der gleichen Taktfrequenz.

Welche Schnittstelle soll ich verwenden?

Die Entscheidung, ob I²C anstelle von SPI gewählt wird, ist nicht einfach. Viele Faktoren spielen eine Rolle. Zu bedenken sind Aspekte wie Datendurchsatz und Geräteverfügbarkeit oder auch der Stromverbrauch des Systems. SPI ist definitiv schneller. Das Lesen eines 12-bit-Temperaturwerts von einem Sensor ist bei gleicher Taktfrequenz fast doppelt so schnell als bei I²C. Mit SPI kann man auch genau die relevanten 12 bit lesen – bei I²C müssen hierfür zwei 8-bit-Lesevorgänge erfolgen. Wenn der Mikrocontroller jedoch über nur wenige freie Pins verfügt und ein Sub-MHz-Takt für Ihre Anwendung schnell genug ist, ist ein Chip via I²C einfacher anzubinden.