Nach dem Reset weiß Dein AVR-TWI ja nicht, daß der EEPROM noch Daten
sendet und in welchen Takt er gerade ist.
Das TWI kann die Blockierung daher nicht aufheben und wird ständig
Fehler melden.
Du mußt Dir daher eine Software-I2C Funktion schreiben, die solange
versucht STOP zu senden, bis es klappt. Wenn es nicht klappt, ne
SCL-Flanke und weiter versuchen. Im Worst Case braucht es 9 Versuche.
Ich hab gerade leider nur ne 8051-Assembler Funktion gefunden:
1 | ;---------------------- send stop ---------------------------------------
|
2 | ;Input: CY = 0: no previous error
|
3 | ;Output: CY = CY OR 1: Error, SDA or SCL still low
|
4 | ;SDA: X -> 1
|
5 | ;SCL: 0 -> 1
|
6 | SI2CSTO:
|
7 | clr ssda
|
8 | mi2cdelay cycle_4us - 1
|
9 | setb sscl
|
10 | mi2cdelay cycle_4_7us - 3
|
11 | orl c, /sscl ;test sscl
|
12 | setb ssda
|
13 | nop ;time to go high
|
14 | orl c, /ssda ;test ssda
|
15 | ret
|
16 | ;---------------------- reset the I2C bus -------------------------------
|
17 | ;Output: CY = 1 Error, reset failed
|
18 | ;SDA: X -> 1
|
19 | ;SCL: X -> 1
|
20 | SI2CRES:
|
21 | mov r2, #9 ;try it 9 times
|
22 | ?si2crs1:
|
23 | clr c
|
24 | clr sscl ;generate clock pulse
|
25 | call si2csto ;try sending stop
|
26 | jnc ?si2crs2
|
27 | djnz r2, ?si2crs1
|
28 | ?si2crs2:
|
29 | ret
|
Das Prinzip sollte aber daraus ersichtlich sein.
Peter