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

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

Hasta ayer el bus I2C funcionaba, ahora no. No cambié la ubicación física de ningún cable o código de boceto: solo encendí la PC para dar energía a las placas , y la comunicación a través del bus I2C simplemente dejó de funcionar. Luego, después de un poco y un poco de "reinicio" / "recarga del boceto" (nota: no cambié ningún código del boceto), comenzó a funcionar nuevamente.

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

¿Cual podría ser el problema?

Podría ser cualquier cosa, desde cableado físico hasta problemas de software y problemas de EM. Esto puede ser bastante difícil de precisar. Comenzaría usando un osciloscopio para mirar el bus I2C y ver cómo se ven las señales
¿Cómo funcionaba antes sin energía de la PC?

Respuestas (3)

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

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

¿Dónde puedo obtener más información sobre los posibles ruidos electromagnéticos comunes de las placas Arduino? Por ejemplo, si coloco físicamente mis placas Arduino en un paquete a prueba de agua y bajo la lluvia torrencial, ¿esas placas Arduino tendrán algunos ruidos EM?
No estoy seguro de qué tiene que ver la lluvia: la fuente habitual son otros equipos eléctricos . Los interruptores, los tubos fluorescentes, las herramientas eléctricas y los teléfonos móviles son sospechosos habituales.
Mencioné "lluvia" porque creo que incluso el clima circundante (en este caso, como ejemplo, en condiciones ambientales particulares como "lluvia torrencial") puede crear ruidos EM. Es por eso que pregunté: "¿Dónde puedo saber más sobre los posibles ruidos EM comunes para las placas Arduino?".
En otras palabras: ¿Qué tan fuertes son las placas Arduino (en este caso, en relación con la tolerancia de ruidos EM)?
Acabo de publicar una nueva pregunta: ¿Qué tan fuertes son las placas Arduino?
Aparentemente, la lluvia puede ser un problema para los aviones: emcuk.co.uk/awareness/Pages/InterferenceExamples/… aunque no creo que sea un problema para la electrónica que está conectada a tierra.
Realmente, la única forma de probar que algo es resistente a EM es (1) probarlo o (2) encontrar evidencia de que alguien más lo ha probado; esto debería estar relacionado con la certificación CE de la placa, pero esa información no parece estar disponible en Internet.

Siempre que crea que I2C no funciona, convierta las líneas I2C SCL y data-SDA como GPIO y lleve el bus a un estado conocido enviando una secuencia a través del bus como se indica. El procedimiento es el siguiente:

  1. El maestro intenta afirmar un 1 lógico en la línea SDA
  2. El maestro todavía 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 una PARADA

I2C usando resistencias pull-up puede ser quisquilloso. 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.

Eh, ¿una terminación activa para I2C? No estoy seguro de recomendar eso desde el principio cuando ni siquiera sabemos cómo se ven las señales. Me parece gracioso que LT ponga 15.8k como pullup en su diagrama. ¿Por qué un pullup tan débil? Por supuesto, la parte LT se ve mejor...