Hi,
ich versuche gerade mein Beagleboard mit Linux drauf über I2C mit einem
Mega8 kommunizieren zu lassen. Der Mega läuft als Slave und das
Beagleboard als Master. Zum Testen möchte ich erstmal den Master ein
Byte vom Slave lesen lassen. Jedoch bekomme ich vom Master immer eine
Fehlermeldung, wenn ich ein Byte lesen möchte. Der Master funktioniert
soweit, da ich einen Kompass CMPS03 problemlos auslesen kann. Also
scheint das Problem der Slave zu sein.
Die ISR vom Slave:
1 | SIGNAL(SIG_2WIRE_SERIAL){
|
2 |
|
3 | char buffer[20];
|
4 | switch (TW_STATUS){ //TWI-Statusregister prüfen und nötige Aktion bestimmen
|
5 |
|
6 | case TW_ST_SLA_ACK:
|
7 | case TW_ST_DATA_ACK:
|
8 | sprintf(buffer, "TW_STATUS1: %x\n", TW_STATUS);
|
9 | uart_puts(buffer);
|
10 | TWDR = 0x12;
|
11 | TWCR_ACK;
|
12 | break;
|
13 |
|
14 | default:
|
15 | sprintf(buffer, "TW_STATUS default: %x\n", TW_STATUS);
|
16 | uart_puts(buffer);
|
17 | TWCR_RESET;
|
18 | break;
|
19 | }
|
20 |
|
21 | }
|
Die Defines:
1 | #define TWCR_ACK TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA);
|
2 |
|
3 | #define TWCR_NACK TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT);
|
4 |
|
5 | #define TWCR_RESET TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA);
|
Der USART gibt mit dem Programm folgendes aus:
1 | TW_STATUS1: a8
|
2 | TW_STATUS default: c0
|
Die Ausgabe wiederholt sich bei jedem Leseversuch. Wo könnte der Fehler
sein?
MfG Jörn