I2C

Kommunikation über I2C

Verfügbare Funktionen, die per I2C abgerufen/gesetzt werden können

  • Status Batteriebetrieb abfragen (Ja/Nein)
  • Digital Pin 1 Richtung setzen Ein-/Ausgang
  • Batteriespannung abfragen (Volt)
  • Analog Pin 1-3 Input abfragen (0 – 255)
  • Digital Pin 1 abfragen (0/1)
  • neu: DMX Ausgabe

Aktivieren des I2C Treiber auf dem Raspberry PI

Raspberry Pi kann als Master mit angeschlossenen I2C Geräten kommunizieren. Dazu muss zuerst aber der I2C Bus aktiviert werden.
sudo raspi-config
Danach I2C aktivieren:
5 Interfacing Options -> P5 I2C -> Yes

I2C Kommunikation testen

Angeschlossene Geräte können mit folgendem Befehl aufgelistet werden. (1 = Raspberry Pi Revision B, 0 = Raspberry Pi Revision A)
i2cdetect -y 1
Falls die Kommunikation funktioniert und das TT PI korrekt aufgesteckt ist, so wird das TT PI Board mit der Addresse 11 aufgelistet.
i2cdetect Ausgabe auf Konsole. Adresse 11 = TT PI Microcontroller
Wenn i2cdetect nicht vorhanden ist, können die I2C Tools nachinstalliert werden:
sudo apt-get install i2c-tools

TT PI Raspberry Pi Erweiterungsboard

Raspberry Pi und das Problem mit dem I2C Clock Stretching

Der Broadcom Prozessor (SoC), der auf dem Raspberry Pi verbaut ist, enthält einen schwerwiegenden Fehler, der dazu führen kann, dass die Kommunikation zu manchen I2C-Geräten unmöglich wird oder falsche Daten gelesen/geschrieben werden.
Viele I2C Geräte verwenden das sogenannte I2C Clock Stretching, das “aktiviert” wird sobald das Gerät länger für die Verarbeitung der Daten benötigt – so auch der AVR-Chip, der auf dem TT PI verwendet wird.
Es gibt einige Lösungsansätze, die das Problem umgehen. Der einfachste und aus unserer Sicht zuverlässigste wird in den folgenden Schritten beschrieben.

Verringerung der Geschwindigkeit des I2C Bus von 100k auf 10k

Konfigurationsdatei anpassen:
sudo nano /bood/config.txt
I2C Zeile wie folgt ergänzen:
dtparam=i2c_arm=on,i2c1_baudrate=10000
Datei speichern und Editor verlassen (Ctrl-x, y).
Somit wird der I2C Treiber nach dem nächsten Neustart des Raspberry Pi mit einer Geschwindigkeit von 10k (10000) konfiguriert.
Um die aktuell eingestellte Geschwindigkeit kann mit folgenden Befehlen ausgelesen werden.
pi@raspberrypi:~$ var="$(xxd /sys/class/i2c-adapter/i2c-1/of_node/clock-frequency | awk -F': ' '{print $2}')"
pi@raspberrypi:~$ var=${var//[[:blank:].\}]/}
pi@raspberrypi:~$ printf "%d\n" 0x$var

Wir haben diese Einstellung getestet und 50’000 Lesezyklen ohne Übertragungsfehler hintereinander ausführen können.

Probleme mit der I2C Kommunikation ab Kernel 4.9

Mit dem Linux 4.9 Kernel hat die Raspberry Pi Foundation vom i2c-bcm2708 auf den i2c-bcm2835 Kernel Treiber gewechselt. Der Befehl i2cget funktioniert seither mit dem TT PI Board nicht mehr.
Mit dieser Methode kann der alte Treiber allerdings wieder aktiviert werden:

nano /boot/config.txt
dtoverlay=i2c-bcm2708