Forum: Mikrocontroller und Digitale Elektronik AVR I2C-Slave Problem: Lesen und Schreiben geht, aber nicht mit Repeatet Start


von Maik (Gast)


Lesenswert?

Hallo zusammen,
ich verzweifele langsam an der I2C-Schnittstelle. Ich habe 2 
Mikrcontroller die sich über die I2C-Funktion unterhalten (1xMaster und 
der andere Slave)

Ich habe die Slave Lib von Manni genommen und habe mir sehr viel dazu 
angelesen. Lesen und Schreiben geht, aber nur einzelnt und nicht über 
ein Repeatet Start miteinander verbunden. Habe dann noch ecplizit den 
Status des TWI Status Register überprüft per Software überprüft, um da 
drauf zu reagieren, doch der setzt nie diesen bestimmten Status.

Ich weiß einfach nicht warum?!
Hab natürlich ein Oszi rangeschlossen und sehe auch die RS-Bedingung. 
Auch wenn ich über den MKII debugge, dann erkennt das TWI Status 
Register nicht den Zustand Repeatet Start. Es setzt den Status "Nothing 
to Do - Everything ist fine" und scheint anscheinend die Clock dauerhaft 
herunterzuziehen.

Jetzt könnte man denken, dass was an meiner Master Lib nicht stimmt, 
doch wenn ich da nen I2C Eeprom ranhaue, dann kann ich ohne Probs mit 
Repeatet Start kommunizieren.

Kennt ihr einen funktionierenden SourceCode, wo ihr wisst, dass hier die 
Repeatet Start Kommunikation klappt? Wenn man sich die Application Note 
von Atmel herunterlädt, dann ist das dort ja eher durch einen dürftigen 
Workaround gelöst, indem das erste Byte was gesendet wird dem Controller 
Lesen oder Schreiben sagt.....
Beispiel: Sende einfach als erstes zum Beispiel eine 3 und dann weiß der 
Slave-Controller dass ich nachdem ich alle xx Daten bekomme habe, 
antworten soll. Bei 1 will der Master nur schreiben und bei 2 nur 
lesen.....
Nen nicht schöner Workaround wie ich finde - da das ja eigentlich I2C 
abnimmt.

PS: Der Source-Code zu dem Thema von RN-Wissen zeigt übrigens das 
gleiche Verhalten wie Mannis.... :-(

Vielen Dank wenn ihr euch mit der doch schon recht tiefen Frage 
beschäftigt.

Schöne Grüße
Maik

von Juergen G. (jup)


Lesenswert?

Hallo Maik,

ich hab auch schon ne Menge mit AVR's und I2C gemacht und habe viele 
Anwendungen wo mehrere AVR's Daten ueber I2C austauschen.

Ich habe auch am Anfang mit den libs rumprobiert die im Netz zu finden 
sind, aber irgendwie hat da immer was gefehlt um eine Multi Master/Slave 
com aufzubauen.

Ich bin mir nicht sicher ob ich auch mit dem Repeatet Start Problem 
rumgefieselt habe, es waren so viele Dinge bis es dann endlich lief wie 
ich es wollte.
Ich habe in allem was ich zum I2C gelesen habe (bei allen Herstellern) 
immer gesehen das Repeatet Start nur dazu genommen wurde um eine 
Fehlerhafte com erneut anzufragen. Also bei einem Arbitration lost, 
Timeout etc.

Jetzt mache ich es so wie alle I2C IC's, einer hat einen Puffer und der 
andere liest/schreibt diesen Puffer nachdem er mitgeteilt hat wo er 
anfangen moechte.
Das ganze laeuft Multi Master/Slave

Ju

von Maik (Gast)


Lesenswert?

Juergen G. schrieb:
> Jetzt mache ich es so wie alle I2C IC's, einer hat einen Puffer und der
> andere liest/schreibt diesen Puffer nachdem er mitgeteilt hat wo er
> anfangen moechte.
> Das ganze laeuft Multi Master/Slave

Moin!,
das finde ich gut einen Leidensgenossen zu haben :-)

Das wollte ich auch am Anfang machen, doch finde ich es wichtig, dass 
der Bus nicht nach einem Write nicht wiedeer freigegeben wird. Da wenn 
ich z.B. 3 Avr's habe und 2 gleichzeitig was haben wollen, die nicht die 
sich gegenseitig die Buffer raisen... :-(

Ich denke, dass ich das wie in der Application-Note mache, auch wenn das 
extrem hässlich ist :-(

Danke für deine Antwort

Liebe Grüße
Maik

von Juergen G. (jup)


Lesenswert?

Maik schrieb:
> z.B. 3 Avr's habe und 2 gleichzeitig was haben wollen, die nicht die
> sich gegenseitig die Buffer raisen... :-(

Das wird in der Praxis nicht so heiss gegessen wie's gekocht wird.
Ich habe ein System in dem 18 uC's permanent grosse Anzahl an Daten 
austauschen. Jeder uC will mal irgendetwas von einem anderen, 
zusaetzlich sind noch ein paar I2C Sensoren im selben Bus. Beim 
beobachten des Bus sieht man, das da kaum Luecken sind. Doch ausser ein 
paar Arbitration Lost hab ich keinerlei Fehler auf dem Bus.
Ich habe nicht ausgerechnet wie hoch die mathematische Warscheinlichkeit 
ist, das ein anderer Master eine Com in genau dem Moment startet wenn 
eine "Conversation" zwischen dem schreiben des "Speicher Bytes" und der 
Start Condition zum lesen ist.
Bei meinen Programmen sind da in der Regel max. 6 in der Regel 2 MCU 
Cycles dazwischen.
Ich merke mir auch von welchem Master das "Speicher Byte" gesetzt wurde.
Wenn jetzt nach dem Setzen des "Speicher Bytes" ein anderer Master 
daherkommt und das "Speicher Byte" "umsetzt" und danach der erste Master 
wieder kommt um den Inhalt von der von "Ihm" gesetzten Speicheradresse 
zu lesen, bekommt er ein NACK und verwirft die Conversation.

Meine State Machine laesst ein Kontinuierliches schreiben zu, das heist 
will ein Master nur schreiben, dann ist das erste Byte was kommt die 
Speicheradresse ab der geschrieben werden soll und die darauf folgenden 
Bytes die Daten die geschrieben werden. Geschrieben wird Ringweise ohne 
Ueberpruefung. Der Master ist verantwortlich dafuer was er dem Slave 
gibt.
Damit kommt eine Unterbrechung der Com nur zustande wenn erst die 
Speicheradresse geschrieben und dann gelesen werden soll.


Ju

von tset (Gast)


Lesenswert?

Juergen G. schrieb:
> Ich bin mir nicht sicher ob ich auch mit dem Repeatet Start Problem
> rumgefieselt habe, es waren so viele Dinge bis es dann endlich lief wie
> ich es wollte.
Also in der Peter-Fleury-I²C-Lib ist die restart-Funktion 
(i2c_rep_start) nichts anderes als eine leere Funktion, die die 
start-Funktion (i2c_start) aufruft.

P.S.: Was ist die I2C-Lib von Manni und wo findet man die?

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.