<style>[reveal]{opacity:1 !important;transform:none !important}</style>

I²C-Bus richtig beschalten

I²C an Arduino und ESP32: Pull-up-Widerstände aus Buskapazität und Takt berechnen, Module mit eigenen Pull-ups einrechnen, Pegel anpassen und Busfehler finden.

6 Min. LesezeitI2C Pull-upI²C Pull-up berechnenI2C ArduinoI2C ESP32

Temperatursensor, Display, Uhrenbaustein, Port-Erweiterung: Viele Bausteine sprechen I²C. Zwei Leitungen genügen für Dutzende Teilnehmer, jeder hat seine eigene Adresse. Damit das funktioniert, braucht der Bus zwei Widerstände, die erstaunlich oft falsch sind: zu groß, zu klein, doppelt oder gar nicht vorhanden. Der Bus läuft dann manchmal, manchmal nicht, und der Fehler ist schwer zu finden.

Hier beschaltest du einen Bus mit einem ESP32, einem Umweltsensor BME280 und einem OLED-Display mit SSD1306 bei 400 kHz, und du rechnest die Pull-ups aus statt sie zu raten. Was beim Arduino Uno anders ist, steht weiter unten.

Schaltplan

I²C-Bus: ESP32-WROOM-32E mit IO21 (SDA, Pin 33) und IO22 (SCL, Pin 36), R1 und R2 je 2,2 kΩ von SDA und SCL nach +3,3 V, an beiden Leitungen ein BME280 (Adresse 0x76) und ein SSD1306-OLED (Adresse 0x3C)
Ein Paar Pull-ups für den ganzen Bus. Versorgung und Masse der beiden Teilnehmer sind nicht gezeichnet.
  • U1, ESP32-WROOM-32E: der Controller (Master). In Arduino liegen SDA und SCL vorgegeben auf GPIO 21 und 22, das sind die Pins 33 und 36 des Moduls.
  • SDA, SCL: Datenleitung und Taktleitung. Alle Teilnehmer hängen parallel daran.
  • R1, R2, 2,2 kΩ: die Pull-up-Widerstände, je einer pro Leitung und Bus, nicht pro Teilnehmer.
  • U2, BME280: Sensor für Temperatur, Feuchte und Luftdruck, Adresse 0x76 (mit SDO an 3,3 V: 0x77).
  • U3, SSD1306: Controller eines kleinen OLED-Displays, Adresse 0x3C.
  • Versorgung: Alle Teilnehmer an 3,3 V und an derselben Masse.

So funktioniert die Schaltung

Kein Teilnehmer treibt eine I²C-Leitung jemals aktiv auf High. Jeder Ausgang ist ein Transistor nach Masse, ein sogenannter Open-Drain-Ausgang (Open-Collector-Ausgang). Er kann die Leitung nur auf Low ziehen oder loslassen. Lassen alle los, holt der Pull-up die Leitung auf High.

Das hat zwei Vorteile. Ziehen zwei Teilnehmer gleichzeitig in verschiedene Richtungen, gibt es keinen Kurzschluss: Low gewinnt einfach. Darauf beruhen die Bestätigung jedes Bytes (ACK) und das „Clock Stretching“, mit dem ein langsamer Slave den Takt anhält. Und der Pull-up bestimmt den High-Pegel; Teilnehmer mit verschiedenen Versorgungen lassen sich so leichter verbinden.

Der Preis ist die Geschwindigkeit. Die fallende Flanke ist schnell, denn ein Transistor zieht kräftig. Die steigende Flanke dagegen macht der Pull-up allein: Er muss die Kapazität aller Pins und Leitungen umladen, wie bei einem RC-Glied. Ein großer Widerstand macht die Flanke langsam, ein kleiner belastet die Ausgänge. Dazwischen liegt der richtige Wert.

Spannung an SCL nach dem Loslassen bei 100 pF Buskapazität: Mit 10 kΩ dauert der Anstieg von 30 auf 70 % 847 ns, mit 4,7 kΩ 398 ns, mit 2,2 kΩ 186 ns
Die Anstiegszeit zählt von 30 auf 70 % der Versorgung. Bei 400 kHz sind höchstens 300 ns erlaubt – nur 2,2 kΩ schaffen das.

Dimensionierung

Die Grenzen stehen in der I²C-Spezifikation. Für den Fast Mode mit 400 kHz: Anstiegszeit tr höchstens 300 ns, Buskapazität höchstens 400 pF, und ein Ausgang muss bei 0,4 V Restspannung 3 mA aufnehmen können. Im Standard Mode mit 100 kHz sind 1000 ns erlaubt.

1. Buskapazität schätzen. Jeder Pin bringt bis zu 10 pF mit, eine Leitung auf Platine oder im Flachkabel etwa 50 bis 100 pF pro Meter. Drei Teilnehmer mit 30 cm Kabel und Leiterbahnen: rund 30 pF + 30 pF + Reserve, gerechnet wird mit Cb = 100 pF.

2. Kleinster Widerstand. Der Ausgang muss den Strom durch den Pull-up gegen Masse ziehen können:

Rmin = UDD − UOLIOL = 3,3 V − 0,4 V3 mA ≈ 0,97 kΩ

3. Größter Widerstand. Von 30 auf 70 % braucht ein RC-Glied τ · ln(0,7 / 0,3) ≈ 0,847 τ:

Rmax = tr0,8473 · Cb = 300 ns0,8473 · 100 pF ≈ 3,5 kΩ

4. Wählen und prüfen. Zwischen 0,97 und 3,5 kΩ liegt 2,2 kΩ aus der E12-Reihe gut in der Mitte. Die Anstiegszeit wird 0,8473 · 2,2 kΩ · 100 pF ≈ 186 ns, der Strom bei Low 3,3 V / 2,2 kΩ = 1,5 mA. Bei 100 kHz dürftest du bis 11,8 kΩ gehen; 4,7 kΩ ist dort der übliche Wert.

Rechner

I²C-Pull-up-Widerstände

Rmin
967 Ω
Rmax
3,54 kΩ
Vorschlag (E12)
2,2 kΩ
Anstiegszeit damit
186 ns
Strom bei Low
1,32 mA
3,3 V70 %30 %00tr ≤ 300 ns300 nsZeit ab 30 % von VDD967 Ω2,2 kΩ3,54 kΩ

Nach NXP UM10204 (Rev. 7, Abschnitt 7.1): Rmin = (VDD − VOL,max) / IOL mit VOL,max = 0,4 V bei IOL = 3 mA, Rmax = tr / (0,8473 · Cb); 0,8473 = ln(0,7/0,3) ist die Zeit von 30 % auf 70 % in Zeitkonstanten. Der Vorschlag ist der größte E12-Wert bis 75 % von Rmax – Reserve für Toleranzen und eine zu knapp geschätzte Buskapazität. Cb schätzt du aus Pin-Kapazitäten (je Gerät etwa 5–10 pF) plus Leitung (grob 50–100 pF je Meter). Die steilste Flanke gehört zu Rmin, die flachste zu Rmax. Grenzen im Fast-mode: tr ≤ 300 ns, Cb ≤ 400 pF.

5. Module mit eigenen Pull-ups. Fast jede Breakout-Platine bringt schon Pull-ups mit, oft 10 kΩ oder 4,7 kΩ. Sie liegen parallel zu deinen. Mit zwei Modulen à 10 kΩ und R1 = 2,2 kΩ:

Rges = 112,2 kΩ + 210 kΩ ≈ 1,53 kΩ

Das liegt noch über Rmin. Bei fünf solchen Modulen wären es 0,92 kΩ – zu klein. Dann entfernst du die Pull-ups auf den Modulen (meist über eine Lötbrücke) oder lässt R1 und R2 weg.

Code

Der Scanner fragt alle Adressen ab und listet, wer antwortet – der erste Test für jeden neuen Bus:

#include <Wire.h>

void setup() {
  Serial.begin(115200);
  Wire.begin(21, 22);          // ESP32: SDA, SCL; am Uno einfach Wire.begin()
  Wire.setClock(400000);       // 400 kHz
  for (byte adr = 1; adr < 127; adr++) {
    Wire.beginTransmission(adr);
    if (Wire.endTransmission() == 0) {
      Serial.print("Gefunden: 0x");
      Serial.println(adr, HEX);
    }
  }
}

void loop() {}

Für diesen Bus meldet er 0x3C und 0x76. Fehlt ein Teilnehmer, stimmen Adresse, Versorgung oder Verdrahtung nicht.

Bauteilliste

BezeichnerWert/TypHinweis
U1ESP32-WROOM-32ESDA = IO21 (Pin 33), SCL = IO22 (Pin 36)
R1, R22,2 kΩ400 kHz; bei 100 kHz 4,7 kΩ
U2BME2800x76 oder 0x77
U3SSD1306-OLED 128 × 640x3C oder 0x3D

Varianten

Arduino Uno. SDA liegt auf A4 (PC4, Pin 27), SCL auf A5 (PC5, Pin 28). Die Bibliothek Wire schaltet die internen Pull-ups von 20 bis 50 kΩ ein. Für kurze Leitungen bei 100 kHz reicht das gerade, für alles andere nicht. Rechne an 5 V mit Rmin = (5 V − 0,4 V) / 3 mA ≈ 1,5 kΩ; üblich sind 4,7 kΩ.

3,3-V-Sensor am 5-V-Arduino. Hängen die Pull-ups an 5 V, sieht der Sensor 5 V an seinen Pins; viele vertragen das nicht. Hängen sie an 3,3 V, erkennt der ATmega328P High erst ab 0,6 · 5 V = 3,0 V – das reicht knapp, solange die internen Pull-ups nach 5 V nicht dagegen arbeiten. Sauber ist ein bidirektionaler Pegelwandler mit zwei MOSFETs. Viele Module haben ihn schon eingebaut.

Lange Leitungen. Über etwa einen Meter wird die Kapazität zum Problem. Abhilfe schaffen ein langsamerer Takt, Bus-Extender wie der P82B715 oder der PCA9615 mit differenzieller Übertragung. Kleine Serienwiderstände von 33 bis 100 Ω an jedem Teilnehmer dämpfen Überschwinger.

Gleiche Adressen. Zwei identische Sensoren mit fester Adresse trennt ein I²C-Multiplexer wie der TCA9548A in eigene Teilbusse.

Typische Fehler

  • Scanner findet nichts, Bus hängt: Pull-ups fehlen, SDA und SCL vertauscht oder keine gemeinsame Masse.
  • Funktioniert bei 100 kHz, nicht bei 400 kHz: Pull-ups zu groß oder Leitung zu lang. Mit dem Oszilloskop die Flanken ansehen: Statt Rechtecken siehst du Haifischflossen.
  • Low-Pegel zu hoch: Zu viele parallele Pull-ups auf den Modulen. Gesamtwiderstand nachmessen, mit dem Multimeter zwischen SDA und 3,3 V bei stromlosem Aufbau.
  • ESP32 stürzt ab oder ein Pin ist tot: Pull-ups an 5 V. Die Pins des ESP32 vertragen höchstens 3,6 V.
  • Ein Teilnehmer fehlt sporadisch: Adresskonflikt oder ein Slave hat beim Reset mitten in einer Übertragung SDA auf Low festgehalten. Neun Takte auf SCL befreien den Bus.

Selbsttest

Warum braucht I²C Pull-up-Widerstände?

Alle Ausgänge sind Open-Drain: Sie können nur nach Low ziehen. Den High-Pegel stellt der Pull-up her.

Welcher Pull-up ist bei 3,3 V, 400 kHz und 200 pF höchstens erlaubt?

300 ns / (0,8473 · 200 pF) ≈ 1,77 kΩ; mit Rmin ≈ 0,97 kΩ passt 1,5 kΩ.

Drei Module mit je 4,7 kΩ hängen am Bus. Welcher Gesamtwiderstand ergibt sich ohne eigene Pull-ups?

4,7 kΩ / 3 ≈ 1,57 kΩ.

Warum ist die fallende Flanke schneller als die steigende?

Beim Fallen entlädt ein Transistor die Buskapazität kräftig, beim Steigen lädt sie allein der Pull-up-Widerstand.

Welche Adressen meldet der Scanner für den Bus aus dem Schaltplan?

0x3C für das Display und 0x76 für den BME280.