Problemas de I2C - SCL está atascado alto [duplicado]

2

Estoy trabajando en una tarjeta portadora personalizada utilizando un microcontrolador TI como maestro y un IC de ADC como esclavo. Parece que a veces SCL permanecerá alto cuando no debería, casi como el maestro lo libera. Solo obtenemos esta condición de falla al restablecer la MCU (o el ciclo de alimentación total del sistema), pero no sucede cada vez, tal vez uno de cada diez en promedio.

La transferencia de datos estará bien la mayor parte del tiempo, hasta que uno de los reinicios desafortunados cause los problemas. Puede ver en la imagen de abajo que, después de enviar el byte de dirección, SCL simplemente se eleva después de unos pocos pulsos de reloj. ¿Algunas ideas?

    
pregunta Micah

3 respuestas

5

De los comentarios recientes:

  

el microprocesador devuelve una marca de arbitraje perdido

Gracias, es vital nueva información y merece ser agregada a la pregunta. Así lo hace esta información:

  

Descubrí que este problema ocurre cuando se presiona el restablecimiento durante la actividad en SDA. Si se presiona el reinicio mientras el SDA está alto, el bus no se desordena.

Según la nueva información, creo que su problema es un duplicado de la pregunta anterior " bus I2C ocupado " .

Su expectativa de que " pensaría que la MCU volvería a funcionar en un estado bueno conocido con I2C inicializado " no es verdadera, porque la MCU no controla el estado de todos dispositivos en el bus I2C. El I2C Master solo conoce y controla su propio estado. Se basa en otros dispositivos que siguen el protocolo I2C para inferir el estado de su . Restablecer solo los dispositivos algunos en el bus puede provocar una falta de coincidencia entre los estados internos de los distintos dispositivos en el bus y provocar problemas como el suyo.

Cuando se reinician, los Maestros I2C pueden verse afectados cuando ven que un Esclavo I2C está bajando el nivel de SDA, esperando pulsos de reloj desde el Maestro I2C (que el Maestro no enviará, ya que solo se reinició) para que el Esclavo espera, todavía tirando de SDA bajo.

Por ejemplo: después de reiniciar, algunos maestros I2C (por ejemplo, MCU), antes de que comiencen el reloj SCL I2C, verifican la señal SDA. En su caso, ve que SDA es ya baja . Este estado se puede interpretar como que hay otro dispositivo I2C Master que impulsa el bus. En realidad, la causa de que la SDA sea baja es el esclavo I2C, que estaba en la mitad de la transmisión antes de que se restableciera la MCU. Sin embargo, ahora el esclavo no está recibiendo pulsos SCL del maestro I2C y, por lo tanto, no puede completar su transmisión. La mayoría de los esclavos I2C no agotan el tiempo de espera y liberan SDA en esa situación, aunque algunos lo hacen.

Las correcciones en la respuesta a la pregunta vinculada anteriormente se aplicarían aquí, por ejemplo. pulsando SCL manualmente, hasta que el esclavo I2C libere SDA, o reinicie el esclavo I2C (a través de un pin de reinicio o interruptor de alimentación local en el (los) esclavo (s) I2C). Luego reinicie I2C en el Master. El maestro I2C verá que SDA ya no se mantiene bajo, por lo que comenzará a manejar SCL nuevamente, ya que no se confundirá con que hay otro maestro I2C en el bus.

    
respondido por el SamGibson
2

Mire más de cerca: SDA es bajo .

Este es el caso de "arbitraje perdido", donde el maestro quiere poner un "1" en el bus pero lee un cero. En términos de I²C, esto significaría que hay un otro maestro en el bus, y por lo tanto el maestro original deja de tocar la línea SCL.

Ahora tendrá que ver por qué el ADC (o algo más en su bus I²C) presenta este comportamiento, pero esa es una pregunta diferente y mucho más interesante.

    
respondido por el Turbo J
2

Este es un problema de la MCU que se reinicia durante una transacción de bus y esencialmente se olvida de lo que estaba haciendo. El ADC esclavo no tiene idea de que la MCU se reinició y aún piensa que se están comunicando y está esperando que la MCU responda con más pulsos de reloj. Sin embargo, debido a que la MCU perdió el poder, no sabe dónde lo dejó, mientras tanto, está viendo baja la línea SDA y cree que hay un arbitraje. Por lo tanto, es un problema del esclavo que espera enviar todos sus datos, pero la MCU no lo sabe, así que en realidad es culpa del mcu.

Este libro blanco lo describe completamente. Enlace

    
respondido por el Micah

Lea otras preguntas en las etiquetas