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
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.
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
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.