USI_TWI_Master.c von Atmel

Gast #6644471
Lesenswert?

Guten Abend,
ich sitze gerade an der USI_TWI_Master aus der AVR310, um die für meine 
Zwecke zu adaptieren. Dabei bin ich über folgende Zeilen gestolpert:
1
PORT_USI |= (1<<PIN_USI_SCL);  // Release SCL.
2
...
3
PORT_USI |= (1<<PIN_USI_SDA);  // Release SDA.
Deren Zweck ist mir klar, nur frage ich mich, warum hier die Pins aktiv 
auf high gezogen werden? Es gibt ja die Pullups, die die Leitung 
eigentlich auf high ziehen, wenn der Pin nicht dran zieht. Deswegen 
würde ich an der Stelle erwarten, dass dort mit
1
DDR_USI &= ~(1<<PIN_USI_xxx);
die beiden Pins als Eingang geschaltet werden und dann der Pullup (der 
auch vorher aktiviert wurde) seine Arbeit tun kann. Das wäre zwar 
langsamer, aber dafür sind die Pullups ja da.
Und wenn bspw. ein Slave mittels Clock-stretching SCL auf low zieht und 
dann kommt mein Controller und schaltet seinen Ausgang nach high...gibt 
einer der beiden Pins eher früher als später auf. Warum hier also diesen 
unsicherer Weg anstelle des sicheren Weges beschreiten?
Gast #6645655
Lesenswert?

Wenn du die USI mit dem USI Control Register in den 2-, oder
3-Wire Mode geschaltet hast, arbeiten die entsprechenden Port-
Pins im oC (open Collector) Mode.
Und wenn die nicht 0 = aktiv Null sein sollen, brauchen sie eine
1 = Hi-Z.

Steht jedenfalls im Datenblatt so...
Gast #6646135
Lesenswert?

Ich habe mir jetzt meine Bibliothek geschrieben (USI_I2C_Master.c/.h) 
und mir ein kleines Testprogramm geschrieben, dass einfach jede Sekunde 
einen um 1 inkrementierten Wert senden soll (main.c).
Ich muss leider feststellen, dass SCL fleißig taktet, SDA bewegt sich 
aber nicht.
Lasse ich den SDA-Pin manuell togglen, dann tut er es, sowohl mit
1
PINA |= 1<<6;
als auch mit
1
I2CinitM();
2
while(19{
3
    PORT_USI |= 1<<USI_SDA;
4
    _delay_us(20);
5
    PORT_USI &= ~(1<<USI_SDA);
6
    _delay_us(20);
7
}
Der Pin ist also i.O.,meine #defines passen und auch als USI 
konfiguriert funktioniert der Pin.

Im eigentlichen Programm rührt sich SDA wie gesagt überhaupt nicht. 
Nicht für die Start Condition und auch danach nicht.
Geschrieben und compiliert habe ich das Ganze mit Atmel Studio 7, 
Controller ist ein ATtiny24A.

Ich wäre sehr dankbar, wenn sich jemand die Mühe machen und mir helfen 
würde.
Angehängte Dateien:
Gast #6646158
Lesenswert?

Dann ergeben sich für mich aber 2 Fragen:
1. Warum aktiviert Atmel die internen Pullups in seinem AVR310-Code?
2. Wenn die Pullups deaktiviert sind, warum ist SDA dann dauerhaft auf 
high, obwohl es entweder nach low gezogen wird oder "in der Luft hängt"?
Gast #6646175
Lesenswert?

Jörg W. schrieb:
> Selbst wenn: die sind sowieso zu "dünn" für eine vernünftige
> I²C-Funktion. Du brauchst da immer externe, so 4,7 oder 10 kΩ sind
> üblich.

Mit Arduinos habe ich bis jetzt nie Probleme mit den internen und I2C 
gehabt. Mit blanken Controllern habe ich I2C bis jetzt noch nicht 
benutzt

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren