Hinweis:
Der Autor steuert SCL nicht über Open-Collector an, sondern treibt SCL
direkt. Dies entspricht nicht I2C-Spezifikationen und führt zu
potentiellen Problemen u.A. bei Slaves, die Clock-Stretching betreiben.
Im Fall der Slave den Clock verlangsamen will, versucht er diesen auf
Low zu ziehen, was ihm bei Open-Collector über die Pullups auch gelingt.
Bei diesem Code hier setzt der Master dagegen SCL, der als Ausgang
betrieben wird, aktiv auf High, mit entsprechenden Auswirkungen auf die
Hardware.
Der relevante Teil des Codes:
1 | I2C_DDR |= (1<<SCL);
|
2 | ...
|
3 | #define I2C_SCL_LOW I2C_PORT &= ~(1 << SCL)
|
4 | #define I2C_SCL_HIGH I2C_PORT |= (1 << SCL)
|
Sollte der Autor das noch lesen, so wär's schön wenn er seinen Code
korrigiert.