Forum: Mikrocontroller und Digitale Elektronik ATtiny84 - USI - Port defnition


von Bernd (Gast)


Lesenswert?

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 ?

von Mobius (Gast)


Lesenswert?

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

von Bernd (Gast)


Lesenswert?

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