¿Cuáles son las diversas formas en que un bus I2C puede colgarse?

Soy muy nuevo en electrónica y he entrado en el territorio del bus I2C. Quiere comprender el comportamiento de los dispositivos compatibles según la especificación del protocolo I2C.

Una condición según el enlace a continuación es cuando un controlador maestro se reinicia en medio de una transacción. Es decir, el esclavo comprometido no sabe qué hacer ahora.

https://www.i2c-bus.org/i2c-primer/analysing-obscure-problems/blocked-bus/

  1. No entiendo como se cuelgan estas llamadas de bus? El maestro que se reinició siempre podría iniciar una nueva transacción y los esclavos deberían poder leerla.

  2. ¿Hay alguna otra forma además de lo explicado anteriormente para provocar un bloqueo del autobús?

  3. ¿Puede tal problema ser causado por el controlador de software?

Cualquier cosa que derribe cualquiera de las líneas I2C (cuando no debería) bloqueará el bus. Tan simple como esto.
@EugeneSh., le recomiendo que convierta el comentario en respuesta, no hay mucho más.
También vale la pena señalar que I2C y SMBus son diferentes. IIRC, SMBus tiene un límite de tiempo en el estiramiento del reloj que no está en I2C. Entonces, un bus I2C puede bloquearse y cumplir, mientras que SMBus no puede.
@EugeneSh - Gracias. Creo que entiendo esa parte, sin embargo, no entiendo qué causaría que una línea se derribara permanentemente, y luego qué hace que se suelte.

Respuestas (1)

El maestro no puede emitir una condición de inicio o parada mientras cualquier esclavo esté manejando SCL o SDA. Si solo hay un esclavo en el bus, el peor de los casos sería cuando el maestro se reinicia justo después de que el esclavo haya recibido una solicitud de "lectura", estaba en proceso de reconocerlo y todo está configurado para enviar un "0" en respuesta. En ese escenario, el primer reloj avanzaría más allá del acuse de recibo, y los siguientes ocho avanzarían más allá de los bits de datos, y el dispositivo conduciría SDA continuamente hasta que reciba el noveno reloj. Sin embargo, después de que el reloj sube y luego baja por novena vez, el dispositivo hace flotar el bus (si no lo ha hecho antes) para buscar un acuse de recibo del maestro.

Si hay varios dispositivos esclavos, un bus podría bloquearse permanentemente si dos dispositivos piensan que han recibido comandos para leer una cadena de cero bytes, pero (posiblemente porque el maestro se reinició en un momento que resultó en un "runt " pulso en SCL que fue lo suficientemente largo para ser visto por un esclavo pero no por el otro) los dos esclavos liberan el bus en diferentes momentos cuando buscan confirmaciones del maestro.

Gracias por su esfuerzo, sin embargo, soy nuevo en electrónica e I2C. ¿Puede aclarar sobre "En ese escenario, el primer reloj avanzaría más allá del ACK, y los siguientes ocho ...". ¿Qué es "primer reloj" en el contexto y qué es "próximos ocho"? Además, si pudiera responder cómo esto podría ser causado por un controlador de software. (Reinicio inoportuno?)
A pesar de su mejor intento, la segunda parte del caso de esclavos múltiples también es algo oscura para mí. ¿Dos esclavos que liberan el bus en diferentes momentos causan bloqueo? ¿Cómo dos esclavos pueden comenzar a responder simultáneamente, ya que la dirección puede haber coincidido solo con uno?
@ultimatecause: La situación del problema potencial sería si el maestro de alguna manera emite un pulso de reloj que no cumple con la especificación mínima de ancho de pulso, con el efecto de que un esclavo lo ve y el otro no. Dependiendo de cuán sensibles sean los esclavos a diferentes anchos de pulso, es muy poco probable que ocurra tal problema. Por otro lado, si ocurre, la recuperación puede ser imposible.