Probleme I2C

OP #2685338
Lesenswert?

Hallo zusammen,

ich habe Probleme bei der Kommunikation über den I²C-Bus.
Um Sensorwerte auszulesen habe ich die TWI_master_driver.c aus dem ATMEL 
AVR1308 Packet genommen. Das funktioniert soweit auch alles, nur dass 
ich zwischen dem Zugriff auf dem Bus und dem Lesen aus dem Werteregister 
Pause einfügen muss, da sonst nichts gelesen wird (bzw. 0).

  while (whoami != 0x69) {
    uint8_t sub = 0x00; //WHO_AM_I Adresse
    TWI_MasterWriteRead(&twiMaster, GYR_ADDRESS, &sub, 1, 1);
    //1 Byte schreiben und 1 Byte lesen
    while (twiMaster.status != TWIM_STATUS_READY) {  }
    for (int i=0; i<7000; i++) { }
    whoami= (twiMaster.readData[0]);
  }

Wenn ich dir for-Schleife rausnehme, bzw. den Optimierer einschalte, 
funktioniert das Auslesen (.readData) nicht. Betreiben tue ich en Bus 
mit 10kHz und einem ATxmega 128A1. Als Entwicklungsumgebung nutze ich 
AVR Studio 4.19.
Vielleicht habt ihr eine Idee.

Viele Grüße

Lutz
Angehängte Dateien:
OP #2685486
Lesenswert?

Ich arbeite mit einem ATMEL Inertial TWO Board wo Pull-Ups integriert 
sind.
Für Testzwecke habe ich aber auch einen anderen Slave mit externen 
Pull-Ups verwendet und auch mit den intern eingeschalteten Pull-Ups hab 
ich es schon probiert.

Auf dem Oszi sieht es auch alles super aus. Der Slave sendet artig seine 
Daten und der Master setzt auch das NACK, aber das Auslesen klappt nicht 
direkt, sondern nur nach einer Warteschleife.
#2685535
Lesenswert?

Versuch doch mal den Bus mit 400kHz zu betreiben, macht dies eien 
Unterschied?

In der Zeile
1
TWI_MasterWriteRead(&twiMaster, GYR_ADDRESS, &sub, 1, 1);
solltest Du auch den Rückgabewert checken.

Ebenso muss beim ersten Aufruf von TWI_MasterWriteRead() der Busstatus 
vorher(!) gecheckt werden.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren