3.23. I2C-Grundlagen

I2C (Inter-Integrated Circuit, ausgesprochen „I-Quadrat-C“ oder „I-zwei-C“) ist ein Zweidraht-Serienbus für Verbindungen kurzer Reichweite zwischen Chips auf demselben Board. Er liegt in seinen Prioritäten zwischen SPI und UART: langsamer als SPI, aber sparsamer mit Pins, und adressiert (mehrere Geräte auf denselben zwei Drähten), wo SPI pro Gerät eine eigene CS-Leitung braucht.

I2C ist der Bus der Wahl für Sensoren mit niedriger Datenrate – Beschleunigungssensoren, Temperatursensoren, Feuchtesensoren, Magnetometer, Echtzeituhren, EEPROMs – bei denen es mehr auf das Einsparen von Pins und Buskomplexität ankommt als auf den reinen Durchsatz.

3.23.1. Zwei Drähte, beide Open-Drain

Ein I2C-Bus hat nur zwei Signale:

  • SCL (serieller Takt). Wird (meistens) vom Controller getrieben.

  • SDA (serielle Daten). Wird von dem Gerät getrieben, das gerade spricht – dem Controller während der Adresse und der ausgehenden Daten, dem Peripheriegerät während Lesevorgängen und ACK-Bits.

Beide Leitungen sind Open-Drain: Jedes Gerät am Bus kann die Leitung auf Masse ziehen, treibt sie aber niemals High. Zwei Pull-up-Widerstände am Bus (typischerweise 2.2 bis 10 zur Versorgungsschiene) ziehen die Leitungen High, wenn niemand sie auf Low zieht. Das Wired-OR-Verhalten ergibt sich daraus – jedes Gerät, das die Leitung auf Low zieht, gewinnt, und der High-Zustand bedeutet einfach „niemand spricht“.

Die internen Pull-ups des MCU an seinen SCL- und SDA-Pins sind in der Regel nicht stark genug, um allein als Bus-Pull-ups zu dienen; externe Widerstände am Bus werden normalerweise benötigt. Viele Sensor-Breakout-Boards enthalten sie bereits; prüfen Sie das Datenblatt, bevor Sie weitere hinzufügen.

3.23.2. Die Transaktion

Jede I2C-Transaktion folgt derselben Struktur:

SCL- und SDA-Signalverläufe. SDA fällt, während SCL High ist (START), dann taktet SCL Bytes auf SDA -- ein 7-Bit- Adressbyte mit einem Lese-/Schreibbit und einem ACK, dann ein Registerbyte und ein ACK, dann ein Datenbyte und ein NACK, dann steigt SDA, während SCL High ist (STOP).

Eine I2C-Transaktion: START, 7-Bit-Adresse + R/W, ACK, Register, ACK, Daten, NACK, STOP.

Der Austausch entfaltet sich Bit für Bit:

  • START. Der Controller zieht SDA auf Low, während SCL noch High ist. Diese ungewöhnliche Flanke teilt jedem Gerät am Bus mit, dass eine Transaktion beginnen wird.

  • Adresse + R/W. Der Controller taktet eine 7-Bit-Peripherieadresse gefolgt von einem Lese-/Schreibbit heraus (0 für Schreiben, 1 für Lesen).

  • ACK / NACK. Nach jedem Byte treibt der Empfänger SDA für einen Takt, um ein ACK (Low) oder NACK (High) zu geben. Beim Adressbyte bestätigt das Peripheriegerät mit ACK, wenn es seine eigene Adresse erkennt; bestätigt kein Gerät, sieht der Controller ein NACK und weiß, dass die Adresse nicht am Bus ist.

  • Datenbytes. Auf jedes folgt ein ACK vom Empfänger. Bei einem Schreibvorgang bestätigt das Peripheriegerät jedes Byte; bei einem Lesevorgang bestätigt der Controller jedes Byte, von dem er mehr möchte, und gibt beim letzten Byte ein NACK, um dem Peripheriegerät das Stoppen mitzuteilen.

  • STOP. Der Controller gibt SDA auf High frei, während SCL High ist, und beendet damit die Transaktion.

Ein wiederholter Start (Repeated Start) ist ein zweites START, das ohne dazwischenliegendes STOP ausgegeben wird – der Controller wechselt die Richtung (Schreibadresse, dann Leseadresse) beim selben Peripheriegerät, ohne den Bus freizugeben.

3.23.3. Adressierung

Der 7-Bit-Adressraum deckt 0x080x77 ab; die Werte an den Enden sind für besondere Zwecke reserviert. Die Adresse jedes Geräts wird vom Chipdesigner festgelegt; bei vielen Bauteilen lassen sich einige der niedrigen Bits auf Board-Ebene ändern (durch Verbinden eines Pins mit High oder Low), sodass zwei gleiche Sensoren am selben Bus sitzen können.

Teilen sich zwei Geräte eine Adresse, gibt es keine Möglichkeit, mit einem von ihnen zu sprechen, ohne dass das andere stört; prüfen Sie daher das Datenblatt, bevor Sie Bauteile paaren. i2c.scan() (behandelt unter I2C im Code) durchläuft den Adressraum und meldet, welche Adressen antworten, was die übliche Methode ist, um herauszufinden, was sich am Bus befindet.

3.23.4. Stärken und Schwächen

Die Stärken und Schwächen des Busses legen seine Nische fest:

  • Zwei Pins für viele Geräte. Ein einzelnes SCL/SDA-Paar kann ein Dutzend Sensoren tragen. SPI würde einen zusätzlichen CS-Pin pro Gerät benötigen.

  • Standardgeschwindigkeiten. 100 kHz („Standard Mode“) und 400 kHz („Fast Mode“) decken nahezu jeden Sensor ab. 1 MHz ist erreichbar, stellt aber höhere Anforderungen an die Buskapazität und die Dimensionierung der Pull-ups.

  • Langsam im Vergleich zu SPI. Alles, was mehr als ein paar hundert Kilobit pro Sekunde bewegt, verlangt stattdessen nach SPI.

  • Adresskonflikte. Zwei Geräte mit derselben Adresse an einem Bus sind ein Hardwarefehler, den das Protokoll nicht umgehen kann.