31.03.2013

I²C mit dem Raspberry Pi, Problem mit "repeated start"

I²C-Bus - wofür?

Der I²C-Bus (Inter-Integrated-Circuit) wurde von Philips zunächst entwickelt, um mit einem geringen Pin-Count ICs innerhalb von Geräten miteinander kommunizieren zu lassen. Später brachten auch andere Hersteller Chips mit I²C auf den Markt. Seit 2006 werden auch keine Lizenzgebühren mehr verlangt, so daß I²C inzwischen sehr verbreitet ist. Im PC wird er z.B. für Temperatursensoren auf dem Motherboard verwendet oder auch zur Identifikation von VGA-Monitoren oder SDRAM-Riegeln.

Sensoren

Ein sehr interessanter Anwendungsfall für den Raspberry Pi sind Auswertungen/Erfassung von physikalischen Größen. Dafür gibt es sehr viele Sensoren, die ebenfalls eine I²C-Schnittstelle haben. Darunter welche für Temperatur, Druck, Magnetfeld (Kompass), Luftfeuchte und vieles mehr. Wem das nicht ausreicht, kann Analog-Digital-Converter (ADCs) per I²C anschließen.

Hardware-Unterstützung

Der Raspberry Pi hat den Broadcom-BCM2835-Chip als Video-Prozessor an Bord, der auch die GPIO-Pins ansteuert, die dann über eine Stiftleiste zugänglich sind. Zusätzlich hat er direkte Hardware-Unterstützung für I²C, die auch direkt über den Linux-Kernel erschlossen ist (/dev/i2c).

Kernel-Modul für I²C

Um I2C via Kernel zu benutzen, braucht dieser das Modul i2c-bcm2708. Das ist bei Linux wheezy per Default disabled, deshalb muß in der Datei

/etc/modprobe.d/raspi-blacklist.conf

Der blacklist-Eintrag für das Modul entfernt oder auskommentiert werden.

Nach dem nächsten Reboot wird das Modul geladen.

Tools

Als nächstes installiert man am besten die i2c-tools mit

sudo apt-get update && apt-get install i2c-tools

wenn ein Gerät am Bus angeschlossen ist, sieht man es mit

i2cdetect -y 1 (RasPi mit 512MB RAM)
bzw
i2cdetect -y0 (für den alten 256MB-Raspi)

Mit i2cget und i2cdump kann man sich nun die Register der angeschlossenen Devices auf dem Bus ansehen, mit i2cset lassen sich Werte speichern.

So weit so gut, ich konnte einwandfrei ein EEPROM (Firmware eines Bluetooth-Keyboards) auslesen, aber ein Thermosensor MLX90614 zeigte sich sehr zickig:

Problem mit "Repeated Start"

Symptom: i2cdetect erkennt den Sensor an Adresse 0x5a.
i2cdump liefert unsinnige Werte :-(

Andere haben das Problem auch, es liegt daran, daß das Kernelmodul bzw der BCM2835-Chip nicht die I²C-Repeated-Start-Sequenz unterstützt, die vom MLX90614 aber benötigt wird.

Somit fällt der Weg, diesen Sensor über das BCM-Kernelmodul anzusprechen, zunächst mal flach :-(