Comportamiento extraño de I2C: a veces funciona, algunas veces no

2

Estoy usando Arduino Ethernet con PoE y Arduino Uno . En los últimos días implementé un bus I2C en funcionamiento utilizando la biblioteca Wire y todo parecía funcionar: los dos Los tableros se comunicaban correctamente, excepto en algunos casos.

Hasta ayer el bus I2C estaba funcionando, ahora no funciona. No cambié la ubicación física de ningún cable o código de boceto: Acabo de iniciar la PC para dar energía a las placas , y la comunicación a través del bus I2C simplemente deja de funcionar. Luego, después de un poco y algunos "reiniciar" / "volver a cargar el boceto" (nota: no cambié ningún código de boceto), comenzó a funcionar nuevamente.

No es la primera vez que ocurre esta situación, y estoy en problemas para detectar el problema exacto.

¿Cuál podría ser el problema?

    
pregunta user502052

3 respuestas

4

Parece que está justo en el margen de trabajo; todo tipo de pequeños efectos, como el ruido EM de la computadora, la capacitancia del cuerpo humano y la temperatura, lo hacen pasar de "trabajar" a "no trabajar".

La solución general es ralentizar el I2C o protegerlo más a fondo.

    
respondido por el pjc50
1

Cuando crea que I2C no está funcionando, convierta las líneas SCL y data-SDA de I2C como GPIO y ponga el bus en un estado conocido mediante el envío de una secuencia a través del bus como se indica. El procedimiento es el siguiente:

  1. El maestro intenta afirmar una lógica 1 en la línea SDA
  2. El maestro aún ve un 0 lógico y luego genera un pulso de reloj en SCL (transición 1-0-1)
  3. El maestro examina SDA. Si SDA = 0, vaya al Paso 2; si SDA = 1, vaya al Paso 4
  4. generar un STOP
respondido por el user23016
0

I2C usando resistencias pull-up puede ser delicado. Intente reducir los valores de pull-up para limpiar la señal. O mejor aún (realmente mucho mejor) agregue un terminador activo como el LTC4311 al bus.

    
respondido por el Anono Mouser

Lea otras preguntas en las etiquetas