I²C: Ein Bus, zwei Leitungen, viele Sensoren

https://bildung.social/@oerinformatik/

https://oer-informatik.de/i2c-bus

I²C, Bussystem, Mikrocontroller, Pull-up-Widerstand, Open-Drain, I²C-Adresse, Wire-Bibliothek, ESP32, ESP8266, Arduino, BME280, Logic-Analyzer

tl/dr; (ca. 30 min Lesezeit): I²C verbindet einen Mikrocontroller über nur zwei Leitungen mit vielen Sensoren, Displays und Speicherbausteinen. Du lernst die Kennzeichen des Busses kennen: Open-Drain-Leitungen mit Pull-up-Widerständen, Adressen statt Auswahlleitungen, Bestätigung jedes Bytes und Taktraten von 100 kHz bis 1 MHz. Du liest ein I²C-Telegramm, bemisst Pull-up-Widerstände und schließt Bausteine an Arduino, ESP8266 und ESP32 an – mit einer Checkliste, was Du vorher im Datenblatt und in der Bibliotheksdokumentation prüfen solltest [AI-Assisted]. (Zuletzt geändert am 03.11.2026)

Disclaimer: Teile des Textes stammen von einer KI. Inhalte sind nicht automatisch zuverlässig; überprüfe Fakten und zitiere vertrauenswürdige Quellen.

Dieser Artikel ist Teil einer Artikelreihe zu Hardware-Schnittstellen von Mikrocontrollern: I²C / SPI

Schon fit in diesem Thema? Nutze die Kann-Liste und die Leitfragen unter dem Artikel als Checkliste, ob Du die relevanten Kompetenzen bereits hast.

Als I²C-Grundlagen kann ich nach Durchlesen des Artikels…

  • … die Kennzeichen von I²C nennen (synchron, seriell, halbduplex, adressiert, Bestätigung je Byte) und I²C von anderen Schnittstellen unterscheiden.

  • … die Leitungen SDA und SCL benennen und erklären, warum I²C Open-Drain-Ausgänge und Pull-up-Widerstände braucht.

  • … den Aufbau eines I²C-Telegramms mit Start, Adressbyte, R/W-Bit, ACK/NACK, Daten und Stopp beschreiben und ein Impulsdiagramm lesen.

  • … aus einer 7-Bit-Adresse das Adressbyte zum Schreiben und Lesen bestimmen und Adresskonflikte erkennen.

  • … die Geschwindigkeitsklassen von I²C nennen und die Übertragungsdauer eines Registerzugriffs abschätzen.

  • … einen I²C-Baustein an Arduino Uno, ESP8266 oder ESP32 anschließen, mit einem I²C-Scanner finden und mit der Wire-Bibliothek ansprechen.

  • … vor dem Anschluss eines Sensors oder Aktors anhand von Datenblatt und Bibliotheksdokumentation prüfen, ob Schnittstelle, Versorgung, Pegel, Takt, Umgebungsbedingungen und Speicherbedarf passen.

Darüber hinaus kann ich als I²C-Expertenwissen…

  • … Pull-up-Widerstände aus Versorgungsspannung, Low-Strom, Anstiegszeit und Buskapazität berechnen und die Pull-ups mehrerer Module beurteilen.

  • … Busse mit 3,3-V- und 5-V-Teilnehmern mit einem bidirektionalen Pegelwandler planen.

  • … typische Fehlerbilder am I²C-Bus systematisch eingrenzen, auch mit einem Logic-Analyzer.

Eine kleine Wetterstation auf dem Schulhof: Ein ESP32 misst mit einem BME280 Temperatur, Luftfeuchte und Luftdruck, zeigt die Werte auf einem OLED-Display an und schaltet über eine Port-Erweiterung Leuchtdioden. Drei Bausteine, aber am Mikrocontroller sind dafür nur zwei Datenleitungen belegt. Möglich macht das der I²C-Bus (gesprochen „I-Quadrat-C“, englisch „I-squared-C“; Abkürzung für Inter-Integrated Circuit, oft auch als I2C oder IIC geschrieben). Er ist die wohl verbreitetste Schnittstelle, wenn ein Mikrocontroller mit Sensoren, Displays, Echtzeituhren oder Speichern auf derselben Platine oder im selben Gehäuse spricht.

I²C-Bus: ein ESP32 als Controller mit zwei Pull-up-Widerständen an 3,3 V, daran an SDA und SCL ein BME280 (Adresse 0x76), ein SSD1306-OLED-Display (0x3C) und eine PCF8574-Port-Erweiterung (0x20), alle mit gemeinsamer Masse (mit KI erstellt)

Steckbrief: Was I²C ausmacht

I²C wurde 1982 von Philips entwickelt, um die Chips in Fernsehgeräten mit wenigen Leitungen zu verbinden. Heute pflegt NXP die Spezifikation (UM10204, I²C-bus specification and user manual, Rev. 7 von 2021). Seit dieser Revision heißen die Rollen Controller (früher Master) und Target (früher Slave). In Datenblättern, Bibliotheken und älteren Unterlagen begegnen Dir meist noch die alten Begriffe; gemeint ist dasselbe.

Steckbrief I²C
Merkmal I²C
Übertragung seriell, Bit für Bit über eine Datenleitung
Takt synchron: Der Controller liefert den Takt auf einer eigenen Leitung (SCL)
Richtung halbduplex: Daten fließen abwechselnd in beide Richtungen über dieselbe Leitung (SDA)
Leitungen 2 Signalleitungen (SDA, SCL) plus gemeinsame Masse, unabhängig von der Zahl der Teilnehmer
Auswahl der Teilnehmer über eine 7-Bit-Adresse im Telegramm (selten 10 Bit)
Ausgangsstufen Open-Drain bzw. Open-Collector, High-Pegel über Pull-up-Widerstände
Bestätigung jedes Byte wird vom Empfänger mit ACK bestätigt (oder mit NACK abgelehnt)
Geschwindigkeit typisch 100 kHz (Standard Mode) und 400 kHz (Fast Mode), bis 1 MHz (Fast Mode Plus)
Reichweite für kurze Strecken auf der Platine gedacht; begrenzt durch die Buskapazität von höchstens 400 pF
Mehrere Controller möglich (Multi-Master mit Arbitrierung), in der Praxis selten genutzt

Was I²C von den anderen Schnittstellen eines Mikrocontrollers unterscheidet:

  • Adressen statt Auswahlleitungen: Alle Teilnehmer hängen parallel an denselben zwei Leitungen. Wen der Controller meint, steht im ersten Byte jedes Telegramms. Ein weiterer Sensor kostet daher keinen zusätzlichen Pin am Mikrocontroller – bei SPI braucht jedes Gerät eine eigene Auswahlleitung.

  • Quittung für jedes Byte: Nach jedem Byte meldet der Empfänger mit einem Bestätigungsbit (Acknowledge, ACK), dass er es erhalten hat. Antwortet niemand, merkt der Controller das sofort. Darauf beruht auch der I²C-Scanner, mit dem Du später alle Teilnehmer am Bus findest.

  • Wired-AND auf beiden Leitungen: Kein Teilnehmer treibt eine Leitung aktiv auf HIGH. Dadurch kann ein langsames Target den Takt anhalten (Clock Stretching), und zwei Controller können erkennen, dass sie gleichzeitig senden (Arbitrierung).

I²C hat einige Verwandte, die Dir in Datenblättern begegnen: TWI (Two-Wire Interface) ist der Name, den Atmel/Microchip für dieselbe Schnittstelle in den AVR-Mikrocontrollern des Arduino Uno verwendet. SMBus (System Management Bus, z. B. für Akkus und Mainboards) baut auf I²C auf, legt aber engere Pegel- und Zeitgrenzen fest. Und hinter den Steckverbindern Qwiic (SparkFun) und STEMMA QT (Adafruit) steckt ein vierpoliger I²C-Anschluss mit 3,3 V, mit dem sich Breakout-Module ohne Löten verketten lassen.

Leitungen und Potenziale

Ein I²C-Anschluss besteht aus vier Leitungen:

Leitungen eines I²C-Anschlusses
Leitung Bedeutung Aufgabe
SDA Serial Data Datenleitung, beide Richtungen
SCL Serial Clock Taktleitung, vom Controller erzeugt
GND Masse gemeinsames Bezugspotenzial
VCC / VDD Versorgung 3,3 V oder 5 V, je nach Baustein

Auf Breakout-Modulen, die neben I²C auch SPI beherrschen, heißen die Anschlüsse oft doppelt: „SDA/SDI“ und „SCL/SCK“.

Open-Drain und Pull-up: Warum niemand HIGH treibt

Die Ausgänge aller I²C-Teilnehmer sind Open-Drain-Ausgänge (bei bipolaren Transistoren Open-Collector): Ein Transistor kann die Leitung nach Masse ziehen (LOW) oder sperren. Einen Transistor nach oben, der die Leitung aktiv auf HIGH treibt, gibt es nicht. Den HIGH-Pegel stellt ein Pull-up-Widerstand R_\mathrm{P} her, der jede Leitung mit der Versorgungsspannung verbindet.

Open-Drain-Prinzip: Ein Pull-up-Widerstand zieht die Busleitung auf V_DD; Teilnehmer A sperrt, Teilnehmer B leitet, deshalb fließt Strom über R_P und B nach GND und die Leitung ist Low; Wahrheitstabelle der Wired-AND-Verknüpfung (mit KI erstellt)

Sobald irgendein Teilnehmer seinen Transistor einschaltet, ist die Leitung LOW. Nur wenn alle sperren, ist sie HIGH. Das entspricht einer UND-Verknüpfung der einzelnen Ausgänge, die allein durch die Verdrahtung entsteht: Wired-AND. Zwei Vorteile ergeben sich daraus:

  • Es gibt keinen Kurzschluss, wenn zwei Teilnehmer gleichzeitig senden. Bei Gegentaktausgängen würde der eine nach 3,3 V treiben und der andere nach Masse.

  • Jeder Teilnehmer kann jederzeit „mithören“, ob der Pegel auf der Leitung dem entspricht, was er selbst ausgeben wollte. Darauf beruhen Clock Stretching und Arbitrierung.

Die Kehrseite: Der Übergang von LOW nach HIGH ist langsam. Die Leitung bildet mit allen angeschlossenen Eingängen und der Verdrahtung eine Kapazität, die nur über den Pull-up-Widerstand geladen wird. Deshalb ist I²C langsamer als SPI, und deshalb kommt es auf die richtige Größe von R_\mathrm{P} an.

Fehlen die Pull-ups ganz, funktioniert der Bus nicht: Die Leitungen bleiben auf LOW oder „schweben“ undefiniert. Viele fertige Module (BME280-, OLED- oder RTC-Breakouts) haben bereits Pull-ups an Bord, meist 4,7 kΩ oder 10 kΩ. Die internen Pull-ups der Mikrocontroller (bei AVR etwa 20 bis 50 kΩ, beim ESP32 um 45 kΩ) sind für mehr als ein paar Zentimeter Leitung zu hochohmig.

Pegel und gemeinsame Masse

I²C legt die Pegel nicht als feste Spannungen fest, sondern relativ zur Versorgungsspannung V_\mathrm{DD}: Als LOW gilt sicher alles unter 0{,}3 \cdot V_\mathrm{DD}, als HIGH alles über 0{,}7 \cdot V_\mathrm{DD}. Bei 3,3 V sind das 0,99 V und 2,31 V, bei 5 V 1,5 V und 3,5 V. Daraus folgen zwei Regeln:

  • Alle Teilnehmer brauchen ein gemeinsames Bezugspotenzial. Die Pegel auf SDA und SCL werden gegen Masse gemessen; ohne verbundene GND-Leitungen sind sie bedeutungslos. I²C ist nicht galvanisch getrennt. Wird eine Trennung gebraucht, etwa zu einem Sensor an einer anderen Stromversorgung, gibt es dafür I²C-Isolatoren (z. B. ISO1540).

  • 3,3 V und 5 V nicht einfach mischen. Ziehen die Pull-ups eines 5-V-Moduls den Bus auf 5 V, liegen an den Pins eines ESP32 oder ESP8266 5 V an. Beide sind laut Hersteller nicht für 5 V an den GPIO-Pins ausgelegt. Umgekehrt erkennt ein 5-V-Baustein mit der Schwelle 0{,}7 \cdot 5\ \mathrm{V} = 3{,}5\ \mathrm{V} einen 3,3-V-Pegel nicht sicher als HIGH.

Die saubere Lösung für gemischte Busse ist ein bidirektionaler Pegelwandler mit einem MOSFET je Leitung (Schaltung nach NXP-Applikationsschrift AN10441, als fertiges Modul meist mit dem Transistor BSS138). Er besitzt auf jeder Seite eigene Pull-ups an 3,3 V bzw. 5 V und funktioniert in beide Richtungen, weil I²C nur LOW aktiv treibt. Spezielle ICs wie der PCA9306 erledigen das ebenfalls. Viele Breakout-Module für 5-V-Systeme bringen einen Spannungsregler und einen solchen Pegelwandler bereits mit – das Datenblatt des Moduls (nicht nur des Chips) verrät es.

Pull-up-Widerstände bemessen

Für den Pull-up-Widerstand gibt es eine untere und eine obere Grenze.

Untere Grenze – der Low-Strom: Zieht ein Teilnehmer die Leitung auf LOW, fließt der Strom I = (V_\mathrm{DD} - V_\mathrm{OL}) / R_\mathrm{P} durch seinen Transistor. Im Standard und Fast Mode darf ein Ausgang höchstens 3 mA aufnehmen und muss dabei unter V_\mathrm{OL} = 0{,}4\ \mathrm{V} bleiben:

R_\mathrm{P,min} = \frac{V_\mathrm{DD} - V_\mathrm{OL,max}}{I_\mathrm{OL}} = \frac{3{,}3\ \mathrm{V} - 0{,}4\ \mathrm{V}}{3\ \mathrm{mA}} \approx 967\ \Omega

Obere Grenze – die Anstiegszeit: Gibt der Transistor die Leitung frei, lädt sich die Buskapazität C_\mathrm{b} über R_\mathrm{P} auf. Die Anstiegszeit t_\mathrm{r} wird zwischen 0{,}3 \cdot V_\mathrm{DD} und 0{,}7 \cdot V_\mathrm{DD} gemessen; für eine RC-Ladekurve gilt t_\mathrm{r} = \ln(0{,}7/0{,}3) \cdot R_\mathrm{P} \cdot C_\mathrm{b} \approx 0{,}8473 \cdot R_\mathrm{P} \cdot C_\mathrm{b}. Die Spezifikation erlaubt im Standard Mode höchstens 1000 ns, im Fast Mode 300 ns:

R_\mathrm{P,max} = \frac{t_\mathrm{r}}{0{,}8473 \cdot C_\mathrm{b}}

Für eine Buskapazität von 200 pF ergibt das im Standard Mode 1000\ \mathrm{ns} / (0{,}8473 \cdot 200\ \mathrm{pF}) \approx 5{,}9\ \mathrm{k}\Omega und im Fast Mode etwa 1,77 kΩ. Die Grafik zeigt, was das bedeutet: Mit 10 kΩ erreicht die Leitung die HIGH-Schwelle erst nach rund 2,4 µs – für 100 kHz (5 µs HIGH-Phase) knapp, für 400 kHz zu spät.

Anstiegsflanke einer I²C-Leitung bei 3,3 V und 200 pF Buskapazität für Pull-ups von 1 kΩ (t_r = 169 ns), 4,7 kΩ (796 ns) und 10 kΩ (1695 ns), mit den Schwellen 0,3 und 0,7 · V_DD und den Grenzen für Fast Mode (300 ns) und Standard Mode (1000 ns) (mit KI erstellt)

Die Buskapazität setzt sich aus den Eingängen der Teilnehmer (je bis etwa 10 pF) und der Verdrahtung zusammen; bei Flachband- oder verdrillten Leitungen kannst Du grob mit 50 bis 100 pF je Meter rechnen.

Achtung bei mehreren Modulen: Bringt jedes Breakout-Modul eigene Pull-ups mit, liegen diese parallel. Fünf Module mit je 4,7 kΩ ergeben

R_\mathrm{ges} = \frac{4{,}7\ \mathrm{k}\Omega}{5} = 940\ \Omega < R_\mathrm{P,min} \approx 967\ \Omega

Der Low-Strom liegt dann mit 2{,}9\ \mathrm{V} / 940\ \Omega \approx 3{,}1\ \mathrm{mA} über der Grenze, und die Teilnehmer erreichen den LOW-Pegel womöglich nicht mehr sicher. Bei vielen Modulen entfernst Du deshalb überzählige Pull-ups; manche Module haben dafür Lötbrücken (Jumper).

Nachrichtenaufbau: Wie ein I²C-Telegramm aussieht

Jede Übertragung beginnt und endet mit einer besonderen Bedingung, die nur der Controller erzeugt. Dazwischen werden Bytes übertragen, jeweils gefolgt von einem Bestätigungsbit. Für den Takt gilt eine einfache Regel: SDA darf sich nur ändern, solange SCL LOW ist. Während SCL HIGH ist, liest der Empfänger das Bit. Eine Änderung von SDA bei SCL HIGH ist deshalb kein Datenbit, sondern ein Steuersignal:

  • Startbedingung (S): SDA fällt, während SCL HIGH ist. Alle Targets werden aufmerksam.

  • Adressbyte: sieben Adressbits, höchstwertiges Bit (MSB) zuerst, dahinter das Richtungsbit R/\overline{\mathrm{W}}: 0 = Controller schreibt, 1 = Controller liest.

  • ACK/NACK: Im neunten Takt gibt der Sender SDA frei. Der Empfänger zieht SDA auf LOW (ACK, „verstanden“) oder lässt es HIGH (NACK, „nicht da“ oder „genug“).

  • Datenbytes: beliebig viele, jedes mit acht Bit plus ACK/NACK.

  • Stoppbedingung (P): SDA steigt, während SCL HIGH ist. Der Bus ist wieder frei.

  • Wiederholte Startbedingung (Repeated Start, Sr): eine neue Startbedingung ohne vorheriges Stopp, um die Richtung zu wechseln, ohne den Bus freizugeben.

Das Adressbyte ergibt sich aus der 7-Bit-Adresse, indem Du sie um eine Stelle nach links schiebst und das R/\overline{\mathrm{W}}-Bit anhängst:

\text{Adressbyte} = 2 \cdot \text{Adresse} + \mathrm{R}/\overline{\mathrm{W}}

Für den BME280 mit der Adresse 0\mathrm{x}76 = 111\,0110_2 heißt das: Schreiben mit 1110\,1100_2 = 0\mathrm{xEC}, Lesen mit 1110\,1101_2 = 0\mathrm{xED}. Datenblätter geben die Adresse mal als 7-Bit-Wert (0x76), mal als 8-Bit-Adressbyte (0xEC/0xED) an. Die Arduino-Bibliotheken erwarten immer den 7-Bit-Wert.

Das Impulsdiagramm zeigt den Anfang eines typischen Zugriffs: Der Controller sendet die Adresse 0x76 mit W, das Target bestätigt, dann folgt die Nummer des Registers, das gelesen werden soll.

Impulsdiagramm von SDA und SCL: Start, Adressbits 1110110 der Adresse 0x76, W-Bit 0, ACK des Targets, Registeradresse 0xD0 (11010000), ACK und Stopp; SDA wechselt nur bei SCL Low (mit KI erstellt)

Register lesen und schreiben

Die meisten I²C-Bausteine sind intern wie ein kleiner Speicher organisiert: Jede Einstellung und jeder Messwert liegt in einem Register mit einer eigenen Nummer (Registeradresse). Beim BME280 steht zum Beispiel im Register 0xD0 die Chip-ID 0x60, ab 0xF7 liegen die Rohwerte von Druck, Temperatur und Feuchte.

Schreiben ist ein einziges Telegramm: Start · Adresse + W · ACK · Registeradresse · ACK · Datenbyte · ACK · Stopp.

Lesen braucht zwei Phasen. Zuerst schreibt der Controller die Registeradresse in den Registerzeiger des Bausteins, dann wechselt er mit einem Repeated Start die Richtung und holt die Daten ab. Nach dem letzten gewünschten Byte antwortet er mit NACK, damit das Target SDA freigibt und der Controller die Stoppbedingung erzeugen kann. Bei mehreren Bytes zählen die meisten Bausteine den Registerzeiger selbstständig weiter (Auto-Increment).

Register lesen am Beispiel der Chip-ID des BME280: Start, 0xEC (Adresse 0x76 + W), ACK, 0xD0 (Registeradresse), ACK, Repeated Start, 0xED (Adresse 0x76 + R), ACK, 0x60 (Daten vom Target), NACK, Stopp; farbig unterschieden nach Controller und Target (mit KI erstellt)

Clock Stretching und mehrere Controller

Weil SCL ebenfalls eine Open-Drain-Leitung ist, darf ein Target, das noch nicht bereit ist, SCL nach einem Byte auf LOW festhalten. Der Controller wartet, bis SCL wieder HIGH wird. Dieses Clock Stretching nutzen z. B. manche Sensoren während einer laufenden Messung. Nicht jeder Controller unterstützt es unbegrenzt; beim ESP8266 lässt sich die Wartezeit mit Wire.setClockStretchLimit() einstellen.

Senden zwei Controller gleichzeitig, verliert bei der Arbitrierung derjenige, der HIGH ausgeben wollte, aber LOW auf SDA liest; er zieht sich zurück, ohne dass Daten verloren gehen.

Adressen und Adresskonflikte

Mit sieben Bit lassen sich 128 Adressen bilden. Die Bereiche 0x00 bis 0x07 und 0x78 bis 0x7F sind reserviert (z. B. 0x00 für den General Call an alle, 0x78 bis 0x7B als Kennung für 10-Bit-Adressen), sodass 112 Adressen für Bausteine bleiben. Die Adresse ist meist zum Teil im Chip festgelegt; über einen oder mehrere Adresspins (A0, A1, A2, ADDR, SDO o. Ä.) lassen sich die unteren Bits einstellen. So können mehrere gleiche Bausteine am selben Bus betrieben werden.

I²C-Adressen gängiger Bausteine (laut Datenblatt; Module stellen Adresspins oft per Lötbrücke ein)
Baustein Funktion mögliche Adressen
SSD1306 OLED-Display-Controller 0x3C, 0x3D
BME280, BMP280 Druck, Temperatur (, Feuchte) 0x76 (SDO an GND), 0x77 (SDO an VDD)
PCF8574 8-Bit-Port-Erweiterung 0x20 bis 0x27 (A2…A0)
PCF8574A 8-Bit-Port-Erweiterung 0x38 bis 0x3F (A2…A0)
ADS1115 16-Bit-A/D-Wandler 0x48 bis 0x4B (ADDR)
BH1750 Lichtsensor 0x23, 0x5C (ADDR)
AT24C32 EEPROM 0x50 bis 0x57 (A2…A0)
DS3231 Echtzeituhr 0x68 (fest)
MPU-6050 Beschleunigung und Drehrate 0x68, 0x69 (AD0)
TCA9548A I²C-Multiplexer 0x70 bis 0x77 (A2…A0)

Haben zwei Teilnehmer dieselbe Adresse, antworten beide gleichzeitig. Wegen des Wired-AND gewinnt dann in jedem Bit die 0; der Controller liest Unsinn und kann die beiden nicht unterscheiden. Die Tabelle zeigt einen typischen Fall: Ein DS3231-Uhrenmodul und ein MPU-6050 belegen beide 0x68. Lösungen in dieser Reihenfolge:

  1. Adresspin umstellen: AD0 des MPU-6050 auf HIGH legen, dann antwortet er unter 0x69.

  2. Zweiten Bus verwenden: Der ESP32 hat zwei I²C-Controller (Wire und Wire1), beim ESP8266 lässt sich eine zweite Software-Instanz auf anderen Pins anlegen.

  3. Multiplexer einsetzen: Ein TCA9548A teilt einen Bus in acht Zweige auf, von denen der Controller jeweils einen durchschaltet. So lassen sich auch acht gleiche Sensoren mit fester Adresse betreiben.

Geschwindigkeit und Reichweite

Die I²C-Spezifikation kennt mehrere Geschwindigkeitsklassen. Je schneller, desto strenger die Anforderungen an die Flanken:

Geschwindigkeitsklassen nach NXP UM10204
Klasse höchster Takt Anstiegszeit t_\mathrm{r} höchstens Low-Strom Bemerkung
Standard Mode (Sm) 100 kHz 1000 ns 3 mA Grundeinstellung der Wire-Bibliothek
Fast Mode (Fm) 400 kHz 300 ns 3 mA von fast allen Sensoren und Mikrocontrollern unterstützt
Fast Mode Plus (Fm+) 1 MHz 120 ns 20 mA stärkere Ausgangsstufen, kleinere Pull-ups
High-speed Mode (Hs) 3,4 MHz – – eigene Umschaltsequenz, selten bei Hobby-Modulen
Ultra Fast Mode (UFm) 5 MHz – – nur Schreiben, Gegentaktausgänge, ohne ACK

Der Takt ist nicht die Nutzdatenrate. Jedes Byte braucht neun Takte (acht Bit plus ACK), dazu kommen Adressbytes, Registeradresse sowie Start und Stopp. Ein Beispiel: Der BME280 liefert seine Rohmesswerte in den acht Registern ab 0xF7. Der Lesezugriff besteht aus

  • Schreibphase: Adressbyte und Registeradresse, 2 \cdot 9 = 18 Takte,

  • Lesephase: Adressbyte und acht Datenbytes, 9 \cdot 9 = 81 Takte,

  • Start, Repeated Start und Stopp, zusammen etwa 3 Takte.

t \approx \frac{102\ \text{Takte}}{100\ \mathrm{kHz}} = 1{,}02\ \mathrm{ms} \qquad \text{bzw.} \qquad \frac{102\ \text{Takte}}{400\ \mathrm{kHz}} \approx 0{,}26\ \mathrm{ms}

Von den 102 Takten tragen nur 8 \cdot 8 = 64 Nutzdaten, also rund 63 %. Für einen Wettersensor reicht das völlig; für Bilddaten oder schnelle Messreihen wird I²C zum Engpass – dafür gibt es SPI.

Reichweite: I²C ist für Leitungen auf einer Platine oder innerhalb eines Geräts gedacht. Die Grenze setzt nicht die Länge selbst, sondern die Buskapazität von höchstens 400 pF und die damit verbundene Anstiegszeit; dazu kommen Störungen, weil die hochohmigen Pull-ups Einstreuungen wenig entgegensetzen. Auf dem Steckbrett und mit kurzen Kabeln bis etwa einem Meter funktioniert I²C in der Regel bei 100 kHz problemlos. Für längere Strecken senkst Du den Takt, verwendest kleinere Pull-ups oder setzt Bus-Extender ein (z. B. P82B715, der den Bus mit höheren Strömen über Kabel treibt, oder PCA9615, der I²C differenziell überträgt).

Praxis: I²C an Arduino, ESP8266 und ESP32

In der Arduino-Welt heißt die I²C-Bibliothek Wire. Sie gehört bei allen drei Plattformen zum Lieferumfang und bietet dieselben Grundfunktionen, auch wenn die Hardware dahinter verschieden ist. Wo die Leitungen anzuschließen sind, zeigt das Tabset; Pinbelegungen einzelner Boards findest Du im Artikel zu den Pinouts von ESP8266 und ESP32.

ESP32 (DevKit mit ESP32-WROOM): Logikpegel 3,3 V, Pins nicht 5-V-fest.

I²C-Standardpins am ESP32
Signal Standard-Pin
SDA GPIO21
SCL GPIO22

Der ESP32 hat zwei I²C-Controller in Hardware (Wire und Wire1). Über die interne GPIO-Matrix lassen sie sich auf fast beliebige Pins legen; nur die reinen Eingänge GPIO34 bis GPIO39 scheiden aus, und den Startkonfigurations-Pin GPIO12 solltest Du nicht mit einem Pull-up belegen. Andere ESP32-Varianten (S2, S3, C3) haben andere Standardpins – maßgeblich ist das Pinout Deines Boards.

#include <Wire.h>

const int PIN_SDA = 21;
const int PIN_SCL = 22;

void setup() {
  Serial.begin(115200);
  Wire.begin(PIN_SDA, PIN_SCL);   // optional dritter Parameter: Takt, z. B. 400000
  Wire.setClock(400000);          // Fast Mode, wenn alle Teilnehmer ihn beherrschen
}

Erster Test: der I²C-Scanner

Bevor Du eine Bibliothek für einen Baustein einbindest, prüfst Du, ob er am Bus überhaupt antwortet. Der Scanner nutzt das ACK-Bit: Er sendet an jede Adresse ein leeres Telegramm (Start, Adresse + W, Stopp) und wertet aus, ob ein Target mit ACK geantwortet hat. Wire.endTransmission() liefert dann 0; bei 2 kam auf die Adresse ein NACK. Die Initialisierung in setup() übernimmst Du aus dem Tabset oben.

void loop() {
  int anzahl = 0;
  Serial.println("Suche I2C-Teilnehmer ...");
  for (byte adresse = 0x08; adresse < 0x78; adresse++) {   // reservierte Adressen auslassen
    Wire.beginTransmission(adresse);
    byte ergebnis = Wire.endTransmission();               // 0 = ACK, 2 = NACK auf Adresse
    if (ergebnis == 0) {
      Serial.print("Teilnehmer gefunden: 0x");
      if (adresse < 0x10) Serial.print("0");
      Serial.println(adresse, HEX);
      anzahl++;
    }
  }
  Serial.print(anzahl);
  Serial.println(" Teilnehmer gefunden.");
  delay(5000);
}

Für die Wetterstation aus der Einleitung sollte der Scanner 0x20, 0x3C und 0x76 melden. Findet er nichts, hilft die Fehlersuche weiter.

Ein Register „von Hand“ lesen

Wie die Wire-Funktionen auf den Telegrammaufbau abbilden, zeigt das Lesen der Chip-ID des BME280. Jede Zeile entspricht einem Teil der Grafik aus dem Abschnitt Nachrichtenaufbau:

const byte BME280_ADRESSE = 0x76;   // 7-Bit-Adresse (SDO an GND)
const byte REG_CHIP_ID    = 0xD0;

byte leseRegister(byte adresse, byte reg) {
  Wire.beginTransmission(adresse);           // Start, Adresse + W
  Wire.write(reg);                           // Registeradresse
  Wire.endTransmission(false);               // false: kein Stopp, danach Repeated Start
  Wire.requestFrom(adresse, (byte)1);        // Adresse + R, 1 Byte lesen, NACK und Stopp
  return Wire.read();
}

// in setup() nach Wire.begin(...):
//   byte id = leseRegister(BME280_ADRESSE, REG_CHIP_ID);
//   Serial.println(id, HEX);   // 60 = BME280, 58 = BMP280

Das ist mehr als eine Fingerübung: BME280 und BMP280 sehen sich zum Verwechseln ähnlich, aber nur der BME280 misst die Luftfeuchte. Die Chip-ID verrät, welcher Chip auf dem Modul sitzt.

Eine Bibliothek verwenden

Im Alltag rechnest Du die Rohwerte nicht selbst um, sondern nutzt eine Bibliothek. Für den BME280 bietet sich z. B. die Adafruit BME280 Library an (über den Bibliotheksverwalter der Arduino-IDE, mit den Abhängigkeiten Adafruit Unified Sensor und Adafruit BusIO). Die Bibliothek erwartet standardmäßig die Adresse 0x77; bei Modulen mit SDO an GND übergibst Du 0x76:

#include <Wire.h>
#include <Adafruit_BME280.h>

Adafruit_BME280 bme;

void setup() {
  Serial.begin(115200);
  Wire.begin(21, 22);                  // ESP32; ESP8266: Wire.begin(D2, D1); Uno: Wire.begin()
  if (!bme.begin(0x76, &Wire)) {
    Serial.println("BME280 nicht gefunden - Verdrahtung, Adresse und Chip-ID pruefen");
    while (true) delay(10);
  }
}

void loop() {
  Serial.print(bme.readTemperature());        Serial.print(" °C  ");
  Serial.print(bme.readHumidity());           Serial.print(" %  ");
  Serial.print(bme.readPressure() / 100.0F);  Serial.println(" hPa");
  delay(2000);
}

Ausführliche Anleitungen zu beiden Bausteinen der Wetterstation findest Du in den Artikeln zum BME280 und BMP280 und zum OLED-Display SSD1306.

Den Bus beobachten: Logic-Analyzer

Ob auf dem Bus wirklich das passiert, was der Code verspricht, zeigt ein Logic-Analyzer. Schon günstige 8-Kanal-Geräte zeichnen SDA und SCL auf; die Software PulseView enthält einen I²C-Dekoder, der Start, Adressen, R/W, ACK/NACK und Datenbytes direkt in die Messung schreibt. Wähle die Abtastrate deutlich höher als den Bustakt – mindestens das Vierfache, besser das Zehnfache (für 400 kHz also 2 bis 4 MHz) – und triggere auf die fallende Flanke von SDA. Wie die Messung eingerichtet wird, beschreibt der Artikel Digitale Signale mit PulseView und einem Logic-Analyzer untersuchen.

Checkliste: Bevor Du einen Sensor oder Aktor anschließt

Ein neues Modul ist schnell bestellt und verdrahtet. Damit es danach auch funktioniert – und nichts kaputtgeht –, prüfst Du vorher einige Punkte im Datenblatt des Bausteins bzw. Moduls und in der Dokumentation der Bibliothek.

Checkliste vor dem Anschluss eines I²C-Bausteins
Prüffrage Worauf Du bei I²C achtest Beispiel
Hardware (Datenblatt)
Welche Schnittstelle nutzt der Baustein? I²C, SPI oder beides; wie wird die Schnittstelle gewählt? Wie heißen die Pins? Beim BME280 legt CSB an VDDIO den I²C-Betrieb fest; SDA ist mit SDI beschriftet.
Kann ich einen weiteren Teilnehmer anschließen? Ist die Adresse am Bus noch frei, lässt sie sich per Adresspin ändern? Wie viele Pull-ups liegen schon am Bus, wie groß wird die Buskapazität? DS3231 und MPU-6050 belegen beide 0x68: AD0 des MPU-6050 auf HIGH legen.
Liegen Versorgungsspannung und Leistung vor? Spannungsbereich von Chip und Modul (eigener Regler?), Stromaufnahme aller Teilnehmer zusammenzählen und mit der Quelle vergleichen Der 3,3-V-Pin des Arduino Uno darf laut Hersteller nur mit 50 mA belastet werden; ein OLED-Display braucht bei vielen hellen Pixeln einige 10 mA.
Sind die Logikpegel kompatibel? V_\mathrm{IH}/V_\mathrm{IL} des Bausteins, Spannung der Pull-ups, 5-V-Festigkeit der MCU-Pins; ggf. Pegelwandler 5-V-Modul mit Pull-ups an 5 V am ESP32: bidirektionalen Pegelwandler einsetzen.
Ist die Taktfrequenz kompatibel? höchster SCL-Takt des langsamsten Teilnehmers; Clock Stretching nötig? Alle Teilnehmer beherrschen 400 kHz: Wire.setClock(400000), sonst 100 kHz lassen.
Passen die Umgebungsbedingungen? Betriebstemperatur, Luftfeuchte und Betauung, Schutzart (IP) des Gehäuses, Leitungslänge und Störquellen Der BME280 arbeitet von −40 °C bis +85 °C; im Freien braucht er ein belüftetes, gegen Regen geschütztes Gehäuse.
Software (Bibliotheksdokumentation)
Welche Bibliothek eignet sich für MCU und Anwendung? unterstützte Architekturen (AVR, ESP8266, ESP32), Funktionsumfang, Pflege (letzte Version, offene Fehlermeldungen), Lizenz, Abhängigkeiten, Standardadresse Adafruit-Bibliotheken brauchen Adafruit BusIO; die Standardadresse 0x77 passt nicht zu jedem Modul.
Reicht der Speicher des Mikrocontrollers? Programmspeicher (Flash) und Arbeitsspeicher (RAM), auch für Puffer, die erst zur Laufzeit angelegt werden Der Uno hat 2 KB RAM; ein 128 × 64-OLED braucht einen Bildpuffer von 128 \cdot 64 / 8 = 1024 Byte, den die Adafruit-Bibliothek erst in begin() anlegt – der Compiler zeigt ihn nicht an.
Sind Hardware und Software geprüft? Beispielsketche der Bibliothek, Testprogramme oder Referenztreiber des Herstellers, I²C-Scanner, Chip-ID lesen, Messwerte auf Plausibilität prüfen Bosch stellt für den BME280 einen Referenztreiber bereit; das Beispiel der Bibliothek zeigt, ob Verdrahtung und Adresse stimmen.

Fehlersuche: Wenn der Bus schweigt

Die meisten Probleme mit I²C haben einfache Ursachen. Gehe von der Hardware zur Software vor: erst Versorgung und Verdrahtung, dann Pegel, dann Adresse und Bibliothek.

Typische Fehlerbilder am I²C-Bus
Fehlerbild mögliche Ursache So prüfst Du
Scanner findet keinen Teilnehmer keine Versorgung, SDA und SCL vertauscht, falsche Pins in Wire.begin(), fehlende Pull-ups, gespiegelt eingelötete Stiftleiste Versorgungsspannung am Modul messen; im Ruhezustand müssen SDA und SCL HIGH sein
Scanner findet den Baustein, die Bibliothek meldet „nicht gefunden“ andere Adresse als der Standard der Bibliothek, anderer Chip als erwartet Adresse an begin() übergeben; Chip-ID lesen (BME280: 0x60, BMP280: 0x58)
Scanner meldet Teilnehmer auf (fast) allen Adressen SDA dauerhaft LOW: Kurzschluss oder ein Target hängt mitten in einer Übertragung SDA-Pegel messen; Target kurz stromlos machen
Bus hängt nach einem Reset des Mikrocontrollers Target wartet noch auf Takte und hält SDA auf LOW bis zu neun Takte auf SCL ausgeben, bis SDA frei ist (Bus-Recovery), dann Stoppbedingung
sporadische Aussetzer, falsche Werte Pull-ups zu groß für die Leitungslänge, zu viele Pull-ups parallel, Takt zu hoch, Einstreuungen Flanken mit Oszilloskop oder Logic-Analyzer ansehen; Takt auf 100 kHz senken; Pull-ups anpassen
MCU-Pin defekt oder Baustein warm 5-V-Pull-ups an einem 3,3-V-Mikrocontroller, Modul falsch herum versorgt Pegel vor dem Anschluss messen; Pegelwandler einsetzen

Leitfragen

  1. Welche Leitungen hat ein I²C-Bus, und welche Kennzeichen unterscheiden ihn von anderen seriellen Schnittstellen?

I²C nutzt die Datenleitung SDA und die Taktleitung SCL, dazu eine gemeinsame Masse. Der Bus ist seriell, synchron (der Controller liefert den Takt) und halbduplex; die Teilnehmer werden über Adressen im Telegramm ausgewählt, und jedes Byte wird mit ACK bestätigt. Siehe Abschnitt „Steckbrief“

  1. Warum braucht I²C Pull-up-Widerstände, und was bedeutet Wired-AND?

Alle Teilnehmer haben Open-Drain-Ausgänge, die eine Leitung nur nach Masse ziehen können; den HIGH-Pegel liefert allein der Pull-up-Widerstand. Die Leitung ist HIGH, wenn kein Teilnehmer zieht, und LOW, sobald einer zieht – eine UND-Verknüpfung durch die Verdrahtung, die Kurzschlüsse verhindert und Clock Stretching und Arbitrierung ermöglicht. Siehe Abschnitt „Leitungen und Potenziale“

  1. Wie bemisst Du die Pull-up-Widerstände, und worauf achtest Du bei mehreren Modulen?

Die untere Grenze ergibt sich aus dem zulässigen Low-Strom, R_\mathrm{min} = (V_\mathrm{DD} - 0{,}4\ \mathrm{V}) / 3\ \mathrm{mA}, die obere aus Anstiegszeit und Buskapazität, R_\mathrm{max} = t_\mathrm{r} / (0{,}8473 \cdot C_\mathrm{b}). Die Pull-ups mehrerer Module liegen parallel und können zusammen die untere Grenze unterschreiten; überzählige Pull-ups entfernst Du dann. Siehe Abschnitt „Pull-up-Widerstände bemessen“

  1. Wie ist ein I²C-Telegramm aufgebaut, mit dem der Controller ein Register eines Sensors liest?

Start, Adressbyte mit W, ACK, Registeradresse, ACK; dann Repeated Start, Adressbyte mit R, ACK, Datenbyte(s) vom Target, nach dem letzten Byte NACK des Controllers und Stopp. SDA ändert sich nur bei SCL LOW; Start und Stopp sind Flanken auf SDA bei SCL HIGH. Siehe Abschnitt „Nachrichtenaufbau“

  1. Wie bestimmst Du das Adressbyte eines Bausteins, und was tust Du, wenn zwei Bausteine dieselbe Adresse haben?

Adressbyte = 2 · 7-Bit-Adresse + R/W, z. B. 0x76 → 0xEC (Schreiben) und 0xED (Lesen). Bei gleicher Adresse stellst Du zuerst einen Adresspin um; geht das nicht, nutzt Du einen zweiten I²C-Bus oder einen Multiplexer wie den TCA9548A. Siehe Abschnitt „Adressen und Adresskonflikte“

  1. Welche Taktraten sind bei I²C üblich, und was begrenzt Geschwindigkeit und Leitungslänge?

Üblich sind 100 kHz (Standard Mode) und 400 kHz (Fast Mode), seltener 1 MHz (Fast Mode Plus). Jedes Byte braucht neun Takte, dazu kommen Adressen und Steuerbedingungen. Die Buskapazität (höchstens 400 pF) bestimmt mit den Pull-ups die Anstiegszeit und begrenzt damit Takt und Leitungslänge. Siehe Abschnitt „Geschwindigkeit und Reichweite“

  1. Was prüfst Du, bevor Du einen I²C-Sensor an einen Mikrocontroller anschließt?

Im Datenblatt: Schnittstelle und Pinbezeichnung, freie Adresse und Pull-ups am Bus, Versorgungsspannung und Strombedarf, Logikpegel, höchster Takt und Umgebungsbedingungen. In der Bibliotheksdokumentation: passende Bibliothek für MCU und Anwendung, Speicherbedarf (auch Laufzeitpuffer) und vorhandene Beispiele oder Testprogramme. Siehe Abschnitt „Checkliste“

  1. Wie gehst Du vor, wenn der I²C-Scanner keinen Teilnehmer findet?

Von der Hardware zur Software: Versorgung am Modul messen, Verdrahtung und Pinzuordnung in Wire.begin() prüfen (SDA/SCL vertauscht, gespiegelte Stiftleiste), Ruhepegel HIGH auf beiden Leitungen kontrollieren (Pull-ups vorhanden?), dann Adresse und Chip-ID. Ein Logic-Analyzer zeigt, ob Telegramme gesendet und bestätigt werden. Siehe Abschnitt „Fehlersuche“


Hinweis zur Nachnutzung als Open Educational Resource (OER)

Dieser Artikel und seine Texte, Bilder, Grafiken, Code und sonstiger Inhalt sind - sofern nicht anders angegeben - lizenziert unter CC BY 4.0. Nennung gemäß TULLU-Regel bitte wie folgt: “I²C: Ein Bus, zwei Leitungen, viele Sensoren” von oer-informatik.de (H. Stein), Lizenz: CC BY 4.0. Der Artikel wurde unter https://oer-informatik.de/i2c-bus veröffentlicht, die Quelltexte sind in weiterverarbeitbarer Form verfügbar im Repository unter https://gitlab.com/oer-informatik/mcu/mcu-schnittstellen. Erstellt mit KI-Assistenz; von mir umfassend redaktionell überarbeitet, geprüft und freigegeben. Stand: 03.11.2026.

[Kommentare zum Artikel lesen, schreiben] / [Artikel teilen] / [gitlab-Issue zum Artikel schreiben]

Kommentare gerne per Mastodon, Verbesserungsvorschläge per gitlab issue (siehe oben). Beitrag teilen: