Hallo, Ich habe eine Frage bezüglich des TWI Buses. Ich habe eine Suchfunktion geschrieben, bei der alle angeschlossenen TWI Geräte gefunden werden und die angeschlossenen Geräte auf an der Console ausgegeben werden. Nach beenden der Suchfunktion, liegt der SCL Pegel auf High und der SDA Pegel auf low, dadurch ist der Bus nicht mehr ansprechbar. Wie bekomm ich den SDA Pegel wieder auf high? #define TWCR_RESET TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA); funktioniert nicht. #define TWI_STOPP TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN); funktioniert ebenfalls nicht. Nur durch einen Spannungsreset ist es zur Zeit möglich. Könnte mir jemand einen Tipp geben? Danke für die Hilfe Gruß
Ohne zu wissen in welchem Zustand der TWI hängt ist es schwierig zu sagen, was zu tun ist. Ich würde einfach mal den TWEN wegnehmen und wieder setzen. Also in etwa so:
1 | TWCR = 0; |
2 | TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA); |
Hallo Martin, Ich hab dein Rat befolgt, hat aber auch nicht geholfen, SDA hängt nach wie vor auf low. Der Zustand ist Master Receiver Mode, ACK wird empfangen. Der Bus wartet wahrscheinlich auf ein Signal vom Slave, empfängt aber nichts. Kann ich den TWI dann nicht einfach Reseten? vom Slave soll ja nichts kommen..
Man sollte nicht mit reads einen I2C Bus absuchen, sondern nur mit writes. Das RW-Bit sollte 0 sein. Manche Slaves wollen nach einem read wirklich gelesen werden und warten auf weitere Clocks. Um den verklemmten Bus freizumachen, kann man auch mindestens 9 mal mit SCL wackeln. MfG Klaus
Hallo Klaus, ok, das war mir nicht bewusst. Ich werd das auf writes umstellen. Das mit dem SCL wackeln ist mir nicht ganz klar,ich adressier den Slave ja zum Auslesen, dannach kann ich nur noch den Befehl schicken, dass er mir Daten schicken soll. Hierbei wir tauscht zwar die Clock aber der Bus wird nicht frei. Mit einem Stopp Befehl wird nur die Clock auf high gezogen.
Ich schalte den SCL Pin als Output-Port, wackle und schalte ihn dann wieder an den I2C. MfG Klaus
Hallo Klaus, Danke für den Tipp, kann ich bestimmt nochmal gebrauchen ;) Die Funktion zum Adressen suchen funktioniert jetzt mit writes :) Danke für die Hilfe. Gruß Spiegel
wie arbeitet denn deine Suchfunktion genau? Ich mach das immer so, daß ich einfach versuche die in Frage kommenden Slave-Adressen anzusprechen, und wenn die Slave-Adresse kein ACK erhält, dann sende ich STOP und mache mit der nächsten Adresse weiter. Auf den Adressen, auf denen man ein ACK erhält, ist ein Slave vorhanden. Die SlaveAdresse ist natürlich die mit gelöschtem Bit 0, also für Write. Also für jede zu testende Adresse einmal dieser Ablauf:
1 | Master: <START> <SlaveAdr> <STOP> |
2 | Slave: <ACK/NAK> |
Hallo Thosch, Die Suchfunktion funktioniert genau nach dem Schema. Das Problem bestand darin, dass ich mit reads die Adressen abgefragt habe, anstatt mit writes =/ trotzdem Danke für die Hilfe :)
Das NAK wird natürlich nicht aktiv geliefert, sondern ergibt sich automatisch durch den PullUp, wenn kein Slave die Leitung für ACK auf LOW zieht.
Hans Peter schrieb: > Die Suchfunktion funktioniert genau nach dem Schema. Das Problem bestand > darin, dass ich mit reads die Adressen abgefragt habe, anstatt mit > writes =/ ah, ok. Dann hatte ich dich mißverstanden. Dachte zunächst, du liest danach wirklich Daten von jedem zu testenden Slave, mit Repeated-Start usw... Wollte nur klarstellen, daß man zum Testen auf "Slave vorhanden" nicht mehr, als nur die Slave-Adresse ausgeben muß.
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.