Después de algunas lecturas / pruebas, logré establecer una comunicación estable entre 2 dispositivos utilizando I2C con un cable de par trenzado de cobre FTP CAT5.
- Cable verde - SCL
- Cable blanco / verde - GND
- Cable azul - SDA
- Cable blanco / azul - GND
GND está conectado solo en un extremo del cable, el reloj del bus I2C está a 10Khz y he usado resistencias pullup de 10Kom para VCC
Funciona bien y estable. Cuando decidí usar otros 2 pares de cable para la alimentación (+ 12V), dejó de funcionar. Probé + 12V en un par GND en el otro par, también + 12V / GND en el mismo par: mismo resultado, dejó de funcionar. Todo el bus I2C dejó de funcionar, otros dispositivos conectados también.
Me pregunto si puedo usar el mismo cable o ir a la opción más segura: otro cable de alimentación.
Respuestas:
Tal vez sea excesivo si funcionaba antes, pero una opción es usar un convertidor de I2C a diferencial como PCA9615 , LTC4331 , etc. Si hacer que las resistencias sean más pequeñas no funciona o necesita extender el cable, considere no usar I2C directamente.
No solo se ampliará el alcance, sino que también tendrá una mejor inmunidad al ruido.
fuente
Como señalé en un comentario, es difícil de depurar sin un rastro de osciloscopio, pero lo primero que se destaca de su pregunta es la resistencia pull-up de 10 kOhm. Esto es inusualmente alto para I2C, aunque podría funcionar fácilmente en muchos casos.
Intentaría bajarlos a 1 kOhm primero, para ver si afectará algo. Si ayuda, puede aumentarlos gradualmente, aunque hacerlo afectará su tiempo de aumento.
fuente
Es absolutamente necesario dejar caer sus resistencias pullup a largas distancias, y 10m es un largo camino y 10k Ohm es muy alto.
El valor de la resistencia pullup está relacionado con tres cosas:
Intente usar cualquiera de las calculadoras disponibles y comience su lectura aquí con la nota de aplicación de TI sobre valores pullup o aquí con el estándar NXP I2C (7.1).
En términos del problema que tiene, debería ser obvio que la conexión a tierra de pares adicionales (12V, Gnd) en el cable cambiará la capacitancia a los cables de señal I2C.
fuente
Algunas notas
Obtener los valores correctos de extracción es vital, particularmente para SDA. Diferentes dispositivos pueden hundir diferentes cantidades de corriente. He visto configuraciones que generan 1s adicionales en los datos debido a una resistencia pull-up demasiado pequeña, después de cambiar a un chip sensor más pequeño. Las geometrías más pequeñas significaban que no podía tirar del bus a un cero limpio.
La velocidad mata. Un cable largo es efectivamente un filtro LRC de paso bajo. Para muchas aplicaciones I2C, puede reducir la velocidad del reloj sin perder nada. Un reloj más lento puede compensar un pull-up débil y una gran capacidad (pero no un pull-up demasiado fuerte).
Los cables largos son una invitación a EMI. He visto una implementación de I2C que necesitaba una pinza de ferrita para pasar las pruebas de inmunidad. La terminación final, el cable blindado o los filtros pueden ayudar.
Cuidado con la resistencia paralela. Si tiene un pull-up de 1k en el maestro, y luego un 1k en cada uno de los cuatro dispositivos del cliente en el bus, entonces tiene un pull up neto de 200 Ohm. No voy a trabajar
fuente
La placa de conexión Sparkfun I2C es una buena solución que presenta:
fuente
Primero: quiero agradecer a la comunidad por publicar una respuesta.
Segundo: he encontrado una solución basada en esas respuestas, esto es lo que he hecho:
Probado bajando resistencias pullup a 4.7K y 2K. En 2K empiezo a recibir respuestas de vez en cuando, así que bajo a 1K, luego comienzo a recibir respuestas, pero faltaba parte de los datos de cada una de ellas. Después de esa resistencia pullup conmutada en el pin SDA con 10K y todo comienza a funcionar de manera estable.
Entonces, la solución en mi caso es 1K pullup en SCL y 10K en SDA.
Gracias por tu tiempo.
fuente