Polling mit I2C - Auslesen eines Sensorchips

Gast #3043532
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.