Bei einem Fujitsu Controller hatte ich mal ein ähnliches Problem, der
Controller blieb blieb hängen, weil die SDA Leitung nicht
erwartungsgemäß auf High ging. Und das war so:
Es wurde ein I2C EEPROM ausgelesen, bei dem viele Datenzellen auf "0"
waren. Erwartungsgemäß ist somit beim Auslesen die SDA Leitung relativ
häufig Low. Sporadisch hing sich das Protokoll auf, auch nach kompletten
Neustart ging nichts. Es klemmte ebenfalls bei der Erzeugung der
Start-Condition. Nach längeren Arbeitspausen (ab ca. 20 Minuten) ging es
dann auf einmal wieder. Auffällig war bei Messungen auf jeden Fall, dass
das EEPROM seinerseits die Datenleitung auf Low zog. Einfach so, auch
nach Reset und Trennung der Spannung.
Warum?
Es handelte sich um ein EEPROM, dass auch noch für Spannungen ab 1.8V
spezifiziert war. Ein EEPROM hat keinen Reset-Eingang, die interne
State-Machine wird nur bei einem Power-On Reset zurückgesetzt.
Irgendwann hat es eine Verhakung im Protokoll gegeben und das EEPROM ist
auf SDA=0 stehengeblieben. Das Ausschalten der Spannung hat nichts
gebracht, da VCC relativ lange bei ca. 1V stehenbleibt. Das EEPROM war
selbst bei dieser Spannung noch funktionell. Erst nach langer Zeit fällt
die Spannung weit unter 1V und das EEPROM machte einen vernünftigen
Power-On Reset. Daher das Phänomen nach Mittagspause, wo kurzzeitig
wieder alles funktionierte.
Die Lösung lag darin, nach Power-On des Mikrocontrollers einfach einige
zig Takte auf SCL manuell zu erzeugen, während SDA=1 bleibt. Dadurch kam
die State-Machine im EEPROM wieder in den Tritt und der I2C Controller
im Mikrocontroller fand bei Erzeugung der Start-Bedingung den korrekten
Zustand SDA=1 vor!
Dieses Phänomen könntet ihr auch mal abchecken, die I2C Start
Implementierungen bei verschiedenen Controllern sind häufig so
gestrickt, dass einfach per Endlos-Loop auf SDA=1 (Busfreigabe) gewartet
wird. Ist bei dieser Abfrage definitiv SDA=1 ???