Forum: Mikrocontroller und Digitale Elektronik I2C Bus Adressierung


von john (Gast)


Lesenswert?

Hi,

ich habe gerade eine kleine Verständnisschwierigkeit. Genauer gesagt 
geht es um die Adressierung bei einem I2C Bus.
Die Adresse besteht ja aus 7 bit, dann folgt das R/W bit.
Habe ich z.b. die Slave Adresse 0x53, ist das binär ja 1010011, also 7 
bit. Daran muss ja noch das R/W bit angehängt werden. Nur wie mache ich 
das am besten in C?
Ich habe mir den Quellcode von Peter Fleury angeschaut, und dort steht 
folgendes:
1
#define I2C_READ    1
2
#define I2C_WRITE   0
3
i2c_start(0x53+I2C_WRITE);

Aber 0x53+0 = 0x53, also ist es ja immernoch 7 bit lang.
Irgendwie komme ich gerade nicht weiter, wie man das am besten löst.

Danke für eure Hilfe

john

von Julian R. (tuefftler)


Lesenswert?

Bei I2C screiben, schickst du einfach die Adresse wie sie ist und beim 
lesen "oderst(OR)" du dir ein siebtes bit dazu:
1
i2c_start(0x53)//schreiben
2
i2c_start(0x53 | 0x80)//lesen

von Hugi (Gast)


Lesenswert?

Du weist schon, dass ein Hex zeichen einem Nibbel und somit 4 Bit 
entspricht?
0x53h = 01010011b
Wenn Du nun 0x53h + 1d machst, dann bekommst Du 01010100b also 0x54h.

Grüße

von Michel (Gast)


Lesenswert?

john schrieb:
> i2c_start(0x53+I2C_WRITE);

Merkwürdig...

Wenn er in test_i2cmaster.c z.b. schreibt:

#define Dev24C02  0xA2      // device address of EEPROM 24C02,
i2c_start(Dev24C02+I2C_WRITE);

ist 0xA2 offensichtlich schon die um eins nach links geschobene 7-Bit 
Adresse (0x51).

In deinem Fall für 7-Bit Adresse 0x53 wäre das dann

i2c_start( (0x53<<1) | I2C_WRITE);   // Verschiebung 1 nach Links

Die Schreibweise "+" läuft wenn alles richtig ist, auf das gleiche 
hinaus, aber z.B.

Hugi schrieb:
> Wenn Du nun 0x53h + 1d machst, dann bekommst Du 01010100b also 0x54h.

gibt beim Zusammenbauen des I2C-Adressierungsbytes Unfug.

von Klaus (Gast)


Lesenswert?

Leider gibt es bei der I2C Adressierung einige Verwirrung. In der Spec 
wird von einer 7 Bit Adresse gesprochen, und wird mal binär und mal hex 
dargestellt. Soweit, so gut. Leider liegt diese Adresse auf den oberen 
7 Bit des Adressbytes. Wenn ich das Adressbyte also in hex darstelle, 
finde ich dort die Adresse << 1, und im unterste Bit ist das R/W Bit.

Nun gibt es Libraries und auch Chipdokumentationen, die betrachten das 
ganze Byte als Adresse. Jeder I2C Slave hat dann zwei Adressen, je nach 
gesetztem unteren Bit zu Schreiben oder zum Lesen. Auch diese 
Darstellung hat ihre Logik.

In diesem Durcheinander haben sich schon viele verfangen.

MfG Klaus

von 5euioagk (Gast)


Lesenswert?

Die I2C-Spezifikation spricht eindeutig von einer 7-Bit langen Adresse.

Die Eigendefinition als "Schreib-" und "Lese-Adresse" ist daher absolut 
falsch.

Dass die Adresse 7 Bit lang ist und beim Adressieren (also der Vorgang)
im übertragenden Byte noch die Zugriffsrichtung mit angegeben wird, 
macht nicht plötzlich aus einer 7-Bit-Adresse eine 8-Bit-Adresse (und 
auch keine Lese- und Schreibadresse, s.o.).

Bitte ... Dieser Quatsch ist leider weit verbreitet und man kann darauf 
leider nur immer wieder hinweisen.

Die richtige Sichtweise ist so:

#define I2C_ACCESS_DIRECTION_WRITE 0
#define I2C_ACCESS_DIRECTION_READ  1

/* erstmoegliche Adresse eines EEPROMs vom Typ 24C01 */
#define I2C_ADDRESS_24C01          80


Das zu übertragende erste Byte (siehe I2C-Spezifikation) wäre demnach:

Schreibzugriff
--------------

unsigned char Byte_u8 = (I2C_ADDRESS_24C01 << 1) + 
I2C_ACCESS_DIRECTION_WRITE;


Lesezugriff
-----------

unsigned char Byte_u8 = (I2C_ADDRESS_24C01 << 1) + 
I2C_ACCESS_DIRECTION_READ;


Wenn man auf Bitoperationen steht, kann man das natürlich anstelle zu 
addieren auch verODERn.

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.