Forum: Mikrocontroller und Digitale Elektronik Probleme I2C


von Lutz B. (lutzbroszio)


Angehängte Dateien:

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

von Joachim .. (joachim_01)


Lesenswert?

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.

von Georg A. (georga)


Lesenswert?

Klingt eher nach einem elektrischen Problem. Pullups korrekt?

von spess53 (Gast)


Lesenswert?

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

von Lutz B. (lutzbroszio)


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.

von spess53 (Gast)


Lesenswert?

Hi

Und was ist nun mit der REPEATED START condition?

MfG Spess

von Lutz B. (lutzbroszio)


Lesenswert?

Die Repeated Start kommt auch da wo sie soll.

Ich bin im Moment mal ein bisschen dran am arbeiten und melde mich 
später nochmal.
Schonmal vielen Dank für eure Posts.
Lutz

von Thomas F. (tomasf)


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.

von Lutz B. (lutzbroszio)


Lesenswert?

Mir ist aufgefallen, dass ich ausversehen noch die internen Pull-Ups 
aktiviert gehabt.
Ich hab sie rausgenommen und jetzt klappt es.
Vielen Dank für eure Hilfe.
Lutz

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.