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
Lesezeichen