mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Reset auf I2C-Bus


Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

bin grad dabei, mich in den I2C-Bus einzuarbeiten. Hab da mal ne Frage,
und zwar zur Stop-Condition. Wirkt die wie ein ein Reset auf dem Bus,
wenn ich sie als erstes auf den Bus gebe? Ich möchte sicherstellen,
dass ich den Bus komplett rücksetzen kann, falls irgendwas während der
Kommunikation schieflief. Soweit ich das verstanden habe, bewirkt dies
eine Stop-Condition, die zudem zu jedem beliebigen Zeitpunkt erfolgen
darf, richtig?

Thx

Ralf

Autor: Ratber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist richtig.

Eine Übliche Vorgehensweise ist beim Start und bei "Pannen" (Was auch
immer) 2x Stop zu geben um jeglichen Ärger zu vermeiden.

Autor: Ratber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zusatz:

Laut Definition reicht ein "Stop" aber es hat sich aus Erfahrung
gezeigt das es manchmal nicht ganz ankommt bzw. einige Bausteine beim
ersten "Stop"  nach einem "Unfall" nicht komplett rücksetzen.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super, danke für die schnelle Antwort.

Ralf

Autor: Ratber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Yo,kein akt

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"... 2x Stop zu geben um jeglichen Ärger zu vermeiden."

Wenn schon, dann aber mindestens 9* versuchen, Stop zu senden.

Der Slave-Transmitter kann ja beim 1.Bit von einem 0x00-Byte hängen und
dann hält er 8 Takte lang die SDA-Leitung auf low.


Peter

Autor: Ratber (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Siehe Anhang.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Peter,

danke für den Hinweis, den werd ich im Auge behalten, ist gut zu
wissen.

Jetzt kommt mir aber doch noch eine Frage auf:

Ich habe für jeden der vier möglichen Aktionen auf dem Bus eigene
Routinen geschrieben. Also für START, STOP, READ und WRITE.

1. Wie sollte der Zustand der SCL- und SDA-Leitung nach jeder einzelnen
dieser Aktionen sein? Auf keinen Fall beide 1, ausser nach einer
Stop-Bedingung, oder? Sonst könnte ein weiterer Master ja auf die Idee
kommen, dass der Bus frei ist, oder?
2. Ich möchte diese Routinen so einfach wie möglich halten, aber gibt
es irgendwas, was ich auf alle Fälle beachten sollte? Z.B. werden in
den aktuellen Routinen keinerlei Prüfungen auf den Bus-Zustand
vorgenommen.
3. Ich kanns in der Spezifikation nicht finden, oder bin grad zu doof:
Wann werden Datenbits übernommen? Soweit ich verstanden habe, bei
fallender Flanke der SCL-Leitung, oder?

Ralf

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe meine SW-I2C-Funktionen (außer Stop) so geschrieben, daß SCL
danach immer low ist.

Dadurch lassen sich die Routinen gefahrlos kombinieren und es ist egal,
wo SDA steht.

Außer bei Stop, danach ist natürlich SDA und SCl = 1.

Read und Write machen gleichzetig das ACK mit, d.h. Read bekommt
übergeben, ob es mit einem ACK oder NACK enden soll und Write gibt
zurück, ob es ein ACK oder NACK empfangen hat.

http://home.tiscali.de/peterd/appl/hard/i2c/si2c_drv.inc

http://home.tiscali.de/peterd/appl/hard/i2c/index.htm


Peter

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, Peter. Werd mal gucken, ob ich es auch so hinbekomme mit dem
ACK/NACK.
Wie ist das mit der Datenübernahme? Bei fallender SCL-Flanke, oder?

Ralf

Autor: Susanne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich nehme an, den Zeitpunkt der Datenübernahme kann der Designer
festlegen (solange SCL=High+Flanken), aber fallende Flanke scheint
üblich zu sein.
siehe:
http://forums.semiconductors.philips.com/forums/vi...

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meine Erfahrung hat gezeigt, dass man den Error-Routinen etwas
Aufmerksamkeit entgegenbringen sollte.

Eine mögliche Error-Routine könnte so aussehen:

TWI_ERROR:

; TWI STOP
  ldi r16, (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)
  out TWCR, r16
; TWI aus
  ldi r16, (0<<TWEN)
  out TWCR, r16

; Initialisierung
        rcall TWI_INITIALISIERUNG

ret

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.