Ich versuche das USI in einem attiny45 als I2C Slave zu verwenden.
Wenn ich die Doku zur CPU und die AppNote312 angucke, sollte der
StartConditionInterrupt bereits ausgelöst werden sobald SDA low wird.
Im Beispielcode wird daher noch händisch gewartet bis SCL auch low wird
und die Startcondition quasi komplett ist:
1 | // Wait for SCL to go low to ensure the "Start Condition" has completed.
|
2 | // If a Stop condition arises then leave the interrupt to prevent waiting forever.
|
3 | while ( (PIN_USI & (1<<PORT_USI_SCL)) & !(tmpUSISR & (1<<USIPF)) );
|
Im Interrupt zu warten kann ich mir in meinem Fall nicht leisten. Das
wäre ja eigentlich auch leicht anders zu lösen.
Allerdings löst "mein" USI den Interrupt tatsächlich erst aus, sobald
SCL ebenfalls low wird.
Das kann ich mir nicht recht erklären. Zum einen entspricht es nicht dem
aufgrund des Schaltplans vom StartCondition Detector zu erwartenden
Verhalten, zum anderen wäre dann die obige Codezeile sinnlos.