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


von Martin Z. (californian)


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

: Verschoben durch Moderator
von Hendrik L. (lbd)


Lesenswert?

Polling ?

Nun ja, der Master ist aktiv und fragt den Slave ab!

Welche Befehle der Master absetzen muss, damit der Slave richtig 
antwortet, muss doch der "Slave-Hersteller" Dir sagen, das ist doch 
immer IC-spezifisch!

Gibt es kein Datenblatt?

Gruß

von Martin Z. (californian)


Lesenswert?

Hallo!

Danke schonmal für die Antwort. Allerdings bin ich jetzt noch etwas 
verwirrter als vorher. Ich bin bisher davon ausgegangen, dass es sich 
beim Polling um eine (Standard-)Methode u.A. in Linux handelt. Da ich ja 
ein user space basiertes Programm schreibe um den IC anzusprechen wollte 
ich auf diese Kernel-Funktionen zugreifen. Bin ich hier völlig auf dem 
Holzweg?

Selbstverständlich gibt es ein Datenblatt vom Hersteller, wodurch sich 
die Struktur der Messages die über I2C gesendet werden ergibt und der 
Slave auch entsprechend antwortet. Mein Verständnis war bisher so, dass 
das Polling im Prinzip dem Senden der Nachricht vorweg geht und somit 
erst bei "freier Leitung" geschrieben oder gelesen wird.

Danke und Gruß

von Hendrik L. (lbd)


Lesenswert?

Hallo,

nee - da irrst Du:

Polling geht (am Bus grundsätzlich so):

Der Master sendet eine Adresse an den Bus UND danach einen "Hinweis", 
welchen Wert er von der angesprochenen Adresse zurückgesendet haben 
möchte.

Danach sendet der Slave den Wert!

Diese (Protokoll-) Vereinbarung kommt vom IC-Hersteller.

Die I2C- Norm legt lediglich fest, wie die Bits, die Adresse, der Wert 
und die Achnowledges über die Leitung gehen. Aber keine Aussage zu 
Inhalten.

Hat auch überhaupt nix mit LINUX zu tun - I2Cwird von LINUX auch nicht 
besonders bevorzugt behandelt. Es hängt viel mehr vom 
Prozessorhersteller ab, ob er eine I2C- Treiber Implementierung 
bereitstellt.

Über BitBanging kann man sich aber die I2C Schnittstelle selbst 
implementieren .... wenn man viel Zeit hat! Nix für Anfänger (wie mich).

Gruß

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.