Raspberry Pi Pico: I2C verbinden und programmieren

Der I2C ist ein synchroner serieller Zweidraht-Bus. Er verwendet jeweils eine bidirektionale Daten- und Taktleitung und wird typischerweise für die Kommunikation zwischen unterschiedlichen Komponenten benutzt.

Geräte mit dem I2C verbinden

Raspberry Pi Pico GPIO Belegung

Der Raspberry Pi Pico bzw. der Mikrocontroller RP2040 hat insgesamt 2 I2C-Schnittstellen, die auf mehreren GPIO-Pins ausgegeben werden können. Hierbei ist bei der Initialisierung im Programmcode zu beachten, dass es Doppelbelegungen mit SPI, UART und ADCs gibt.

Der I2C kennt zwei Leitungen. Eine für die Daten, SDA genannt. Die andere ist die Taktleitung, SCL genannt. Desweiteren benötigen die beteiligten Geräte eine Betriebsspannung (VCC: 3,3 oder 5 Volt) und eine Verbindung zu Ground (GND).

Verkabelung mit Pull-Up-Widerständen

Damit der I2C elektrisch funktioniert, sollte man nicht zu lange Drähte verwenden. Auf Platinen sollten Verbindungen maximal 15 cm lang sein. Damit freiliegende Drahtverbindungen funktionieren, sollte man mit einer eher niedrigen Taktrate arbeiten (z. B. 1.000.000 Hz) und zusätzlich mit Pull-Up-Widerständen auf den Signalleitungen SDA und SLC arbeiten. Die Pullups sind nötig, um auf dem Bus einen dauerhaften High-Pegel zu erzeugen, der bei der Datenübertragung von einem Busteilnehmer aktiv nach Masse gezogen werden kann. Ohne Pullups können undefinierbare Zustände auf dem Bus entstehen, die dann zu Fehlermeldungen führen, die den Programmcode unterbrechen können.

I2C scannen

Der folgende Programmcode zum Testen bzw. Scannen des I2C ist sehr einfach. Zuerst werden die GPIO-Pins für I2C und der I2C initialisiert. Und dann wird der I2C-Scan gestartet und das Ergebnis auf dem Display ausgegeben.

# Bibliotheken laden
from machine import Pin, I2C

# Initialisierung I2C
i2c = I2C(0, sda=Pin(20), scl=Pin(21))

# I2C-Bus-Scan ausgeben
print(i2c.scan())

Das Ergebnis ist ein Array mit den Adressen (dezimale Schreibweise) der Geräte, die mit diesem I2C-Bus verbunden sind.

I2C-Geräte mit Adresse anzeigen

Der folgende Programmcode zum Testen bzw. Scannen des I2C-Busses ein wenig komplexer. Allerdings liefert er zusätzliche Informationen.
Zuerst werden die GPIO-Pins für I2C und der I2C initialisiert. Und dann wird der I2C-Scan gestartet und das Ergebnis auf dem Display ausgegeben.

# Bibliotheken laden
from machine import Pin, I2C

# Initialisierung I2C-Pins
i2c_sda = Pin(20)
i2c_scl = Pin(21)

# Initialisierung I2C
i2c = I2C(0,sda=i2c_sda,scl=i2c_scl,freq=100000)

# I2C-Bus-Scan
print('Scan I2C Bus...')
devices = i2c.scan()

# Scanergebnis ausgeben
if len(devices) == 0:
    print('Kein I2C-Gerät gefunden!')
else:
    print('I2C-Geräte gefunden:', len(devices))
    for device in devices:
        print('Dezimale Adresse:', device, '| Hexadezimale Adresse:', hex(device))

Das eigentliche Scan-Ergebnis ist ein Array mit den Adressen der Geräte, die mit diesem I2C-Bus verbunden sind. Die dezimale Schreibweise der Adresse ist bei der Initialisierung der I2C-Geräte selten hilfreich. Deshalb wird zusätzlich noch in die hexadezimale Schreibweise umgerechnet.

Hinweis: Die hexadezimale Adresse wird benötigt, wenn man das Gerät am I2C initialisieren will.

Für was wird die I2C-Adresse benötigt?

Die hexadezimale Adresse wird bei der Initialisierung des Geräts durch eine Bibliothek benötigt. Mit dieser Adresse fühlt sich das Gerät angesprochen. Oft ist diese Adresse in einer Bibliothek hinterlegt.
Zu beachten ist, dass man zwei Geräte, die die gleiche Adresse haben, nicht gemeinsam am gleichen I2C betrieben werden können.

Troubleshooting I2C - Fehler, Probleme und Lösungen

Wenn nach dem Aufbau und der Programmausführung etwas nicht funktioniert, dann muss Du Dich auf die Fehlersuche begeben.

Beliebte Fehler sind:

  • Die Leitungen für SDA und SCL sind vertauscht.
  • Im Programmcode wurden für SDA und SCL die hardwareseitigen GPIO-Pins und nicht die logischen GPIO-Nummern angegeben.

Probleme mit dem I2C sind immer mit Fehlermeldungen in der Kommandozeile verbunden. Die sind nicht immer einfach zu interpretieren.

Anwendungen mit dem I2C

Was kann man mit dem I2C alles machen? Grundsätzlich geht es immer darum, externe Komponenten mit dem Raspberry Pi Pico zu verbinden.

Weitere verwandte Themen:

Elektronik-Sets für das Hardware-nahe Programmieren

Elektronik-Sets für das Hardware-nahe Programmieren

Programmieren mit dem Raspberry Pi Pico
Online-Meeting

Programmieren mit dem Raspberry Pi Pico

Besuchen Sie unser fast monatlich stattfindendes Online-Meeting PicoTalk und lernen Sie uns kennen. Die Teilnahme ist kostenfrei.

Termine und Newsletter-Anmeldung

Frag Elektronik-Kompendium.de