Forum: Mikrocontroller und Digitale Elektronik Polling mit I2C - Auslesen eines Sensorchips


von Martin Z. (Gast)


Lesenswert?

Hallo zusammen,

ich beiße mir seit einigen Tagen die Zähne an einem Problem aus und
komme hier einfach nicht weiter. Die Ausgangssituation ist wie folgt.
Ich habe einen PCap01-Chip der Fa. Acam
(http://www.acam.de/products/picocap/pcap01/) um kapazitive Sensoren
auszulesen. Diesen Chip möchte ich mittels eines IGEPv2 Boards /
BeagleBoard Clone
(http://www.isee.biz/products/processor-boards/igepv2-board) auslesen.
Auf dem Board habe ich hierzu Debian Squeeze installiert.

Die Ansteuerung und das Auslesen des PCap01-Chips funktioniert über I2C.
Zu Beginn muss zunächst immer die Firmware und eine Konfiguration in den
SRAM Speicher des Chips gespeichert werden. Der Chip "versteht" nur
einfachste I2C-Kommandos. Das Schreiben der Firmware und Konfiguration
erfolgt derzeit über IOCTL-Befehle der folgenden Art:
1
    // Oeffnen von /dev/i2c-4:
2
3
    bus = open(busname, O_RDWR);
4
5
...
6
7
    // Schreibvorgang:
8
9
    buf[0] = WRITE_COMMAND;
10
    buf[1] = 0x47;
11
    buf[2] = 0xAA;
12
13
    msg[0].addr  = addr;     
14
    msg[0].flags = 0;      
15
    msg[0].len   = 3;        
16
    msg[0].buf   = buf;      
17
                                        
18
    message_package.msgs = msg;
19
    message_package.nmsgs = 1;
20
    ioctl(bus, I2C_RDWR, &message_package);

Im Anschluss wird eine Messung gestartet und ein Statuswort ausgelesen.
Dieses Statuswort weißt darauf hin, dass Kommunikation über den Bus
während der Messung stattgefunden hat und deshalb die Messung
fehlerhafte Werte liefert. Das Auslesen der Messwerte bestätigt dies.

Nach Rücksprache mit dem Hersteller (acam messelektronik GmbH) habe ich
den Hinweis bekommen, dass die gesamte Kommunikation bei I2C mittels
polling erfolgen MUSS, um korrekte Werte zu erhalten. Trotz tagelangem
googlen finde ich keinen Ansatz wie ich z.B. die Abfrage der Messwerte
mittels polling realisieren kann. Aktuell sieht der Code wie folgt aus:
1
    cout << "Messwert: ";
2
3
    buf[0] = 0x40;
4
5
    msg[0].addr = addr;
6
    msg[0].flags = 0;
7
    msg[0].len = 1;
8
    msg[0].buf = buf;
9
10
    msg[1].addr = addr;
11
    msg[1].flags = I2C_M_RD;
12
    msg[1].len = 3;
13
    msg[1].buf = result_buf;
14
15
    message_package.msgs = msg;
16
    message_package.nmsgs = 2;
17
18
    ioctl(bus, I2C_RDWR, &message_package);

Der "Trick" besteht darin, dass die Abfrage des Messwertes in einer
zweiteiligen Message erfolgt.

Irgendwie stehe ich hier ziemlich auf dem Schlauch und hoffe auf
konstruktive Unterstützung.

Vielen Dank und Grüße

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.