weidner/archives/2012/03/

Annäherung an den I²C-Bus

Der I²C-Bus ist eine Schnittstelle, mit der ich elektronische Komponenten in einem System entkoppeln und mit ihnen kommunizieren kann. Das ist insbesondere für die modulare Entwicklung von elektronischen Schaltungen vorteilhaft. Im PC sind beispielsweise etliche Sensoren über diesen Bus ansprechbar.

Da ich hin und wieder mit elektronischen Schaltungen experimentiere, wollte ich mich schon seit längerem in dieses Thema einarbeiten. Am liebsten mit einem Experiment. Es gibt etliche Schaltkreise, die die unterschiedlichsten Funktionen erfüllen und via I²C angesprochen werden können. So kann ich zum Beispiel mit dem PCF8574 acht Leitungen als binären Eingang oder Ausgang betreiben, der PCF8591 wiederum enthält vier A/D-Wandler und einen D/A-Wandler. Diesen Schaltkreis habe ich auch in meinem Experiment verwendet. Datenblatt und Bezugsquellen gibt es zum Beispiel bei Octopart.

Als Hardware habe ich wieder auf ein ALIX 2D3 Board zurückgegriffen, weil bei diesem der I²C-Bus gut zugänglich und dokumentiert ist. Zusätzlich benötigte ich neben dem PCF8591 nur noch zwei Potentiometer, einen Widerstand und ein paar Pfostenstecker/-buchsen zum Verbinden mit dem ALIX. Und natürlich ein Breadboard, um alles mal eben zusammenzustecken.

Die Test-Schaltung sieht so aus:

Schaltplan zum Test mit PCF8591

Der Steckverbinder rechts unten geht an Pins 1-4 von Steckverbinder J13 am ALIX-Rechner.

Auf dem Breadboard sah es etwa so aus:

Testaufbau mit PCF8591

Für die einfache Abfrage des I²C-Busses unter Linux gibt es die i2c-tools, die ein paar Kommandozeilenprogramme zum Schreiben und Lesen auf dem I²C-Bus sowie zum Detektieren von Geräten am Bus enthalten. Diese arbeitem mit der Device-Schnittstelle des Linuxkernels, für die ich das entsprechende Modul laden muss.

# modprobe i2c-dev

Dann wird automatisch für jeden I²C-Bus am Gerät eine Gerätedatei unter /dev/ angelegt, beim ALIX /dev/i2c-0 für den ersten und einzigen Bus. Falls es nicht automatisch angelegt wird, kann ich das Gerät auch mit mknod von Hand anlegen:

# mknod /dev/i2c-0 c 89 0

Mit i2cdetect kann ich verifizieren, ob meine Schaltung am I²C-Bus gefunden wird. Der PCF8591 sollte mit obiger Schaltung an Adresse 49 hex auftauchen:

# i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- 49 -- -- 4c -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

Die Daten selbst kann ich mit i2cget abfragen. Dabei muss ich beachten, dass die angeforderten Daten immer erst mit dem nächsten Lesezugriff kommen (vergleiche dazu das Datenblatt). Der erste Wert nach dem Einschalten ist laut Datenblatt immer 0x80.

# i2cget 0 0x49 0x40
0x80
# i2cget 0 0x49 0x41
0xff
# i2cget 0 0x49 0x42
0x20
# i2cget 0 0x49 0x43
0x00
# i2cget 0 0x49 0x40
0x73

Bei diesem Aufruf bezeichnet 0 den ersten I²C Bus, 0x49 den PCF8591 und 0x40 .. 0x43 jeweils das auf dem Bus gesendete Control Byte (siehe Datenblatt). Das Control Byte legt fest, wie die A/D-Wandler für die Messung verschaltet werden. Mit 0x40..0x43 kann ich die vier Kanäle bei Single Ended Input abfragen.

Die Schaltung und die Zeichnung oben habe ich übrigens mit Fritzing angefertigt. Mit dieser Software kann ich unter einer Oberfläche die Zeichnung vom Breadboard, den Schaltplan und den Leiterplattenentwurf bearbeiten und Änderungen in einem der drei spiegeln sich bei den anderen wider. Für solche kleinen Projekte wiegen diese Vorteile die etwas mühselige Bearbeitung des Schaltplanes auf. Auch das Erstellen eines PCF8591 als Bauteil (den gab es noch nicht in der Bibliothek) ging relativ einfach, auch wenn der neu Erstellte durchaus noch etwas Verfeinerung vertragen könnte.

Posted 2012-03-30
Tags: