PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : twi: wo ist das datenbyte?



scales
26.12.2007, 16:37
Ich hab ein Problem mit dem Hardware-TWI bei einem Mega32.
ich will von einem I2C Slave Daten empfangen, das versuche ich wie
folgt:


- START senden //TWCR: (1<<TWINT) | (1<<TWSTA) | (1<<TWEN)
- warten bis START gesendet wurde (warten bis TWINT gesetzt ist)
- überprüfen ob erfolgreich (TWSR auslesen)

- Slave-Adresse mit Read Bit senden: 0b00111011 (Die Slave Adresse ist
0011101) //TWCR: (1<<TWINT) | (1<<TWEA) | (1<<TWEN)
- warten bis die Slave-Adresse gesendet wurde (warten bis TWINT gesetzt
ist)
- überprüfen ob erfolgreich (TWSR auslesen)

aber wie gehts hier nun weiter?
am Ende kommt natürlich noch das STOP-Signal, aber wo ist das Datenbyte
das ich empfangen will?
In TWDR ist immernoch die gesendete Slave-Adresse.
Muss ich noch irgendwas senden um letzendlich das Datenbyte zu bekommen?

PicNick
26.12.2007, 17:03
Guckst du da, sollte dir eigentlich helfen:
https://www.roboternetz.de/wissen/index.php/TWI_Praxis

scales
26.12.2007, 23:06
die Seite hab ich schon gesehen, ich mach das im Prinzip genauso wies da steht, aber es funktioniert trotzdem nicht.

Hier ein Diagramm aus dem Datenblatt des Slave-Bausteins (LIS3LV02DQ) den ich ansprechen will:
http://www.mikrocontroller.net/attachment/29565/_bertragung.png


ST - Start
SR - Repeated Start
SAK - Slave Acknowledge
NMAK - Not Master Acknowledge
SAD+W - Slave-Adresse mit Write-Bit
SAD+R - Slave-Adresse mit Write-Bit
SUB - Die Adresse des Registers dass man von dem Baustein auslesen möchte

bis zu der mit dem roten Pfeil markierten Stelle komme ich ohne Probleme, ich bekom auch immer ein NACK vom Slave zurück.

Ich hab dann also die Slave Adresse mit Read-Bit gesendet und hab ein NACK darauf zurückbekommen, an dem Punkt ist der rote Pfeil.
Anschließen versteh ich aber nicht was genau ich machen muss um die Daten zu lesen, die ja noch kommen sollen.
Direkt wieder warten bis TWINT gesetzt wird bringt ja nichts, das ist sofort der Fall, da es noch wegen dem Slave-Adressen-Versand gesetzt ist.
Ich hab versucht einfach 0x00 o.ä. auf den Bus zu schreiben und dann zu warten bis TWINT gesetzt ist, aber das passiert nie.

linux_80
27.12.2007, 00:34
Hallo,

wie hier schon mal gesagt:
http://www.mikrocontroller.net/topic/87025
Du musst nach dem sich der Slave gemeldet hat nochmal das TWINT auf 1 setzen ohne sonst was zu tun (ausser warten bis es wieder auf 1 ist), damit das erste Byte kommt !

scales
27.12.2007, 18:11
das hab ich versucht. Das Problem ist, dass das TWINT wenn ich das mach danach nicht mehr gesetzt wird und somit das Programm hängen bleibt.
In dem mikrocontroller.net Thread steht, dass ich ACKs statt NACKs zurückbekommen müsste.
Stimmt das? und wenn ja, was sind mögliche Ursachen für NACKs?

EDIT:
hier mal der Schaltplan, falls da der Fehler versteckt ist:
http://www.mikrocontroller.net/attachment/29583/schaltung.png
An den beiden ICs ist natürlich noch mehr dran, VCC hab ich nur mit
eingezeichnet, damit man erkennt, dass das eine ein 5V und das andere
ein 3,3V Gerät ist.

Wenn sich da kein Fehler finden lässt, post ich mal meinen Code (den
muss ich erst so umschreiben, dass man den einigermaßen lesen kann)

scales
27.12.2007, 21:19
Jetzt tuts, in dem mikrocontroller.net haben die den Fehler gefunden.
Vielen Dank für die Hilfe!

vklaffehn
28.12.2007, 10:14
Was war es denn jetzt? Will nicht dumm sterben :-)
MfG Volker