Reset auf I2C-Bus

Gast #229110
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
Gast #229112
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.
Gast #229117
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
#229118
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
#229121
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren