PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : TWI/I2C Bus Verhalten bei Reset eines Teilnehmers?



Minifriese
07.07.2007, 14:12
Moin moin!

Ich lasse zwei (später mehr) ATmegas über TWI kommunizieren. Da ich beim debuggen häufig Resets erzeuge, nämlich immer beim Laden neuer Software, ist mir aufgefallen, daß der TWI-Bus etwas seltsam reagiert. Wenn ich den Slave resette (der in meinem Fall vom Master regelmäßig gepollt wird), funktioniert der Bus hinterher sofort wieder. Wenn ich aber den Master resette, muß ich hinterher den Slave ebenfalls resetten, sonst hängt der Bus sich auf.

Gibt es da ein System bzw. Spezifikationen, was passiert, wenn man Geräte am Bus abschaltet/zuschaltet oder wenn man die Busleitungen bei laufendem Bus mit (unter Spannung stehenden) neuen Teilnehmern verbindet?

Im TWI-Manual von AVR steht glaube ich nur, daß für ordnungsgemäßen Betrieb alle Teilnehmer angeschaltet sein müssen. Ob der Bus tolerant auf "online" angesteckte Teilnehmer reagiert, steht dort nicht, oder?

Ich plane jetzt, einen I/O-Pin des Masters zum Reset-Eingang des Slaves zu verdrahten, damit der Master beim "Hochfahren" den Slave resetten kann. Das würde das Problem hoffentlich umgehen, was meint ihr?

Ich benutze übrigens die internen Pullups im Master für den TWI-Bus und die normale Geschwindigkeit (100kHz).

Gruß,

Nils

uwegw
07.07.2007, 14:18
Probier mal externe Pullups, oder aktivier zusätzlich die Pullups im Slave.

Minifriese
07.07.2007, 14:23
Wenn ich die Pullups der Slave mit aktiviere, ist das doch wie eine Parallelschaltung der Widerstände, entspräche also kleineren Pullups, richtig?

Was würde denn dann passieren, sollte der Bus dann auch nach einem Master-Reset wieder anlaufen?

Danke, Nils

uwegw
07.07.2007, 14:34
Wenn ich die Pullups der Slave mit aktiviere, ist das doch wie eine Parallelschaltung der Widerstände, entspräche also kleineren Pullups, richtig?
Ja, und da die internen Pullups einen Wert von etwa 50-100k haben, stört das nicht weiter. Für längere Busse sollte man sowieso kleiner Widerstände (5 bis 10k) verwenden.

Minifriese
07.07.2007, 14:52
OK, danke. Mein Bus ist zwar nicht lang (jetzt zwei, später sechs Teilnehmer, <0,5m), aber ich glaube, externe Pullups werden öfter empfohlen. Werde ich also mal testen. So groß ist der HW-Aufwand ja nicht...

Aber das hat mit dem unterschiedlichen Verhalten bei Master- bzw. Slave-Reset nichts zu tun, oder?
Mich würde interessieren, ob man den Bus nach Reset des Masters auch per Software, im Master oder Slave, "wiederbeleben" kann oder ob wirklich nur der Reset hilft?
Der Reset eines ATmegas per I/O-Pin eines anderen AVRs sollte funktionieren, oder?

Nils

uwegw
07.07.2007, 15:05
OK, danke. Mein Bus ist zwar nicht lang (jetzt zwei, später sechs Teilnehmer, <0,5m), aber ich glaube, externe Pullups werden öfter empfohlen. Werde ich also mal testen. So groß ist der HW-Aufwand ja nicht...

Nen halber Meter ist schon ganz schön lang für die internen pullups.



Mich würde interessieren, ob man den Bus nach Reset des Masters auch per Software, im Master oder Slave, "wiederbeleben" kann oder ob wirklich nur der Reset hilft?

Das TWI im Slave abschalten und neu initalisieren dürfte auch helfen. Du könntest ja ein Timeout einbauen. Wenn einige Sekunden nichts auf dem Bus passiert ist, das TWI neustarten.



Der Reset eines ATmegas per I/O-Pin eines anderen AVRs sollte funktionieren, oder?

Müsste.

Minifriese
07.07.2007, 15:33
Hm, stimmt, da muß ich mir mal ne passende Timeout-Routine überlegen. Vermutlich eher im Master, dann brauch ich die Sache nur einmal zu schreiben. Wenn beim Polling eines Slaves z.B. fünfmal die TWI-Routine mit Fehler beendet wurde, könnte ich ein HW-Signal an den Slave schicken, daß er seinen TWI resetten soll...

Ich habe eh vor, alle Platinen mit einem zehnpoligen Flachbandkabel zu verbinden, auf dem VCC, GND, SDA und SCL liegen. Die restlichen sechs Adern würde ich zu freien I/O-Pins legen (davon habe ich überall genug), man weiß ja nie, wozu man sie mal braucht... Außerdem lässt sich jedes dieser Reservesignale per Jumper mit dem Reset des AVR auf der jeweilgen Platine verbinden, sodaß ich theoretisch vom Master aus jeden anderen AVR gezielt resetten kann. Oder per normalem I/O-Signal ein Kommando zum Neustart des TWIs geben kann, mal schauen...
Danke für die Tips,
Nils