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:
Code:
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

Code:
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:
Code:
#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:
Code:
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