AVR TWI-Hardware als Master und USI als Slave

OP #4152797
Lesenswert?
• ▲
▼
Hi,

Ich habe nur ein paar Detailfragen zu dem USI als TWI im Slave.
Eins vorweg: Datenblatt und Appnotes habe ich ausgiebig studiert aber 
was ich so an Beispielen gefunden habe widerspricht dem teilweise.
Da wird mit ASM rumgehüsert weil es angeblich so zeitkritisch sei aber 
halte das alles nicht für nötig. Geht alles per Ints und Hardware, auch 
mit dem USI.

Der Master wird ein Mega1280 mit echter TWI, der Slave wird ein Tiny861 
mit leider nur USI. Den brauche ich wegen den 3x2 PWM-Ausgängen.
Der Slave wird dabei immer wieder mal mit einem anderen Int beschäftigt 
sein oder wartet zeitkritisch auf einen.

Ich stelle TWI inkl. dem Interrupt des Counters ein, also USIWM1 USIWM0 
beide 1, SCL bleibt low wenn der Counter überläuft oder ein Start 
erkannt wird.
Die Ints für Start und Overflow muß ich gelegentlioch deaktivieren, SCL 
bleibt low und der Master muß eben warten. Das tut die richtige 
TWI-Hardware doch, oder?
Dann erschliesst sich für mich der Sinn des USI Buffer Register nicht.
Argument dafür ist das ACK oder NACK, welches das USIDR beim nächsten 
Takt einen weiter geschoben hat und das MSB ist weg.
Aber als Slave kann ich das stoppen mit der Option "SCL bleibt low wenn 
der Counter überläuft" und als Master hätte ich das ja mit dem Takt 
sowieso in der Hand. USI als Master lassen wir hier mal weg, das ist 
wohl kompletter Mist.
Slave hat ein Byte gesendet, (also Master Read), Slave zieht SCL auf low 
nach dem Überlauf des Counters und Master muß warten bis der Slave in 
die ISR springt und bereit ist das ACK oder NACK zu empfangen. Ausserdem 
muß der Slave danach ja auch rechtzeitig das USIDR wieder füllen bevor 
der Master das nächste Byte lesen will. Der Takt schiebt das ja nur 
immer weiter durch.
Sendet der Master das gleiche Spiel. Beim Overflow hält die Slave-USI 
SCK low bis der Slave die Zeit findet in die ISR zu springen, das Byte 
aus dem USIDR zu holen, dann SCK freigeben, ACK oder NACK MANUELL zu 
erzeugen (was für ein Dreck) und weiter gehts.

Habe ich das soweit richtig verstanden?

Dann noch zu den Ports. Mit DDRX.n = 1 sind die beide Open-Collector 
wenn als TWI eingestellt, oder?

Vielen Dank für alle Hinweise.

Gruß,
Norbert
#4153368
Lesenswert?
• ▲
▼
Korrekt.
Das USI kann SCL auf low halten, sobald ein Interruptflag gesetzt wurde.
Und der Master kann SCL einlesen und muß solange warten. Bzw. das HW-TWI 
der ATmega macht das vollautomatisch.
I2C ist also nicht zeitkritisch und muß daher nicht in Assembler 
geschrieben werden.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.