Ich kenne zwar den Prozessor nicht, im gezeigten Code kann ich aber nichts von Pullups erkennen. Ich sehe da nur Daten und Direction-Bits. Die Komentare scheinen mir falsch und machen auch keinen Sinn, die Pullups sind immer an, nur der Treiber wird an- und ausgeschaltet.
Was ich aber sehe, ist daß SCL und SDA unterschiedlich behandelt werden. SCL wird nicht über das Direction-Bit als "quasi Opencollector Ausgang" gesteuert, sondern direkt. Während man mit externen Pullups von wenigen k Ohm gegen 3,3V die internen Pullups von mehren 10k gegen 5V noch neutralisieren könnte, geht das so garnicht.
Was man aus diesen Macros aber sehen kann ist, das dieser Code in die Kategorie "works mostly" gehört. Sowohl SDA als auch SCL können und werden sowohl vom Master als auch vom Slave angesteuert. Bei SCL nennt man das Clock stretching. Wie das funktioniert, steht in der I2C Spec. Mit den gezeigten Macros für SCL läßt sich das nicht implementieren. Ich würde den Code daher nicht verwenden.
MfG Klebwax
Lesezeichen