Eins Vorweg:
Du scheinst sehr viel mit #define zu arbeiten. Zu Viel. Und dein
Code ist unvollständig. (Was/wie/wo ist TW_STATUS?)
Und schreib z.b.:
1 | case 0x80: //addressed with ownSLA+W; data received; ACK send
|
Dann weiß man gleich was gemeint ist :-)
>Also, der Code oben ist noch lange nicht fertig und der Timeout kann
>auch einfach ignoriert werden, da er im Normalfall ja eh nicht greift.
Sicher? bei 8Mhz sind das gerade mal geschätzte 15 ms (wenn sich der gcc
total dämlich anstellt, also eher unter 10).
Mangels vollständigem Code halte ich mich jetzt mal an die Hex angaben
in deinem switch Code....
1 | case TW_SR_SLA_ACK: // 0x60 Slave Receiver, wurde adressiert
|
2 | case TW_SR_DATA_ACK: // 0x80 Slave Receiver,Daten empfangen
|
Hmm... ich denke du möchtest eine Slave Tansmitter bauen oder?
Wozu dann der Code für einen Slave Receiver?
1 | case TW_ST_SLA_ACK: //?!?
|
Ja, ich schliese mich dem "?!?" an. (Lies: ich bin Total bescheuert dir
zu antworten)
Sollte das 0xA8 sein Passt der Code, aber du Sendest das ACK nicht
sondern erwartest das der Master eins sendet...
1 | case TW_ST_DATA_ACK: //0xB8 Slave Transmitter, weitere Daten wurden angefordert
|
Gut Das passt auch.
Der Slafe müsste also unendlich daten (0b00001111) senden,
sofern der Master alles Richtig macht.
1 | case TW_ST_DATA_NACK: //0xC0 Keine Daten mehr gefordert
|
2 | case TW_SR_DATA_NACK: //0x88
|
3 | case TW_ST_LAST_DATA: //0xC8 Last data byte in TWDR has been transmitted (TWEA = “0”); ACK has been received
|
Also in Datasheet steht zu 0x88 vier mal untereinander "Read data byte".
Fehlt bei dir irgendwie, aber das ist ja eh Slave reciver...
Sonst passt das.
1 | case TW_SR_STOP: // 0xA0 STOP empfangen
|
Ist auch ok.
Könnte man noch ein STO im ersten TWCR einbauen um
das TWI wieder auf die Füße zu hohlen.
Soweit sogut. Der Slave transmitter scheint korrekt zu sein.
Der Slave springt nur dann in den "last data byte mode" wenn
TWEA nicht gesetzt war. D.h.: Der Slave müsste entwerder
bei 0xA8 oder 0xB8 mist bauen. Kann ich nicht ausschließen, da
ich nicht weiss was TW_ST_SLA_ACK sein soll.
Den Master kann ich mangels vollständige Code nicht überprüfen.
Vermutlich geht das aber alles so schnell das du den eingentlichen
Fehler gar nicht siehst.
Entferne alles unnötige aus deinem Code (timeout, Slave reciver) und
Poste ihn komplett!
Die wenigsten hier machen sich die mühe unvollständige Code zu lesen
oder gar zu Antworten.
Zum weiteren Debuggen:
1. Besorge dir einen I2C Sniffer
Wirst du auch in Zukunft brauchen
2. Nutze die Uarts für Status ausgaben
0. Bau diese [Zensiert] Timeout aus und versuche
die Geschwindigkeit zu reduzieren (delay).
>Okay ich war etwas in Eile vorhin, sorry.
Wenn ich mir hier 1/2 Stunde Zeit nehme solltest du dir mindestens 2
nehmen.