www.mikrocontroller.net

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


Autor: Ulrich Schneider (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Ulrich Schneider (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.