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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.