I²C Bus –> Funktionsweise -> Einsatz in der Arduino Entwicklung und Anforderungen an die Verdrahtung

i2c-bus

1. Was ist ein I²C-Bus und wie funktioniert dieser?

Der I²C-Bus (Inter-Integrated Circuit) ist ein serieller Kommunikationsbus, über den verschiedene elektronische Bauteile miteinander kommunizieren können. Er wurde ursprünglich von Philips entwickelt und wird heute in vielen Mikrocontrollern und elektronischen Geräten eingesetzt.

Ein großer Vorteil von I²C ist, dass mehrere Geräte über nur zwei gemeinsame Datenleitungen miteinander kommunizieren können.

Die zwei Leitungen des I²C-Busses sind:

  • SDA (Serial Data): Überträgt die eigentlichen Daten zwischen den Geräten.
  • SCL (Serial Clock): Gibt den Takt für die Datenübertragung vor.

Zusätzlich benötigen alle angeschlossenen Geräte eine gemeinsame Masseverbindung (GND) und eine passende Versorgungsspannung.

Wie funktioniert die Kommunikation?

  1. Ein Master (z. B. ein Arduino) startet die Kommunikation.
  2. Er spricht ein bestimmtes Gerät über dessen eindeutige I²C-Adresse an.
  3. Das angesprochene Gerät (Slave) bestätigt die Anfrage.
  4. Anschließend werden Daten über die SDA-Leitung übertragen. Die SCL-Leitung gibt dabei den Takt vor.
  5. Nach Abschluss der Übertragung beendet der Master die Kommunikation.

Der Master steuert normalerweise den Kommunikationsablauf. Mehrere Geräte können am selben Bus angeschlossen sein, solange sie unterschiedliche Adressen besitzen.

Typische Übertragungsgeschwindigkeiten sind:

  • 100 kbit/s (Standard Mode)
  • 400 kbit/s (Fast Mode)
  • 1 Mbit/s (Fast Mode Plus)
  • 3,4 Mbit/s (High Speed Mode)

Für viele Arduino-Projekte reichen 100 oder 400 kbit/s vollkommen aus.

2. Welche Bedeutung hat der I²C-Bus für die Arduino-Entwicklung?

Der I²C-Bus ist für die Arduino-Entwicklung besonders interessant, weil sich damit viele externe Bauteile mit geringem Verdrahtungsaufwand anschließen lassen.

Anstatt für jedes Bauteil eigene Datenleitungen zu benötigen, können mehrere Geräte dieselben beiden Leitungen SDA und SCL verwenden.

Typische Einsatzgebiete sind:

  • LCD-Displays und OLED-Displays
  • Temperatursensoren und Luftfeuchtigkeitssensoren
  • Echtzeituhren (RTC)
  • Erweiterungsmodule für digitale Ein- und Ausgänge
  • A/D- und D/A-Wandler
  • Verschiedene Sensor- und Steuerungsmodule

Programmierung mit Arduino

Die Arduino-Entwicklungsumgebung stellt für die I²C-Kommunikation die Bibliothek Wire.h bereit.

Ein einfaches Beispiel für die Initialisierung:

#include <Wire.h>

void setup() {
  Wire.begin();  // I2C als Master starten
}

void loop() {
  // Kommunikation mit I2C-Geräten
}

Die Bibliothek übernimmt die grundlegende Kommunikation über SDA und SCL. Dadurch muss der Entwickler die Übertragung nicht selbst auf Bit-Ebene programmieren.

Wichtig: Die Pins für SDA und SCL unterscheiden sich je nach Arduino-Modell. Beim Arduino Uno R3 sind dies beispielsweise A4 (SDA) und A5 (SCL).

3. Welchen Einfluss haben Kabellänge und Verdrahtung (Kapazität) auf den I²C-Bus?

Die Kabellänge und die Art der Verdrahtung haben einen erheblichen Einfluss auf die Zuverlässigkeit der I²C-Kommunikation.

Der Grund dafür ist die elektrische Kapazität der Leitungen.

Jedes Kabel besitzt eine gewisse elektrische Kapazität. Je länger ein Kabel ist und je mehr Geräte angeschlossen werden, desto größer wird normalerweise die Gesamtkapazität des Busses.

Warum ist das problematisch?

I²C verwendet sogenannte Open-Drain-Ausgänge. Die Geräte können die Datenleitungen aktiv auf LOW ziehen. Für den HIGH-Zustand sorgen sogenannte Pull-up-Widerstände, die SDA und SCL mit der Versorgungsspannung verbinden.

Durch die Leitungskapazität dauert es eine gewisse Zeit, bis sich eine Leitung nach dem Umschalten wieder auf HIGH auflädt.

Das hat folgende Auswirkungen:

  • Die Signalflanken werden langsamer.
  • Die Signale können den erforderlichen HIGH-Pegel zu spät erreichen.
  • Bei höheren Übertragungsgeschwindigkeiten können Kommunikationsfehler auftreten.
  • Im schlimmsten Fall werden angeschlossene Geräte nicht mehr zuverlässig erkannt. Zusammenhang zwischen Kabellänge und Kapazität

Je länger die Leitungen, desto höher ist in der Regel die Leitungskapazität. Auch Steckverbindungen, Leiterbahnen und angeschlossene Bauteile tragen zur Gesamtkapazität bei.

Für den Standard Mode und Fast Mode ist eine Buskapazität von maximal 400 pF spezifiziert.

Es gibt keine allgemeingültige maximale Kabellänge für I²C. Diese hängt unter anderem von der Kabelkapazität, den Pull-up-Widerständen, der Übertragungsgeschwindigkeit und der Verdrahtung ab.

Für den praktischen Aufbau gilt daher:

  • Leitungen möglichst kurz halten.
  • Hohe Übertragungsgeschwindigkeiten bei langen Leitungen vermeiden.
  • Auf eine übersichtliche Verdrahtung achten.
  • Bei größeren Leitungslängen gegebenenfalls einen I²C-Bus-Extender einsetzen.

4. Auf welche Besonderheiten muss man beim Aufbau eines I²C-Busses achten?

Damit ein I²C-Bus zuverlässig funktioniert, sollten einige grundlegende Regeln beachtet werden.

1. Pull-up-Widerstände verwenden

SDA und SCL benötigen Pull-up-Widerstände, damit die Leitungen zuverlässig auf HIGH gezogen werden.

Typische Werte liegen bei 4,7 kΩ. Je nach Buskapazität und Versorgungsspannung können auch andere Werte erforderlich sein.

Wichtig: Viele I²C-Module besitzen bereits integrierte Pull-up-Widerstände. Werden mehrere solcher Module angeschlossen, können sich die Widerstände parallel addieren und der Gesamtwiderstand zu klein werden.

2. Gemeinsame Masseverbindung herstellen

Alle angeschlossenen Geräte müssen eine gemeinsame GND-Verbindung besitzen. Andernfalls können die Signalpegel nicht zuverlässig erkannt werden.

3. Auf die Versorgungsspannung achten

Nicht alle I²C-Geräte arbeiten mit derselben Spannung. Während viele Arduino-Module mit 5 V arbeiten, verwenden andere Geräte 3,3 V.

Die zulässigen Spannungspegel müssen für alle angeschlossenen Geräte eingehalten werden. Gegebenenfalls ist ein bidirektionaler Pegelwandler erforderlich.

4. I²C-Adressen beachten

Jedes Gerät muss innerhalb des Busses eine eindeutige Adresse besitzen. Haben zwei Geräte dieselbe Adresse, kann es zu Kommunikationsproblemen kommen.

5. Kabellängen möglichst kurz halten

Besonders bei höheren Übertragungsgeschwindigkeiten sollten die Leitungen möglichst kurz und störungsarm verlegt werden.

6. Auf eine saubere Verdrahtung achten

  • SDA und SCL möglichst gemeinsam und nahe beieinander führen.
  • Lange parallele Leitungen zu störenden Stromleitungen vermeiden.
  • Bei längeren Verbindungen geeignete Kabel und gegebenenfalls geschirmte oder verdrillte Leitungen verwenden.
  • Auf sichere Steckverbindungen achten.

Zusammenfassung:

Der I²C-Bus ist eine einfache und kostengünstige Möglichkeit, mehrere elektronische Bauteile mit einem Mikrocontroller zu verbinden. Für einen zuverlässigen Betrieb sind insbesondere die richtigen Pull-up-Widerstände, passende Spannungspegel, eindeutige Geräteadressen und eine möglichst geringe Buskapazität entscheidend.

5. Quellen und weiterführende Informationen

Die folgenden Quellen wurden für diesen Artikel verwendet. Es handelt sich überwiegend um technische Dokumentationen der Hersteller.

Quelle Inhalt
Arduino – Inter-Integrated Circuit (I2C) Protocol Grundlagen, Funktionsweise und Verwendung mit Arduino
Arduino – Wire Library Programmierung und Pinbelegung verschiedener Arduino-Boards
Texas Instruments – I2C Bus Pullup Resistor Calculation Berechnung und Auswahl geeigneter Pull-up-Widerstände
Analog Devices – I²C Cabling Einfluss von Kabellänge, Leitungskapazität und Verdrahtung
Dieser Beitrag wurde mit Hilfe von KI erzeugt