Hallo,
eigentlich hab ich hier im Forum oft meine Antworten gefunden ohne
selber eine Frage stellen zu müssen. Doch nun muss ich auch mal selber
was Fragen, weil ich gerade etwas unsicher bin. ;)
Es geht hier um die Implementierung der Atmel Hardware TWI in einem AVR.
In der I2C Libary von Peter Fleury (Anhang) benutzt er in der
twimaster.c die Funktion i2c_start_wait() in der folgende Statuscode
Abfrage im TWSR nach einer Slave Adressierung (SLA+R/W).
1 | if ( (twst == TW_MT_SLA_NACK )||(twst ==TW_MR_DATA_NACK) )
|
2 | {
|
3 | /* device busy, send stop condition to terminate write operation */
|
4 | TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
|
5 |
|
6 | // wait until stop condition is executed and bus released
|
7 | while(TWCR & (1<<TWSTO));
|
8 |
|
9 | continue;
|
10 | }
|
Trifft er auf ein NACK Statuscode, wird durch "continue" eine nächste
Runde einer while Schleife durchgeführt in der der Slave über ein repeat
Start neu angesprochen wird.
Die Abfrage nach TW_MR_DATA_NACK (Data received, NACK transmitted)
sollte ja ein Fehler sein. Einen solchen Statuscode kann der TWI im
Zustand der Adressierung (SLA+R/W) nicht bekommen, oder doch?
Und wichtiger und mein Grund für die Verwirrung, gibt es einen Grund
beim Polling im Atmel TWI explizit auf NACK anstatt auf ACK zu prüfen?
Wäre ein ACK Polling nicht günstiger?
Danke für eure Anregungen.
73, Sven, DG1WRE
[update]
Hat sich erledigt ...