Hallo! Ich habe hier ein LPS25H pressure Sensor den ich über TWI auslesen möchte. Ich kann das WHO_AM_I Register auslesen. Jedes Andere zieht nach übertragen der Adresse SCL und SDA auf high. Konkret: STA Start wird übertragen SAD+W Slave Adresse plus write wird übertragen SAK Slave überträgt ACK dann folgt TWDR = add; Adresse des Registers das gelesen/beschrieben werden soll TWCR = (1<<TWINT) | (1<<TWEN); while(!(TWCR & (1<<TWINT))); wait until transmission completed hier ist dann schluss. Offensichtlich wird die transmision eben nicht completed. Warum? Vor allem wenn es doch bei dem WHO_AM_I Register problemlos geht? Vielen Dank schon mal!
Mein Glaskugel sagt, dass das Problem vermutlich in Codezeile 42 liegt.
Attila Ciftci schrieb: > Jedes Andere zieht nach übertragen der Adresse SCL und SDA auf high. Beim TWI zieht keiner der kommunizierenden Bausteine irgendeine Bus-Leitung auf high.
Wolfgang! Das ist richtig, ich hab mich da verheddert. Ich fahre jetzt das Teil über SPI an und das funktioniert. Es wäre trotzdem interessant herauszufinden warum es mit TWI nicht funktionierte. @Eric: Das Programm ist weit unter 42 Zeilen lang. ;-)
1 | STA Start wird übertragen |
2 | SAD+W Slave Adresse plus write wird übertragen |
3 | SAK Slave überträgt ACK |
Das ist gefährlich: Du musst aktiv die Rückmeldungen des ACK vom Slave abfragen. Das Statusregister TWSR verrät Dir schon nach Senden der Bus-Adresse, ob Dein Device Dir überhaupt antworten mag. Insofern verstehe ich die Zeile "SAK Slave überträgt ACK" nicht so ganz (dass sollte doch ein Funktionsaufruf mit Rückgabewert sein!!!???) Auf jeden Fall: Wenn über TWI der Slave Dir kein ACK auf die Adresse sendet, bist Du aus dem Telegramm schon rausgeflogen und Du musst codetechnisch am Beginn des Telegramms wieder anfangen. Noch was: Aus eigener Erfahrung (ich hab damals auch die Doku nur flüchtig gelesen) weiß ich: es lohnt sich, den Statusdiagrammen des TWSR vollständig zu folgen (insbesondere, wenn man Master und Slave auf zwei unterschiedlichen Controllern gleichzeitig zum reden bringen will). Dazu kommt noch: ohne Interrupt, Timeout-Watchdog, etc würde ich den TWI nicht mehr nutzen wollen. Bei einigen Slaves findest Du sogar nur eine softwareemulierte 2-Port-Lösung, bei der sogar das Timing Probleme bereiten kann (overpolling). Hier ist I2C nicht immer auch wirklich I2C.
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.