Das kommt mir merkwürdig vor. Solange der Slave SCL auf low festhält, steht der Bus. Zur Not auch ewig, es gibt keinen Timeout (außer beim SMBus, aber auch der ist lang).
Das ACK wird nicht gesendet, der Master gibt auch beim ACK/NACK die Clock vor. Es ist einfach das neunte Bit einer Übertragung.Ich habe die Routine auch schon dahin geändert, das ich das AC/NACK wirklich am Ende der Routine sende
Bei den Kontrolern die ich kenne, geht das so: der Kontroler hält beim letzten Takt SCL low und damit den Bus an und löst einen Interrupt aus. Die CPU hat jetzt alle Zeit der Welt, zu reagieren. Ganz zum Schluß wird SCL freigegeben und die Übertragung geht weiter.
Da die Clock beim I2C ein Handshake macht: Master setzt SCL low, Slave erkennt das und setzt auch low, Master läßt los, Slave auch (wenn er soweit ist) darf das kein Problem sein.Derzeit habe ich einen 200Mhz CPU für Linux im Einsatz, die 400Mhz CPU liegt aber schon auf dem Schreibtisch und wartet auf dem Einbau. Ich habe da schon die Vermutung, das das ganze noch schlimmer wird, da hier dann das Abtaster Raster kürzer wird.
Dein Problem wird auch bei 100kHz da sein, nur seltener auftreten. Du solltest die Abläufe in deinem Code vor allem im Zusammenwirken mit den Steuerbits des Kontrolers noch mal überprüfen.
MfG Klebwax
Lesezeichen