Forum: Mikrocontroller und Digitale Elektronik i2c Peter Fleury


von I2cVersuch (Gast)


Lesenswert?

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.
von Achim M. (minifloat)


Lesenswert?

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
von Mike (Gast)


Lesenswert?

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

von STK500-Besitzer (Gast)


Lesenswert?

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.

von Bauform B. (bauformb)


Lesenswert?

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.

von HildeK (Gast)


Lesenswert?

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.

von I2cVersuch (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.