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