Estaba tratando de desarrollar una función de controlador I2C para leer datos de un sensor de proximidad (Cypress CY8CMBR3102) e inicialmente la función funcionó muy bien y con éxito. Pero mientras lee continuamente datos del dispositivo, el esclavo mantiene baja la línea SDA y el indicador de arbitraje del bus se establece en la MCU (NXP MKE04Z64). Esto está bloqueando toda comunicación futura.
Intenté la siguiente solución en mi código, pero no funcionó.
Cada vez que quiero leer desde el dispositivo, mantengo los pines I2C como GPIO y verifico el nivel en el bus de datos.
El módulo I2C se habilitará solo si el bus de datos está en estado alto.
Si el bus se mantiene bajo, el pin SCL se registra como un GPIO hasta que el esclavo libera SDA.
Cuando probé la solución anterior en el dispositivo, el código se atasca en el bucle donde cronometro el pin SCL hasta que SDA vuelve a estar alto. Lo que significa que sincronizar SCL no ayuda a liberar el bus del esclavo.
Sin embargo, si desenchufo el esclavo o realizo un reinicio de energía, el bus se libera ya que el esclavo se está reiniciando.
Sigo sin poder encontrar la causa de este problema. Supervisé las líneas usando un DSO y no encontré ningún ruido significativo en las líneas.
1. ¿Cuál podría ser la posible razón de este bloqueo de autobús?
2. ¿Cómo detectar y recuperar una vez bloqueado el autobús?
Los detalles de nuestra configuración son los siguientes:
-> Maestro único - Esclavo único
-> Maestro - NXP MKE04Z64 Brazo Cortex M0+
-> Esclavo - Controlador de proximidad Cypress CY8CMBR3102 Capsense
-> Reloj I2C de 400 KHz
-> Los pines MCU son de drenaje abierto con pull-ups externos de 4.7K.
-> Maestro y Esclavo están en tableros separados interconectados con un cable de 6 cm de largo.
Parece que esto tuvo algo que ver con mi MCU maestro (NXP MKE04Z64) . Profundicé un poco más en los viejos foros de NXP y descubrí que muchas personas tenían el mismo problema de bloqueo del bus I2C de los MCU Kinetis E Series y NXP aún no ha respondido. Tal vez algo esté mal con el diseño del chip. Intenté GPIO golpeando el mismo esclavo en lugar de usar el módulo I2C y el problema se resolvió. También intenté conducir el mismo esclavo desde otro MCU donde funcionó muy bien.
Arce
KKSjunior
chris stratton
Arce
KKSjunior
KKSjunior
chris stratton