Zurück (C) Christof Ermer, Regensburg


25.02.2014
07.24



I2C Bus für 127 Geräte am M ikrocontroller
Ein 2-Leiter Bus mit einem Pullup ( 4K7) mit dem "einer, oder mehrere" externe Bausteine an nur 2 Drähten angesprochen werden können.  

SCL  serial Clock   
SDA serial Data

Jeder Baustein erhält eine Adresse, auf die dieser reagiert.

Die AVR Bibliothek dazu gibtes bei:
http://homepage.hispeed.ch/peterfleury/group__pfleury__ic2master.html
oder http://homepage.hispeed.ch/peterfleury/group__pfleury__ic2master.html

sonst  verweise ich auf Wikipedia http://de.wikipedia.org/wiki/I2C
oder:  http://www.mikrocontroller.net/articles/I2C
http://www.elektronik-magazin.de/page/der-i2c-bus-was-ist-das-21
Hier noch eine schöne PDF die den RS2322 und I2C Bus erklärt :  Schnittstellen.pdf


WICHTIG!  Gefährdung entdeck,  wie die Slave Adressung  schief gehen könnte.        25.03.2014

Die I2C Bilbliothek von Peter Feury  schreibt die Bsp. Adresse 0x87 = 0b01111000 auch genaus in das TWDR Register rein... also mit Führender 0.
TWDR = address;   //In addition to the 8-bit TWDR
I2C versucht also Adree als 8 Bit zu senden und nicht als 7 Bit Adresse:
siehe auch :    http://www.totalphase.com/support/kb/10039/

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.

manche I2C Bausteine lesen aber 7 Bit Adressen, und wollen 0b1111000  gür 0x78 (ohne führende 0), so wie Ursprünglich definiert...
Also ist bei Benutzung die Adresse um eins  nach links zu shiften und eine 0 anzuhängen

#define PT1000_MODUL_ADR    0x78  = 0b01111000 = FALSCH weil 8 Bit Adresse
RICHTIG IST #define PT1000_MODUL_ADR   ( 0x78 << 1)   ist  0b11110000

ANWENDUNG:
ret = i2c_start(  (0x78 << 1) + I2C_READ );   um an Adresse 0x78 zu lesen
oder gleich direkt zu wandeln..
ret = i2c_start( 0b11110000 + I2C_READ ); 

S0 wird aus 0x78 ein 0xF0
0b01111000   um eins nach links...
0b11110000
Mit einem Oszillographen kan das direkt gelesen werden
Korrekt..7BIT ..0b11110000  für 0x78
MSB to LSB

Wrong. 8BIT....0b011110000  für und ist 0x78  man sieht die 0 un der längeren Low Phase am Anfnag
MSB to LSB

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)




10-bit-Adressen..... How to...

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.




Hier sammele ich einfacherweise die Scans eines alten Artikels: