Forum: Mikrocontroller und Digitale Elektronik TWI nicht mehr ansprechbar, nach Adressensuche


von Hans P. (spiegel7878)


Lesenswert?

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ß

von Martin (Gast)


Lesenswert?

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

von Hans P. (spiegel7878)


Lesenswert?

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

von Klaus (Gast)


Lesenswert?

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

von Hans P. (spiegel7878)


Lesenswert?

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.

von Klaus (Gast)


Lesenswert?

Ich schalte den SCL Pin als Output-Port, wackle und schalte ihn dann 
wieder an den I2C.

MfG Klaus

von Hans P. (spiegel7878)


Lesenswert?

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

von Thosch (Gast)


Lesenswert?

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>

von Hans P. (spiegel7878)


Lesenswert?

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 :)

von Thosch (Gast)


Lesenswert?

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.

von Thosch (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.