Hallo zusammen, Ich benutze das erste Mal die i2c Library und habe eine Verständnisfrage zu dem Beispiel in i2cmaster.h: Definiert ist: #define Dev24C02 0xA2 // in i2cmaster.h #define I2C_READ 1 // in i2cmaster.h #define I2C_WRITE 0 // in i2cmaster.h Im Beispiel steht: i2c_start_wait(Dev24C02+I2C_WRITE); // set device address and write mode Dev24C02+I2C_WRITE ist nach meiner Rechnung 0xA2 + 0 = 0xA2 (8 bits) Dev24C02+I2C_READ ist nach meiner Rechnung 0xA2 + 1 = 0xA3 (8 bits) ok, das funktioniert! Das letzte bit ist 0 oder 1, davor steht die Adresse. Was ist aber bei einer Adresse wie 0x44 ? Da ergibt die Rechnung ja nur 7 bits: 0x44 + 0 = 0x44 (7 bits) 0x44 + 1 = 0x45 (7 bits) Sollte das nicht (Adresse << 1) bzw (Adresse << 1 + 1) heissen ? Eigentlich ist die Adresse von einem 24C02 EEPROM ja auch 0x50 bis 0x57.
Beitrag #6541713 wurde vom Autor gelöscht.
I2cVersuch schrieb: > Sollte das nicht (Adresse << 1) bzw (Adresse << 1 + 1) heissen ? > Eigentlich ist die Adresse von einem 24C02 EEPROM ja auch 0x50 bis 0x57. Trick ist, dass die Adresse, die 7bit breit ist, als 8bit bereits um 1 nach links geschoben, definiert wird. Das ist in diversen IC-Datenblättern aber mal so, mal so angegeben. Musst du als findiger Entwickler selber rausfinden... Dass bei dir die Adresse 0x44 bzw. 0x45 auch nur 7bit hat, kann 2 Ursachen haben - sie wurde nicht um 1 geschoben definiert(also 0x88 und 0x89 zu benutzen) - sie wurde bereits um 1 geschoben definiert, aber hat halt führende Nullen. (Ich wohne zum Beispiel in der Hausnummer 7, der Postbote kann mir einen Brief nicht zustellen, weil dort die Hausnummer 0007 angegeben ist? Ja, doofes Beispiel) mfg mf
:
Bearbeitet durch User
Manchamal wird mit 8 Bit I2C Adressen gearbeitet A7.A6.A5.A4'A3.A2.A1.A0 wobei A0 das R/W Bit ist z.B. 1010'0010 => 0xA2 (read) / 0xA3 (write) Manchmal wird auch nur die 7 Bit Adresse verwendet. z.B 1010'001 => 0x51 Das R/W Bit muss dann sepeart zuzugefrickelt werden
Christian H. schrieb im Beitrag #6541713: > Die Adresse ist IMMER nur 7-Bit lang. Das 8. Bit wird als R/W-Flag > verwendet. Wenn man die R/W-Steuerung manuell erledigt, muss man sich auch selebr um das Flag kümmern. Es ist das LSB. Dann kann es sein, dass die Adresse noch um ein Bit nach links verschoben werden muss.
I2cVersuch schrieb: > Sollte das nicht (Adresse << 1) bzw (Adresse << 1 + 1) heissen ? > Eigentlich ist die Adresse von einem 24C02 EEPROM ja auch 0x50 bis 0x57. Richtig. Irgendwo auf dem weiten Weg vom #define bis zum Pin muss die Adresse um 1 Bit verschoben werden. Der Programmierer, der nur ein EEPROM lesen will, sollte davon allerdings nichts merken. Idealerweise sollte der die i2c_start() garnicht selbst aufrufen müssen; notfalls sollte die eher so definiert sein:
1 | int i2c_start (i2c_ch_struct *chan, int ads, int rw); |
Es ist übrigens offiziell, dass die Adresse im #define nur 7 hat. Das I2C-Manual UM10204 sagt:
1 | 3.1.10 The slave address and R/W bit |
2 | Data transfers follow the format shown in Figure 9. After the START |
3 | condition (S), a slave address is sent. This address is seven bits |
4 | long followed by an eighth bit which is a data direction bit (R/W) |
Achim M. schrieb: > Trick ist, dass die Adresse, die 7bit breit ist, als 8bit bereits um 1 > nach links geschoben, definiert wird. Das ist in diversen > IC-Datenblättern aber mal so, mal so angegeben. Chips ohne vernünftiges Datenblatt kauft man auch nicht. Dem Hersteller sollte man trotzdem eine Chance geben, TI hat es beim PCF8574 noch falsch gemacht, bei den PCA9xxx ist es nicht nur richtig, sondern sogar zusätzlich in Dezimal angegeben. Menschen mit zehn Fingern sollten überhaupt mehr dezimal schreiben, bei Hex denkt man immer gleich an 8 Bit.
Achim M. schrieb: > Das ist in diversen > IC-Datenblättern aber mal so, mal so angegeben. Musst du als findiger > Entwickler selber rausfinden... Was heißt hier "selber rausfinden"? Steht üblicherweise beschrieben oder als Bildchen im Datenblatt.
HildeK schrieb: > Steht üblicherweise beschrieben oder als Bildchen im Datenblatt. Ja, so habe ich es auch gemacht. Und meine I2c Adresse war eben 0x44. Aber, daß ich erst mal rausfinden musste, daß eine Adresse eben nicht unbedingt eine Adresse ist, war mir nicht klar. Und die im Beispiel definierte Adresse ist eben keine Adresse, obwohl sie als solche bezeichnet ist, sondern bereits ein Write Command mit Write bit. Die Darstellung ist etwas verwirrend. Aber schönen Dank an Euch alle.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.