Vorweg: Ich kann C kaum lesen geschwiege denn fremden Source nachvollziehen. Die Kommunikation via ISR zu realisieren beinhaltet bereits einige Fehlermöglichkeiten.
Hast du schon getestet, ob es klappt, wenn alle Befehle mit ausreichend Pausenzeit dazwischen als sequentielle Befehlsfolge programmiert sind? Das vermeidet Fehlermöglichkeiten mit ISR und I2C-bezogenen Statusbits.
Weitere Fehlermöglichkeit: Der I2C-Bus ist nach einem Warmstart (denkbar auch nach Kaltstart = Power Up) möglicherweise blockiert. Wenn zu Beginn der Kommunikation die Datenleitung low ist, wird kein Busbetrieb möglich sein. Man kann dann z.B. so lange den Pegel der Clock-Leitung hin und her wechseln, bis die Datenleitung auf High gegangen ist. Erst dann kann der Master einen Busreset durchsetzen.
Ist das Protokoll peinlich genau eingehalten? (Ich hab schon mit einem voll I2C-konformen Baustein gearbeitet, der allerdings auf der Verwendung eines Repeated Start beharrte, wo formal auch ein Stop & Start funktionieren sollte.) Es sind m.W. verschiedene Wege möglich, um Daten an die Portpins zu schreiben.
Sind ausreichend niederohmige Pullups an den I2C-Leitungen (ggf. inkl. Interruptleitung - da bin ich mir nicht sicher) ? Die internen Pullups den Controllers können die Busleitungen sehr wahrscheinlich nicht genügend schnell Richtung High ziehen.
Ich hoffe doch, aus deinen Fehlern lernen zu können, denn ich habe in nächster Zeit genau diesen Baustein ebenfalls auf der Agenda stehen.
Lesezeichen