Hallo Leute, der I2C-Bus hat es in sich. Waehrend man z.B. ueber SPI unbestraft Daten ins Leere schicken kann, kommt es bei I2C schnell zum Haenger, wenn eine Adresse angesprochen wird, wo nichts dahinten ist. Gibt es eine Methode fuer den Master zuerst abzuchecken, welche I2C-Adressen ansprechbar sind, sprich dran haengt auch was? Geht das auch ohne Timeout? Gruss Dimitri
Wenn man ein I2C Slave ansprechen will, muss ja nach dem START als erstes die (7 oder 10 Bit) Slaveadresse kommen. Wenn dabei kein ACK empfangen wird, ist halt kein Slave vorhanden um zu antworten - da braucht's kein Timeout. Wichtig ist, dass dann der Master ein STOP ausgibt, da sonst andere Bausteine am Bus verwirrt werden könnten.
Gast
#1177010
Moin, wenn ein slave-device da ist, gibt es brav einen ACK zurück. Da ein slave, wenn es ihn nicht gibt, kein clockstretching machen kann, braucht man eigentlich mit sinnvoller taktfrequenz eine startsequenz mit nachfolgender busadresse (im read-mode) auf den bus zu setzen. Wenn sich dann im ACK-Clock nix rührt, ist da auch nix angeschlossen. Sowas wie "warten auf Ack" muss man dann natürlich deaktivieren. Wenn man es geschickt anstellt kann man mit passenden tests sogar die größe zB eines angeschlossenen EEPROMs bestimmen (hab das schonmal irgendwo gebraucht). sah bei mir damals (mit software I²C) so aus (sollte aber eigentlich klar sein):
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
Der Software-I2C hatte kein warten auf ACK, nur clockstretching war vorgesehen.
Dieter Werner wrote: > Wenn man ein I2C Slave ansprechen will, muss ja nach dem START als > erstes die (7 oder 10 Bit) Slaveadresse kommen. Wenn dabei kein ACK > empfangen wird, ist halt kein Slave vorhanden um zu antworten - da > braucht's kein Timeout. > > Wichtig ist, dass dann der Master ein STOP ausgibt, da sonst andere > Bausteine am Bus verwirrt werden könnten. Das klingt gut. Im Falle 24C04 braucht es 2 Bytes, um das EEPROM anzusprechen. Die Device-Adresse ist so ueber beide Byte verteilt. Soll das nun heissen, dass ich nach dem 1. Byte nichts zu erwarten habe und dass ein ACK erst kommt, wenn die ganze Adresse vom Slave geschluckt ist? Dieser Code laeuft so weit:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
Auch ein Dankeschoen an Andreas Lang. /Dimitri
Dimitri M. wrote: > der I2C-Bus hat es in sich. Waehrend man z.B. ueber SPI unbestraft Daten > ins Leere schicken kann, kommt es bei I2C schnell zum Haenger, wenn eine > Adresse angesprochen wird, wo nichts dahinten ist. Das muß dann an Deinen komischen I2C-Routinen liegen. Beim I2C hängt nichts, wenn kein Slave adressiert wird, Du kriegst nur ein NACK zurück. Peter
Peter Dannegger wrote: > > Das muß dann an Deinen komischen I2C-Routinen liegen. > Beim I2C hängt nichts, wenn kein Slave adressiert wird, Du kriegst nur > ein NACK zurück. > > > Peter Absolut! Ich sehe nun ein, dass ich nach jedem I2C-Befehl, der von mir zum EEPROM geschickt wird, den TWSR-Register checken soll. Es ist immer noch die "geerbte" Software, die es bitter noetig hat, ausgemistet zu werden.
Ich danke allen, die geholfen haben. So geht's fuer Addr = 0x00
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.