Zurück | (C) Christof Ermer, Regensburg |
|
|
25.02.2014 07.24 |
TWDR = address; //In addition to the 8-bit TWDRI2C versucht also Adree als 8 Bit zu senden und nicht als 7 Bit Adresse:
gesendet wird folgedessen auch die führende Null,
und das ist Falsch, wenn der I2C Baustein das als 7 Bit Code intepretiert und wie im Bsp 1111000 sehen will.
Aus einem Artikel:
Ich lese ich die Bitsequenz
1
<Start><0><0><1><1><1><1><0><write><nack>
Es gibt eine Konfusion, wie Hersteller die slave address in der Doku
angeben - mit/ohne RW-Bit, mit ohne Shift nach links...
http://www.totalphase.com/support/kb/10039/
Ich gehe davon aus, dass die 0x1D in der Freescale Doku eine korrekte
7-Bit ([6:0]) Adresse ist. D.h. 1 zeigt nicht die I2C slave address
$1D, wie sie in der Freescale Doku beschrieben ist (S. 16), sondern die
slave address $1E.
Ich hätte das folgende Muster erwartet:
2
<Start><0><0><1><1><1><0><1><write>...
Die Fleury-I2C-Lib schickt die an i2c_start übergebene Adresse (inkl.
RW-Bit) 1:1 and die TWI Schnittstelle. D.h. man muss sich um das Shiften
der slave address um 1 Bit nach links selbst kümmern. Ich würde das
deshalb bei der Definition berücksichtigen - Adresse aus der Doku der
Lesbarkeit halber eintragen und gleich 1x shiften.
#define MMA7455_SLAVE_ADDRESS (0x1D<<1) |
Mit der Zeit wurden es immer mehr Geräte und es gab schon vorher Überschneidungen von Adressen. Glücklicherweise hat Philips die Slave-Adressen 11111xxx als "reserved" markiert, also konnte man jetzt eine Erweiterung der Adressierung einführen, ohne dabei die 7-bit-Geräte zu stören. Im Gegenteil, man kann 7-bit Geräte und 10-bit Geräte an einen Bus hängen!
Bei einer 10-bit-Adresse sieht die Übertragung folgendermaßen aus:
reservierte Adresse | Adresse | R/W | Adresse, 2.Teil | Geräte-Sub-Adresse | ||||||||||||||
Start | 1 | 1 | 1 | 1 | 0 | x | x | 1 | ACK | x | x | x | x | x | x | x | x | ACK |
Die ersten 5 Bit sind die reservierte Adresse "11110" (die Adresse "11111" behält sich Philips weiterhin vor, für weitere Erweiterungen). Dann kommen die letzten 2 Bit (also das MSB) der 10-Bit-Adresse und das Read/Write-Bit. Nun senden mehrere Slaves ihr Acknowledge. Nun überträgt der Master die letzten 8 Bit der Adresse (also LSB). Jetzt meldet sich nur noch ein Slave mit einem Acknowledge und die restliche Übertragung kann wie bei der 7-Bit-Adressierung vorgenommen werden.