Forum: Compiler & IDEs (ATmega8) TWI/I2C als Slave Receiver - komischer Statuscode


von Ulrich Schneider (Gast)


Lesenswert?

Hallo,

Ich experimentiere gerade mit I2C/TWI herum, und nutze dazu zwei
ATMega8 mit ihrem eingebauten Hardware-TWI.

Der eine ATMega8 soll dabei auf Tastendruck 2 zwei Byte an den Anderen
schicken - der eine als Master Transmitter, der andere als Slave
Receiver - derzeit noch im Polling-Modus.
Eigentlich funktioniert alles mittlerweile wie erwartet, am Ende
jedoch, wenn der Slave eigentlich das Status-Code für das Erhalten der
STOP-Condition empfangen sollte, kommt ein ganz anderer Status Code als
erwartet.

Das Ganze läuft so ab:
1. Ich schalte den Slave in den Slave Receiver Modus mit einer
bestimmten Adresse
2. Nachdem Tastendruck schickt der Slave zwei Bytes mit
aufeinanderfolgenden Werten an die Adresse des Slaves
3. Der Slave erhält den erwarteten Statuscode 0x60 ("Own SLA+W has
been received; ACK has been returned")
4. Der Slave erhält den erwarteten Statuscode 0x80 ("Data has been
received; ACK has been returned"), TWDR enthält das erste Byte das
gesendet wurde
5. Der Slave erhält den erwarteten Statuscode 0x80 ("Data has been
received; ACK has been returned"), TWDR enthält das zweite Byte das
gesendet wurde

6. Nun jedoch erhält der Slave jedoch statt des eigentlich erwarteten
Statuscode 0xA0 ("A STOP condition has been received") den Statuscode
0xC0 - welcher im ATmega8-Datenblatt in der Tabelle der möglichen
Statuscodes im Slave Receiver Modus gar nicht aufgelistet ist, dafür
jedoch in der Tabelle der möglichen Statuscodes im Slave Transmitter
Mode, dort bedeutet er "Data byte in TWDR has been transmitted; NOT
ACK has been received".

Der Code den ich zum Empfangen der einzelnen Datenbytes bzw. des
Statuscodes, also auch zum Erkennen der STOP-Condition benutzen will
ist Folgender:

TWCR = (1 << TWINT) | (1 << TWEA) | (1 << TWEN);
while(! (TWCR & (1 << TWINT))); // Wait for TWINT flag set
twi_status = (TWSR & 0xF8); // TWI Status

Hat Jemand eine Idee, wo das Problem liegt?

von Ulrich Schneider (Gast)


Lesenswert?

Argh - Problem gelöst, war ein gaaaanz dämlicher Fehler:

Hatte den TWI Status-Code als ASCII-hexadezimal-Wert per UART an den PC
geschickt, aber beim Umwandeln von Byte -> Hexadezimal-ASCII einen
Fehler gemacht - wenn ein Nibble grösser als 9 war, so habe ich
('A'-'9'+1) draufaddiert statt ('A'-'9'-1)... Der Statuscode
war also in Wirklichkeit immer der zu erwartende Wert 0xA0, der Fehler
ist mir nur vorher nicht aufgefallen weil vorher nur Nibbles von 0-9
vorkamen...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.