Raspberry Pi multiple I2C bus

Aus Laub-Home Wiki

Der I2C Bus ist eigentlich dafür gedacht, via SDA und SCL mehrere Devices (zum Beispiel Sensoren) anzusteuern. Kommt es allerdings dazu, dass zum Beispiel ein Device verwendet wird, dessen Device Adresse sich nicht via Jumper ändern lässt und man keinen Multiplexer (Hardware) verwenden möchte, so kann man einen oder mehrere I2C Busse am Raspberry Pi aktivieren. Dafür werden einfach weitere GPIO Pins als SDA / SCL zusammen als Bus definiert. Das Ganze wird in der Datei /boot/config.txt konfiguriert.

Der Standard Bus hat die Nummer 1. Will man einen Zweiten Bus hinzufügen muss dieser die Bus ID 4 bekommen, der Dritte dann die 3. Man darf niemals den Bus 0 und 2 verwenden!

Sollten noch weitere Busse benötigt werden können diese die Nummern 7, 6 und 5 bekommen! Immer mit dem höchsten beginnen!

Konfiguration 2ter Bus

Hier nun ein Beispiel wie man einen weiteren Bus hinzufügt. Aber zuerst, falls noch nicht geschehen, aktivieren wir den i2c Bus:

raspi-config nonint do_i2c 0

nun können wir einen ersten Test wagen um zu schauen ob wir einen Bus angezeigt bekommen:

i2cdetect -l

sollte dann diese Ausgabe ergeben:

i2c-1	i2c       	bcm2835 (i2c@7e804000)          	I2C adapter

Nun fügen wir mittels /boot/config.txt einen 2ten I2C Bus (ID 4) hinzu, der die beiden GPIO Pins 17 (als SDA) und 27 (als SCL) mappt. Einfach unterhalb von dtparam=i2c_arm=on die Zeile einfügen: /boot/config.txt

dtoverlay=i2c-gpio,bus=4,i2c_gpio_sda=17,i2c_gpio_scl=27

dann den Raspberry Pi Neustarten:

reboot

Nach dem Neustart können wir testen ob der neue Bus (4) verfügbar ist:

i2cdetect -l

nun sollten wir zwei sehen:

i2c-1 i2c bcm2835 (i2c@7e804000) I2C adapter i2c-4 i2c 4.i2c I2C adapter

hat man nun an beiden Bussen Devices angeschlossen kann man deren Adresse auslesen:

#für Bus 1:
i2cdetect -y 1
#für Bus 4:
i2cdetect -y 4

nun sollte man bei beiden in etwa so etwas sehen (Device Adresse hier wäre die 23):

    0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f

00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- 23 -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --

Konfiguration weiterer Busse

Nun kann man das obige Beispiel einfach erweitern. Zum Beispiel:

/boot/config.txt

dtoverlay=i2c-gpio,bus=7,i2c_gpio_sda=10,i2c_gpio_scl=9
dtoverlay=i2c-gpio,bus=6,i2c_gpio_sda=19,i2c_gpio_scl=26
dtoverlay=i2c-gpio,bus=5,i2c_gpio_sda=16,i2c_gpio_scl=20
dtoverlay=i2c-gpio,bus=4,i2c_gpio_sda=17,i2c_gpio_scl=27
dtoverlay=i2c-gpio,bus=3,i2c_gpio_sda=23,i2c_gpio_scl=24

Folgendes wird hier gemappt:

BUS ID SDA SCL
7 GPIO10 GPIO9
6 GPIO19 GPIO26
5 GPIO16 GPIO20
4 GPIO17 GPIO27
3 GPIO23 GPIO24

nun können wir nach einem Neustart prüfen ob die Busse da sind:

i2cdetect -l

bringt dann folgendes Ergebnis:

i2c-3	i2c       	3.i2c                           	I2C adapter
i2c-1	i2c       	bcm2835 (i2c@7e804000)          	I2C adapter
i2c-6	i2c       	6.i2c                           	I2C adapter
i2c-4	i2c       	4.i2c                           	I2C adapter
i2c-7	i2c       	7.i2c                           	I2C adapter
i2c-5	i2c       	5.i2c                           	I2C adapter

Auslesen Multipler Busse via Adafruit

Hat man vor die Sensoren via Adafruit Circuit Python Libraries auszulesen wird man schnell merken dass diese nur den Standard I2C Bus auslesen können. Mit diesem kleinen Workaround macht man auch die Adafruit Libraries für die anderen Busse verfügbar. Dafür muss man die Datei pin.py um die neuen Busse ergänzen. Die Datei findet man bei globaler Installation hier:

  • /usr/local/lib/python3.7/dist-packages/adafruit_blinka/microcontroller/bcm283x/pin.py

Bei einer User Installation der Library (pip3 install --user) hier:

  • ~/.local/lib/python3.7/site-packages/adafruit_blinka/microcontroller/bcm283x/pin.py

Am Ende der Datei findet sich ein Abschnitt mit i2cPorts = (. diesen muss man um die neuen Busse ergänzen (hier Bus 3 und 4):

i2cPorts = (
    # Modified system I2C config per /boot/config.txt
    (4, 27, 17),
    (3, 24, 23),
    (3, SCL, SDA),
    (1, SCL, SDA),
    (0, D1, D0),  # both pi 1 and pi 2 i2c ports!
)

Danach kann man ganz normal die Library verwenden:

Quellen