Hallo allerseits,
ich bin gerade am Verzweifeln. Und zwar versuche ich eine Kommunikation
zwischen einem Atmega 644P und einem Attiny 2313 per I2C hinzukriegen.
Der 644P soll dabei Master Transmitter und der Tiny 2313 Slave Receiver
sein. Den COde für den Tiny habe ich aus AVR312 übernommen, da der Tiny
ja kein "echtes" TWI besitzt. Mein Problem ist nun, dass der Tiny zwar
die START-Condition mitkrieg, danach aber einfach keine Daten erhält.
Ich war davon ausgegangen, dass diese, ich sie auf dem Master in TWDR
schreibe, auf dem Client in USIDR auftauchen. Da ich am Tiny ein LCD
hängen habe kann ich aber sehen, dass USIDR fortlaufend den Wert 0xFF
enthält. USICR wechselt zwischen 0xA8 (Standard) und 0xF8 (im
Interrupt). USISR zählt im ersten Byte fortlaufend hoch und wechselt im
zweiten Byte zwischen 0 und 4.
Wie kann ich nun auf dem Tiny an die übertragenen Daten kommen? Das
Problem ist, dass ich so, wie es aktuell läuft überhaupt nicht damit
arbeiten kann, da ich ja noch nichtmal prüfen kann, ob überhaupt die
korrekte Adresse mitgesendet wurde :(
Die Funktion dafür sieht aktuell so aus:
1 | void send_i2c(uint8_t device, uint8_t code) {
|
2 | error = 0;
|
3 | TWCR = 0b10100100;
|
4 |
|
5 | twiWait();
|
6 |
|
7 | if(twiStatus == 0x08 || twiStatus == 0x10) {
|
8 | TWDR = device<<1;
|
9 | TWCR = 0b10000100;
|
10 | }
|
11 | }
|
Problematisch ist dieser Block:
1 | if(twiStatus == 0x08 || twiStatus == 0x10) {
|
2 | TWDR = device<<1;
|
3 | TWCR = 0b10000100;
|
4 | }
|
Anhand von LED-Ausgaben am Board des Mega weiß ich, dass die Bedingung
definitiv erfüllt ist, d.h. der Slave scheint korrekt zu reagieren.
Setze ich aber TWDR und anschließend TWINT, so tauchen die Daten aus
TWDR am Tiny einfach nicht auf.
SDA und SCL sind auf Seiten des Master mit 10k Ohm gegen VCC gezogen.
Oder ist es generell nicht möglich USI TWI mit "echtem" TWI zu
verbinden? :(