Schau,
"len" sind die empfangenen Bytes, am Anfang "1"
"lenmax" die gegebene Anzahl, wieviele es werden dürfen
Data* zeigt auf den datenbuffer

while(1) heißt, von sich aus hört die Schleife nicht auf.

if (len < lenmax) // noch nicht genug bytes
TWCR = _BV(TWEA) | _BV(TWEN) | _BV(TWINT);
wenn ein Byte kommt, ACK zurückschicken

sonst
TWCR = _BV(TWEN) | _BV(TWINT);
auch empfangen, aber KEIN Ack zurück

Dann warten, was passiert

Beim empfang MIT ACK
*Data++ = TWDR // Daten speichern (pointer+1)
len++ // mitzählen

Beim empfang OHNE ACK (also letztes Byte) --> break, schleife exit.


Nach der Schleife wird auch noch das letzte (nicht "geackte" Byte gespeichert

Und STOP abgesetzt. aus.


Der Witz dabei ist, daß der Master receiver das letzte geholte byte NICHT "Acked", damit der Slave weiß, das war das letzte.
(Der steht sonst nämlich da wie die Kuh vor dem neuen Tor)


logo ?

EDIT: Ich weiß, ich hab auch schon elegantere Schleifen gesehen, aber was soll's