(ATmega8) TWI/I2C als Slave Receiver - komischer Statuscode

Gast #238652
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?
Gast
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...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.