Datum:
Hallo, ich versuche mich mit dem I2C Bus, doch leider klappt es nicht wie es soll. Vorneweg, der Bus scheint in Ordnung zu sein, ich kann über den entsprechenden Treiber die Temperatur eines LM75 über I2C auslesen. Ich arbeite auf einem PPC405GPr. Doch wenn ich ohne Treiber direkt darauf zugreifen will, oder auch auf andere Bausteine, dann klappt das nicht. Ich habe zwei Dinge versucht. Erst mit dem Programm i2cdetect: http://www.lm-sensors.org/wiki/man/i2cdetect
i2cdetect -l |
sagt mir
i2c-0 i2c IBM IIC I2C adapter |
Mein Bus ist der i2c-0, soweit alles ok. Doch wenn ich
i2cdetect i2c-0 |
ausführe erhalte ich
Error: I2C bus name doesn't match any bus present! |
:-( Dann habe ich versucht selbst ein paar Zeilen zu coden:
int file;
char *filename = "/dev/i2c-0";
//const gchar *buffer;
if ((file = open(filename, O_RDWR)) < 0) {
/* ERROR HANDLING: you can check errno to see what went wrong */
perror("Failed to open the i2c bus");
exit(1);
}
int addr = 0x93; // Adresse des LM75 0b10010011
if (ioctl(file, I2C_SLAVE, addr) < 0) {
perror("Failed to acquire bus access and/or talk to slave");
/* ERROR HANDLING; you can check errno to see what went wrong */
exit(1);
}
|
Dies bricht ab mit
Failed to acquire bus access and/or talk to slave: Invalid argument |
Hat wer eine Idee was da falsch läuft? Warum "invalid argument"? Und warum funktioniert nicht mal i2cdetect? Vielen Dank, Reto
Datum:
Abgesehen davon, das der Fehler vermutlich in Zeile 42 liegt, was genau hat das mit gcc zu tun? Oliver
Datum:
Reto H. schrieb: > Mein Bus ist der i2c-0, soweit alles ok. Doch wenn ich > i2cdetect i2c-0 > ausführe erhalte ich > Error: I2C bus name doesn't match any bus present! > in deinem Fall muss es heissen:
i2cdetect 0 |
Reto H. schrieb: > Dies bricht ab mit > Failed to acquire bus access and/or talk to slave: Invalid argument Ich tippe mal, dass deine Slave-Adresse nicht stimmt. Du musst die eintragen, die du mit i2cdetect ermittelst... Grundsätzliches zu I2C (unter Linux) mal hier auf dieser Seite: http://bralug.de/wiki/BLIT2008-Board_mit_i2c-tiny-... Grüße Uwe
Datum:
Uwe, danke für den Tipp! Auf das mit dem Bus wäre ich nicht gekommen, macht aber irgendwie Sinn. Und siehe da, i2cdetect funktioniert!
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- 48 UU UU UU 4c 4d -- --
50: -- UU 52 -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- 6a -- -- -- -- --
70: -- -- -- -- -- 75 -- --
|
Nur stimmen die Adressen nicht mit dem überein was ich erwartet hätte. Ich weiss von devices an den Adressen 49, 4a, 4b und 51... Hm... und was bedeutet UU? Na gut, ein weiterer Leseversuch von Adresse 0x91 und 0xA5 aber immer noch der selbe Fehler: "invalid argument". Doch welches? Am "int addr" wird es wohl nicht liegen, oder? Ist mit meinem "file" etwas nicht in Ordnung? Oder ein falches include, sodass "I2C_SLAVE" nicht stimmt? Habe "i2c-dev.h" includiert. Hat wer ne weitere Idee? Danke!
Datum:
Hm, mir fällt gerade auf die mit UU sind genau die Adressen, die über einen Treiber laufen: 49, 4a, 4b und 51... Und im Code steht UU bedeutet EBUSY. Sind die wohl mit dem Treiber beschäftigt und so kann ich nicht gleichzeitig darauf zugreifen? Aber auf die anderen, z.B. 0x91 oder 0xA5 sollte ich doch problemlos zugreifen können?
Datum:
int addr = 0x93; // Adresse des LM75 0b10010011 |
Als ich das letzte Mal mit I²C Adressen gearbeitet habe, waren die 7 Bits lang. Dazu kommt ein R/W Bit. Der Wert 0x93 sieht eher nicht wie eine gültige Adresse aus - zu viele Bits.
Datum:
Jim Meba schrieb: > Und im Code steht UU bedeutet EBUSY. Sind die wohl mit dem Treiber > beschäftigt und so kann ich nicht gleichzeitig darauf zugreifen? > wie du richtig erkannt hast, mit UU werden die Devices gekennzeichnet, die zwar erkannt werden, aber bereits durch etwas anderes benutzt werden. Ich vermute mal, dass das Kernelmodul lm75 am laufen ist. Dieses müsstest du entladen (rmmod lm75). Jim Meba schrieb: > Als ich das letzte Mal mit I²C Adressen gearbeitet habe, waren die 7 > Bits lang. Dazu kommt ein R/W Bit. Der Wert 0x93 sieht eher nicht wie > eine gültige Adresse aus - zu viele Bits. > korrekt, es muss die 7-Bit-Adresse, ohne dem R/W-Bit angegeben werden. Also, wie ich eingangs schon geschrieben hatte, so wie es i2cdetect anzeigt. In deinem Fall also 0x49, 0x4a usw.. Ob das R/W-Bit gesetzt wird, wird intern entschieden, je nach dem ob mit read() oder write() (oder z.B. auch i2cget, i2cset aus den i2c-Tools) zugegriffen wird. Darum musst du dich nicht kümmern. Mit der richtigen Adresse sollte dein Codeschnipsel funktionieren... Grüße Uwe