Bus I2C ocupado

2

Tengo un problema con una comunicación I2C y quiero que me preguntes si hay una solución mejor que la mía.

Estoy programando un STM32F103 en este momento. Hay un sensor (MPU6050) que está conectado a través de I2C al STM32. Reconocí que si reinicio el STM32 varias veces, el STM32 se atasca (o se produce un error de tiempo de espera) durante la inicialización del I2C. El error de tiempo de espera fue durante la espera de la bandera ocupada. Así que la comunicación I2C fue "ocupada". El MPU6050 es el único otro dispositivo I2C (esclavo).

En mi opinión, hay un error, porque estaba leyendo un registro del MPU6050 cuando reinicié el STM32. Así que el MPU6050 nunca obtiene la condición de parada.

No sé cómo restablecer la conexión I2C, cuando el bus está "ocupado" (por el MPU6050). Así que mi solución sería hacer un reinicio de hardware con una puerta de transmisión del MPU6050. ¿Hay tal vez una solución de software más simple?

Gracias por la ayuda.

    
pregunta Lukas_M94

1 respuesta

6

Una solución general para desempacar un bus I2C es simplemente marcar la línea SCL durante 18 o más ciclos. Esto marcará el resto del byte actual fuera del esclavo, le permitirá ver un NACK y luego un byte más. Sin embargo, si el esclavo está muy confundido, esto puede no funcionar. Además, la mayoría de los módulos de hardware I2C no pueden hacer esto, por lo que debería tomar el control de las líneas I2C como GPIO y cronometrarlas manualmente.

La mejor solución es conducir externamente una línea de reinicio al esclavo. Además, algunos esclavos pueden configurarse para que se agoten después de un tiempo relativamente largo (por ejemplo, 250 ms).

    
respondido por el DoxyLover

Lea otras preguntas en las etiquetas