Ich habe versucht, eine I2C-Treiberfunktion zum Lesen von Daten von einem Näherungssensor (Cypress CY8CMBR3102) zu entwickeln, und anfangs hat die Funktion sehr gut und erfolgreich funktioniert. Aber während der Slave kontinuierlich Daten vom Gerät liest, hält der Slave die SDA-Leitung niedrig und das Busarbitrierungs-Flag wird in der MCU (NXP MKE04Z64) gesetzt. Dadurch wird jede weitere Kommunikation blockiert.
Ich habe den folgenden Fix in meinem Code ausprobiert, aber es hat nicht funktioniert.
Jedes Mal, wenn ich vom Gerät lesen möchte, behalte ich die I2C-Pins als GPIOs und überprüfe den Pegel im Datenbus.
Das I2C-Modul wird nur aktiviert, wenn der Datenbus im High-Zustand ist.
Wenn der Bus niedrig gehalten wird, wird der SCL-Pin als GPIO getaktet, bis SDA vom Slave freigegeben wird.
Als ich den obigen Fix im Gerät getestet habe, bleibt der Code in der Schleife hängen, in der ich den SCL-Pin takte, bis SDA wieder hoch wird. Das bedeutet, dass das Takten von SCL nicht dazu beiträgt, den Bus vom Slave freizugeben.
Wenn ich jedoch den Slave ausstecke oder einen Power-Reset durchführe, wird der Bus freigegeben, da der Slave zurückgesetzt wird.
Ich kann die Ursache für dieses Problem immer noch nicht finden. Ich habe die Leitungen mit einem DSO überwacht und kein nennenswertes Rauschen in den Leitungen gefunden.
1. Was könnte der mögliche Grund für diese Bussperre sein?
2. Wie kann man erkennen und wiederherstellen, wenn der Bus gesperrt ist?
Die Details unseres Setups sind wie folgt:
-> Einzelner Master - Einzelner Slave
-> Meister - NXP MKE04Z64 Arm Cortex M0+
-> Slave - Cypress CY8CMBR3102 Capsense Näherungsregler
-> 400KHz I2C-Takt
-> MCU-Pins sind Open-Drain mit 4,7 K externen Pull-ups.
-> Master und Slave sind in getrennten Platinen mit einem 6cm langen Draht verbunden.
Sieht so aus, als hätte dies etwas mit meiner Master- MCU (NXP MKE04Z64) zu tun . Ich habe etwas tiefer in die alten NXP-Foren gegraben und herausgefunden, dass viele Leute das gleiche Problem der I2C-Bus-Sperrung bei den MCUs der Kinetis E-Serie hatten und NXP noch nicht darauf reagiert hat. Vielleicht stimmt etwas mit dem Chipdesign nicht. Ich habe versucht, denselben Slave mit GPIO-Bit-Banging zu versehen, anstatt das I2C-Modul zu verwenden, und das Problem wurde gelöst. Ich habe auch versucht, denselben Slave von einer anderen MCU aus zu fahren, wo es sehr gut funktioniert hat.
Ahorn
KKSjunior
Chris Stratton
Ahorn
KKSjunior
KKSjunior
Chris Stratton