Forum: Compiler & IDEs TWI funktioniert nur bei einem Register/Addresse


von Attila C. (attila)


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!

von Eric B. (beric)


Lesenswert?

Mein Glaskugel sagt, dass das Problem vermutlich in Codezeile 42 liegt.

von Wolfgang (Gast)


Lesenswert?

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.

von Attila C. (attila)


Lesenswert?

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. ;-)

von Horst S. (Gast)


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.

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.