H. G. schrieb:
> Hallo,
>
> ich bin gerade dabei, einen I²C Lichtsensor (ISL29020) mit einem
> ATMega88 auszulesen.
> Grundsätzlich funktioniert die Kommunikation, aber mein Master sendet
> kein ACK nachdem ein Datensatz mit TWI_READ_DATABYTE_NACK(); gelesen
> wurde!
So recht werde ich aus dem nicht schlau, was du da schreibst.
Im Receive Mode ist doch der Master dafür zuständig NACK oder ACK zu
generieren. Welches davon der Fall ist, musst du als Programmierer
vorher festlegen.
Wenn du also eine Funktion namens TWI_READ_DATABYTE_NACK aufrufst, in
dessen Code auch kein Hinweis darauf zu finden, dass du das TWI Modul
anweist, dem Client mit einem ACK zu bestätigen, dass du alles gekriegt
hast, wieso erwartest du das dann?
Und vor allen Dingen, wieso fragst du das in deinem Code ab?
Es geht doch nicht darum, ob der Master einen ACK oder einen NACK als
Antwort gekriegt hat, sondern er muss dem Client antworten. Der Master
(im Recieve Mode) muss den ACK oder NACK generieren. Dazu wird das Bit
TWEA im Register TWCR entsprechend gesetzt.
Entsprechend
1 | When the Receiver has received the last byte, or for some reason
|
2 | cannot receive any more bytes, it should inform the Transmitter
|
3 | by sending a NACK after the final byte.
|
quittiert der Master (im Receive Mode) alle Bytes bis auf das letzte mit
einem ACK und das letzte Byte wird mit einem NACK quittiert ehe dann der
Master mittels einer Stop Condition den Bus wieder freigibt. Wenn du
also von deinem Sensor 2 Datenbytes willst, wird das erste mit einem ACK
quittiert und das zweite (weil du ja keine weiteren mehr haben willst)
mit einem NACK.
Eine Abfrage des TWSR bezüglich ACK oder NACK macht an dieser Stelle in
dieser Funktion überhaupt keinen Sinn.