Señal I2C y potencia en largo alcance (cable de 10 metros)

9

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.

user3503519
fuente
3
¿Comprobó que la potencia en el lado receptor es lo suficientemente buena? Sin fallas ni caídas ... Los cables CAT5 son bastante delgados, es por eso que PoE usa> 40 V para la alimentación.
Vladimir Cravero
44
Aquí es donde necesitas un osciloscopio. Todo lo demás serán conjeturas (educadas).
tubería
1
No torcería SDA o SCL con GND porque no quieres ninguna capacitancia entre ellos. Me gustaría torcer + 12V con GND ya que quieres capacitancia entre ellos. ¿Qué corriente (de retorno) tiene el + 12V? (es posible que tenga rebote en el suelo)
Huisman
55
¿GND está conectado solo en un extremo del cable? A menos que esté malentendido, eso no suena bien.
mkeith
1
¿Quiso decir cable UTP ? Estoy seguro de que puede usarse para más protocolos que solo FTP;)
Andrew Morton

Respuestas:

15

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.

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Wesley Lee
fuente
1
Gran respuesta, esto es exactamente lo que debe hacerse, pero, por supuesto, puede ser un cambio radical para el OP.
Jack Creasey
Quiero decir, son súper fáciles de implementar (en comparación con el cambio a RS-485, CAN, etc.), pero sí, en comparación con el cambio de algunas resistencias, es un cambio radical.
Wesley Lee
1
El problema de @JackCreasey OP no es solo la capacitancia del cable, sino que también parece sufrir ruido en la línea de 12V que han agregado. La reducción de las resistencias pull-up proporciona inmunidad adicional al ruido, pero no pueden seguir bajando esa resistencia indefinidamente.
Dmitry Grigoryev
@DmitryGrigoryev Dado que el OP no dio detalles, no estoy seguro de cómo podría sugerir que se inyectara ruido. Estoy de acuerdo en que no puedes seguir bajando la terminación / pullup ... pero el OP es demasiado grande en 10: 1.
Jack Creasey
9

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.

tubo
fuente
10 kΩSin embargo, ¿no es tan grande para un bus I2C en 10 kHz? (¿O debería ser OP de 100 kHz?)
Huisman
@Huisman Dos buenos puntos. 10 kOhm no me preocuparía a 10 kHz en una PCB normal, pero tal vez no sea suficiente con el cable. Y 10 kHz es inusual pero no loco, supongo.
tubería
77
10k Ohm es enorme para I2C a cualquier distancia. Ese es el principal problema que tiene el OP.
Jack Creasey
1
Supongo que es mejor dividir las resistencias y usar una en cada extremo. 2 resistencias pullup @ 4.7kΩ, una en cada extremo, debería ser una mejor opción que una sola resistencia pullup de 2.2kΩ.
12431234123412341234123
Intentaré bajar las resistencias, eso es todo lo que tiene sentido para mí después de todos esos comentarios.
user3503519
5

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:

  1. Capacitancia del cable
  2. Voltaje de puntería y sentido de nivel Rx.
  3. Velocidad

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.

Jack Creasey
fuente
2
Estoy de acuerdo, se puede suponer que el cable CAT5 tiene aproximadamente 50pF por metro, por lo que 10 metros exceden el límite de capacitancia de 400pF de la especificación I2C. Y no se puede alcanzar un reloj I2C de 400 kHz con una capacitancia de 400 pF utilizando la corriente de extracción de 3 mA especificada de las resistencias. Afortunadamente, la disminución de la velocidad ayudará, a menos que los dispositivos tengan una limitación mínima de velocidad de reloj. No sabemos qué dispositivos son estos y cuáles son los voltajes del bus I2C, pero de hecho, los pullups deben ajustarse para proporcionar al menos 3 mA y, si los dispositivos lo permiten y están de acuerdo con el voltaje de bajo nivel del bus, incluso más.
Justme
Sí, voy a probar con eso, pero mi pregunta es ¿por qué funciona si no hay energía sobre ese cable?
user3503519
Un par de cables flotantes no tiene la misma capacidad para su par de señales que tiene cuando el cable está conectado a tierra. Para su configuración, tanto el +12 como el Gnd son esencialmente los mismos ... tienen capacitancia para el cable de señal que afecta su vida útil. .
Jack Creasey
2

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

Jason Treon
fuente
0

La placa de conexión Sparkfun I2C es una buena solución que presenta:

PCA9615 buffer
I2C Supply voltage range 2.3-5.5V
Differential Supply voltage range 3-5.5V
draws 16µA of current
Extends I2C bus up to 100 feet
Data rate up to 400kHz
2x Qwiic Connectors

ingrese la descripción de la imagen aquí

gatorback
fuente
-1

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.

user3503519
fuente
1
Eso es una locura sin embargo. ¿Qué tipo de hardware usas aquí? Tal vez algo está mal configurado.
tubería
1
Por un lado es ESP32 con micropython, por otro lado está atmega8 programado con arduino IDE. Finalmente no considero eso como una comunicación segura, así que voy a cambiar a serial (RS232), ya que probé que funciona bien en esos rangos
user3503519
1
Si yo fuera usted, también echaría un vistazo al RS-485, que sería aún más robusto e incluso más simple. El inconveniente es que requiere más cables de señal, pero ya tiene muchos de ellos en su CAT5.
tubería
1
Bueno, no veo cómo va a implementar directamente RS-485 en el procesador atmega o ESP 32 sin convertidores y hardware adicionales, por lo que RS-232 es la mejor opción aquí. Solo se usará una palanca de cambio de nivel TTL.
user3503519