TWI funktioniert nur bei einem Register/Addresse

OP #4098690
Lesenswert?
• ▲
▼
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!
Gast #4136556
Lesenswert?
• ▲
▼
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren