Hallo,
beim Atmega128A @10 MHz haben wir einen TWImaster Treiber mit TWIpresc = 400 kB/s konfiguriert. Die Bussignale messen wir mit einem Oszi. Bei Lesen des Slaves mit dieser Funktion
TWIinp(addr, b); // b ist ein byte
erhalte ich folgende Sequenz:
1 Master: |START|addr+R|
2 Slave: |ACK|Daten|
3 Master: |NACK| <----- Hier sollte nach NACK ein STOP kommen!!!
4 Slave: |Daten|
5 Master: |ACK|
Dann bleibt SDA auf High und der Bus ist blockiert...
Lt. I2C-Spezifikation (http://www.nxp.com/documents/user_manual/UM10204.pdf, Seite 15) müsste in Zeile 3 der Master ein NACK und STOP schicken, weil die 8 Bit schon fertig eingelesen sind. Stattdessen versucht er noch ein Byte zu lesen und lässt den Slave mit anschließendem ACK für immer und ewig warten.
Was ist hier falsch?
VG
Alois
beim Atmega128A @10 MHz haben wir einen TWImaster Treiber mit TWIpresc = 400 kB/s konfiguriert. Die Bussignale messen wir mit einem Oszi. Bei Lesen des Slaves mit dieser Funktion
TWIinp(addr, b); // b ist ein byte
erhalte ich folgende Sequenz:
1 Master: |START|addr+R|
2 Slave: |ACK|Daten|
3 Master: |NACK| <----- Hier sollte nach NACK ein STOP kommen!!!
4 Slave: |Daten|
5 Master: |ACK|
Dann bleibt SDA auf High und der Bus ist blockiert...
Lt. I2C-Spezifikation (http://www.nxp.com/documents/user_manual/UM10204.pdf, Seite 15) müsste in Zeile 3 der Master ein NACK und STOP schicken, weil die 8 Bit schon fertig eingelesen sind. Stattdessen versucht er noch ein Byte zu lesen und lässt den Slave mit anschließendem ACK für immer und ewig warten.
Was ist hier falsch?
VG
Alois