Hallo, in der Atmel APP Note AVR312 wird vorgestellt wie das USI IF als I2C slave konfiguriert wird. Der Demo Code läuft einwandfrei auf einem ATtiny84. Laut Demo Code werden die Port Pins wie folgt initialisiert: PORT_USI |= (1<<PORT_USI_SCL); // Set SCL high PORT_USI |= (1<<PORT_USI_SDA); // Set SDA high DDR_USI |= (1<<PORT_USI_SCL); // Set SCL as output DDR_USI &= ~(1<<PORT_USI_SDA); // Set SDA as input An der Stelle ist mir nicht klar: 1.) Warum der SCL Pin des slave (!) als output konfiguriert wird. ( Wenn ich die SCL Konfiguration auskommentiere klappt die Kommunikation nicht ) 2.) Trotz externer Pull Up Widerstände der interne SDA Pull Up aktiviert werden muss. ( Wenn ich die PORT_USI |= (1<<PORT_USI_SDA); Zeile auskommentiere klappt die Kommunikation nicht ) Hat jemand eine Idee ?
1) Weil SCL low gezogen wird, wenn ein a) Start-Condition erkannt wird und b) wenn ein Counter overflow passiert. Damit verzögert der Slave die Kommunikation mit dem Master bis die Daten im USIDR drin stehen (und die betreffende Interrupt-Flag gelöscht wurde). 2) Sobald USI als TWI konfiguriert wird, sind die Pins Open-Drain. Folglich reagiert der Ausgang nur auf ein 0 im Port. Steht alles im Datenblatt ;) lg Mobius
Verstehe ich noch nicht... 1.) Ab wann übernimmt die USI HW die Kontrolle über die Pins ? Der Slave zieht SCL in den genannten Conditions low. Warum wird der SCL Pin dann mit high initialisiert ? 2.) D.h. die USI hardware toggelt intern das Port Bit und ich gebe nur den initalen Zustand vor ?
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.