Forum: Mikrocontroller und Digitale Elektronik I2C Verständnisfrage mit Oszi Decoder


von Hallo_world (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe einen uC und ein Stück Software dazu und spreche mit dem 
verschiedene I2C Slaves an.

Im GUI gebe ich eine Slaveadresse, Regsiteradresse und einen Wert an - 
ganz klassisch.

Zuerst bin ich darüber gestolpert, dass die I2C Slave Adresse ja immer 
noch mit 2 multipliziert werden muss, weil das R/W Bit ja noch dazu 
kommt.

Wenn ich also einen Temperatursensor habe und der die Addresse 0x48 hat, 
kann ich auf 0x90 schreiben und auf 0x91 lesen.

Nun habe ich mal mit einem Oszi den I2C Verkehr aufgezeichnet und 
decodiert und habe das Bild im Anhang erhalten.

Ich hätte ja erwartet, dass er zwei direkte Zugriffe auf 0x90 bzw 0x91 
macht.

Beim Schreiben passt das auch alles:

Start - 0x90 slave Adresse -ACK- Register Adresse 0x00 -ACK- Regsiter 
Daten 0x0C -ACK- STOP

Beim Lesen allerdings scheint er einen Umweg zugehen.
Start - 0x90 slave Adresse -ACK- Register Adresse 0x00 -ACK-
START (?) - 0x91 slave Adresse -ACK- Regsiter Daten 0x0C - NACK (weil 
das Regsiter Read only ist!) - STOP

Der Lesevorgang sieht irgendwie komisch aus.
Müsste es nicht auch wie beim Schreiben aussehen?
Oder schreibt der Master erst die Leseadresse zum Slave, wartet dann 
darauf, dass die Daten bereitgestellt werden, der Slave sendet dann das 
START und dann wird von der 0x91 gelesen?

Ist das Verhalten normal und kann ich auf diese Art und Weise sämtliche 
7bit Addressen Devices ansprechen, oder hatte ich einfach bei dem 
Temperatursensor Glück?

Ich hätte ja im GUI erwartet, dass ich die 0x48 eingebe und er dann je 
nach Lesen oder Schreiben eine 0 oder eine 1 anhängt. Da hat der 
Programmierer wohl anders gedacht und man muss die im Datenblatt 
angegebene I2C slave Adresse noch "umrechnen".

Vielen Dank!

von Maxim B. (max182)


Lesenswert?

Hallo_world schrieb:
> Beim Lesen allerdings scheint er einen Umweg zugehen.
> Start - 0x90 slave Adresse -ACK- Register Adresse 0x00 -ACK-
> START (?) - 0x91 slave Adresse -ACK- Regsiter Daten 0x0C - NACK (weil
> das Regsiter Read only ist!) - STOP
>
> Der Lesevorgang sieht irgendwie komisch aus.

Register Adresse sollte doch zuerst von Master zu Slave übertragen 
werden - deshalb zuerst Schreibvorgang. Um zum Lesen zu wechseln, 
braucht man Restart mit Lesen-Bit. Dann kann man aber keine Adresse 
übertragen, man kann nur von Slave lesen.
Letzte NACK ist von Master, weil Master nur 1 Byte lesen will.
So ist das.

Hallo_world schrieb:
> Ich hätte ja im GUI erwartet, dass ich die 0x48 eingebe und er dann je
> nach Lesen oder Schreiben eine 0 oder eine 1 anhängt. Da hat der
> Programmierer wohl anders gedacht und man muss die im Datenblatt
> angegebene I2C slave Adresse noch "umrechnen".

Man muß nichts umrechnen. Die Adresse von Slave sollte nur um 1 bit nach 
links verschoben werden, da bit 0 Schreiben/Lesen bestimmt, Adr.0 = bit 
1, Adr.1 = bit 2 usw. So ist I2C gemacht.

: Bearbeitet durch User
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.