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:
Die Ausgaben sehen dann so aus (jede Zeile ein neuer Leseversuch; links AVR, rechts Beagleboard):Code:TW_STATUS1: a8 TW_STATUS default: c0
Slave gibt Status aus - Beagleboard "Error"
Slave gibt Status aus - Beagleboard "Error"
Slave gibt nichts aus - Beagleboard "Error"
Hier der zugehörige Code:
Slave
Defines: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; } }
Master: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);
Die Rückgabe der funktion read() ist -1.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); }
Wo könnte das Problem liegen?
Gruß, Jörn







Zitieren

Lesezeichen