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?