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.