Der Raspberry Pi besitzt ein ausgeklügeltes Daten-Bus-System, um mit anderen Geräten und Modulen kommunizieren zu können. Ob Sensoren, Displays, Echtzeit-Uhren oder andere Mikrocontroller – fast alle nutzen I2C, SPI oder UART. In diesem Artikel zeigen wir euch, wie ihr diese Schnittstellen unter Raspberry Pi OS Bookworm korrekt aktiviert und testet.
Was ist I2C?
I2C ist ein serielles Protokoll für ein zweiadriges Interface (Two Wire). Es verbindet Geräte wie EEPROMs, A/D- und D/A-Konverter, Sensoren, Displays und andere ICs über nur zwei Leitungen: SDA (Daten) und SCL (Takt). Ursprünglich von Philips entwickelt, wird es heute von nahezu allen IC-Herstellern verwendet.
Was ist SPI?
Der Serial Peripheral Interface (SPI) Bus ist ein synchrones Datenbus-System, das von Motorola entwickelt wurde. Es funktioniert nach dem Master-Slave-Prinzip und wird für kurze Distanzen eingesetzt – typisch in Embedded-Systemen, Sensoren und SD-Karten.
SPI hat vier Signalleitungen:
- SCLK: Serial Clock (Ausgang Master)
- MOSI: Master Output, Slave Input
- MISO: Master Input, Slave Output
- SS/CE: Slave Select / Chip Enable (aktiv Low)
Was ist UART?
Der Universal Asynchronous Receiver Transmitter (UART) ist eine serielle Schnittstelle, die zum Senden und Empfangen von Daten dient. Die Besonderheit: Es wird kein eigenes Taktsignal benötigt – beide Seiten müssen einfach dieselbe Baudrate verwenden. UART wird oft für serielle Konsolen, GPS-Module oder Kommunikation mit Mikrocontrollern verwendet.
GPIO-Pinbelegung für I2C, SPI und UART
| Schnittstelle | Signal | GPIO-Pin (Board) |
|---|---|---|
| I2C | SDA (I2C1) | Pin 3 |
| I2C | SCL (I2C1) | Pin 5 |
| UART | TX | Pin 8 |
| UART | RX | Pin 10 |
| SPI | MOSI | Pin 19 |
| SPI | MISO | Pin 21 |
| SPI | SCLK | Pin 23 |
| SPI | CE0 | Pin 24 |
| SPI | CE1 | Pin 26 |
I2C und SPI aktivieren per raspi-config (empfohlen)
Der einfachste Weg ist das Konfigurationstool raspi-config. Öffnet ein Terminal und gebt ein:
|
1 |
sudo raspi-config |
Navigiert zu 3 Interface Options. Dort findet ihr:
- I4 SPI – SPI aktivieren
- I5 I2C – I2C aktivieren
Wählt die gewünschte Schnittstelle, bestätigt mit Yes und startet den Pi neu:
|
1 |
sudo reboot |
I2C und SPI aktivieren per config.txt (Headless / Bookworm)
Wer keinen Desktop verwendet oder headless arbeitet, kann die Schnittstellen direkt in der Konfigurationsdatei aktivieren. Seit Raspberry Pi OS Bookworm liegt diese unter /boot/firmware/config.txt (nicht mehr unter /boot/config.txt):
|
1 |
sudo nano /boot/firmware/config.txt |
Fügt am Ende der Datei folgende Zeilen hinzu:
|
1 2 3 4 5 |
# I2C aktivieren dtparam=i2c_arm=on # SPI aktivieren dtparam=spi=on |
Speichert mit STRG+X, Y, Enter und startet neu:
|
1 |
sudo reboot |
Hinweis: Die früher verwendeten Methoden mit /etc/modules (i2c-bcm2708, spi-bcm2708) und /etc/modprobe.d/raspi-blacklist.conf existieren in Bookworm nicht mehr. Alles läuft jetzt über Device Tree Overlays in der config.txt.
I2C testen mit i2cdetect
Nach dem Neustart installiert ihr die I2C-Tools und prüft, ob ein angeschlossenes Gerät erkannt wird:
|
1 2 |
sudo apt install i2c-tools -y sudo i2cdetect -y 1 |
Die Ausgabe zeigt eine Matrix mit den I2C-Adressen aller gefundenen Geräte. Eine RTC wie der DS1307 erscheint z.B. unter Adresse 68:
|
1 2 3 4 5 |
0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- ... 60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- |
Seht ihr keine Ausgabe, überprüft eure Verkabelung und ob I2C korrekt aktiviert ist.
SPI testen
Nach dem Aktivieren von SPI sollten die Gerätedateien vorhanden sein:
|
1 |
ls /dev/spi* |
Ihr solltet /dev/spidev0.0 und /dev/spidev0.1 sehen. Ist das der Fall, ist SPI korrekt aktiv.
Python-Beispiel mit smbus2 (I2C)
Die alte Bibliothek i2c-bcm2708 aus früheren Anleitungen wird nicht mehr verwendet. Für Python nutzt ihr heute smbus2:
|
1 |
pip install smbus2 |
Ein einfaches Beispiel, das einen Wert von I2C-Adresse 0x68 (z.B. eine RTC) liest:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#!/usr/bin/env python3 import smbus2 # I2C Bus 1 (Standard beim Raspberry Pi) bus = smbus2.SMBus(1) # Adresse des Geräts (z.B. DS1307 RTC unter 0x68) DEVICE_ADDRESS = 0x68 # Sekunden-Register (Register 0) auslesen sekunden = bus.read_byte_data(DEVICE_ADDRESS, 0) print(f"Sekunden-Register (BCD): 0x{sekunden:02X}") bus.close() |
Tipp: Für komplexere I2C-Projekte lohnt sich ein Blick auf die Bibliothek adafruit-circuitpython-busdevice, die viele Sensoren out-of-the-box unterstützt.
UART aktivieren
Das Aktivieren von UART unterscheidet sich etwas von I2C und SPI, da beim Raspberry Pi standardmäßig die serielle Konsole auf dem UART liegt. Wie ihr UART korrekt einrichtet, haben wir in einem separaten Artikel beschrieben: UART auf dem Raspberry Pi aktivieren.




