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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Hans P. (spiegel7878)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

MfG Klaus

von Hans P. (spiegel7878)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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ß.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.