PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kommunikation Atmega8 <-> Beagleboard über I2C



PcVirus
23.03.2010, 14:15
Hi,

ich möchte einen Atmega8 als I2C-Slave betreiben, der von meinem Beagleboard mit Linux drauf ausgelesen werden soll. Jedoch klappt die Kommunikation nicht ganz. Das Beagleboard als Master sollte soweit funktionieren, da ich ein CMPS03 Kompass ohne Probleme auslesen kann.

Zum Testen soll der Master ein Byte vom Slave lesen. Bei jedem Leseversuch durchlaufe ich bei dem Slave anscheinend jedoch nur einmal die ISR. Um das zu testen, gebe ich mir über den USART bei jedem Durchlauf der ISR den Inhalt von TW_STATUS aus.

Ich bekomme dann vom Slave bei jedem Leseversuch entweder 0xA8, 0xC0 oder gar nichts zurück:

TW_STATUS1: a8
TW_STATUS default: c0

Die Ausgaben sehen dann so aus (jede Zeile ein neuer Leseversuch; links AVR, rechts Beagleboard):

Slave gibt Status aus - Beagleboard "Error"
Slave gibt Status aus - Beagleboard "Error"
Slave gibt nichts aus - Beagleboard "Error"

Hier der zugehörige Code:
Slave


SIGNAL(SIG_2WIRE_SERIAL){

char buffer[20];
switch (TW_STATUS){ //TWI-Statusregister prüfen und nötige Aktion bestimmen

case TW_ST_SLA_ACK:
case TW_ST_DATA_ACK:
sprintf(buffer, "TW_STATUS1: %x\n", TW_STATUS);
uart_puts(buffer);
TWDR = 0x12;
TWCR_ACK;
break;

default:
sprintf(buffer, "TW_STATUS default: %x\n", TW_STATUS);
uart_puts(buffer);
TWCR_RESET;
break;
}

}

Defines:


#define TWCR_ACK TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA);

#define TWCR_NACK TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT);

#define TWCR_RESET TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA);

Master:


I2CMaster::read(uint8_t slave_addr, uint8_t * data, uint8_t n){
//Port öffnen
int file = open(dev_name, O_RDWR);

if (file < 0) {
exit(1);
}

//Slaveadresse setzen
if (ioctl(file, I2C_SLAVE, (slave_addr>>1)) < 0) {
exit(1);
}

//Daten lesen
if (read(file, data, n) < 0) {
cout << "I2C-Read failed!" << endl;
}

//Device schließen
close(file);

}

Die Rückgabe der funktion read() ist -1.

Wo könnte das Problem liegen?

Gruß, Jörn