Hallo
Ich habe hier ein ziemliches Problem mit dem TWI eines Mega8:
Ein Mega32 als Master versucht etwas zu senden, doch der Slave (Mega8)
reagiert nicht im geringsten. Auf dem Master wird der TWI-Interrupt
erwartungsgemäss ausgelöst (START sent, NOT ACK received). Die
SCL-Leitung ist zuerst auf High, nach dem Senden dauerhaft auf Low (wie
zu erwarten, da noch kein STOP gesendet wurde). Auf dem Slave passiert
rein gar nichts - nicht mal der TWI-Interrupt wird ausgelöst. (Dann
sollte eine LED angehen und ein Zeichen übers UART gesendet werden - nix
von dem passiert.
Ich bin langsam ein bisschen am verzweifeln, da ich dem Problem einfach
nicht auf die Schliche komme. Primäres Ziel ist nun mal, dass der
TWI-Interrupt auf dem Slave ausgelöst wird.
Achja: Die Schaltung sollte stimmen. (Was für Pullups sollte man am
besten verwenden? 1.8k Ohm?)
Gruss
Michael
TWI-relevante Codefragmente:
Das:
> TWCR &= ~((1 << TWSTA) | (1 << TWSTO));
wird doch zu:
TWCR &= 0b11001111;
dadurch eine 1 ins TWINT gesschrieben (bit 7 - ist gesetzt, wenn die
ISR aufgerufen wird) und so TWINT gelöscht (ist ein Flag!) und sagt der
TWI Hardware 'weitermachen'.
Die ganze Zeile scheint mir überflüssig.
Schau dir doch mal die Atmel-Appnotes zum TWI an (AVR312 und 315).
hth. Jörg
Bin mittlerweile einen Schritt weiter: Offenbar liegts tatsächlich am
Master. Ich kann dort nämlich machen was ich will, er meldet immer START
sent und danach SLA+R sent, NOT ACK received. Stets SLA+R, egal wie ich
das dazugehörige Bit setze.
TWDR wird auf dem Master tatsächlich nicht geschrieben und hat immer den
Inhalt FF. Laut Datenblatt kann TWDR nur geschrieben werden, wenn TWINT
gesetzt ist - ist es eigentlich auch, da ja sonst der Interrupt nicht
ausgelöst würde und ich es auch nicht gelöscht habe.
Doch warum frisst mein TWDR keine Daten?
So, das Problem ist gelöst, es lag am Master. Der nämlich verschickte
eine völlig unnsinnige Adresse, so dass sich der Slave niemals
angesprochen fühlte. Die Adresse muss beim Master ins TWDR gespeichert
werden, das wiederum kann nur wenn TWINT gesetzt ist geschrieben werden.
Nun kam es unglücklicherweise tatsächlich dazu, dass ich TWINT gelöscht
habe, vor dem Schreiben der Adresse...