Forum: Mikrocontroller und Digitale Elektronik AVR TWI-Hardware als Master und USI als Slave


von Norbert S. (norberts)


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

von Peter D. (peda)


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.

von Norbert S. (norberts)


Lesenswert?

Hi,

Prima, dann sehe ich das aus so berufenem Munde mal als Bestätigung, daß 
das so funktionieren müsste wie geplant.
Danke!

Gruß,
Norbert

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.