Probleme I2C

OP #2685338
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:
#2685351
Ohne jetzt den Code gesehen zu haben...
Ich hatte mal so n ähnliches Prob. Ich hatte das Ack-Bit mit ner 
Bestätigung verwechselt die n ganzes Byte lang war. Nachdem ich mir das 
vergegenwärtigt hatte ging's dann. Vielleicht haust du ja in die gleiche 
Kerbe.
Gast #2685480
Hi

Habe ich etwas übersehen, oder fehlt zwischen Schreiben und Lesen eine 
REPEATED START condition?

Siehe Figure 2-4. Combined transaction. in der AppNote S.4.

MfG Spess
OP #2685486
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
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.