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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.