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.
Gast
#4106422
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. ;-)
Gast
#4136556
1 | |
2 | |
3 | |
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.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.