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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.