¿Longitud máxima del bus I2C?

¿Cuál es la longitud máxima de cable que se puede usar para conectar dos dispositivos I2C (maestro I2C -> esclavo I2C)?

Sí, sé que I2C está realmente diseñado para la comunicación dentro de la placa. Se me encargó un "objetivo de diseño" de usar un bus I2C común para múltiples esclavos I2C para admitir una demostración.

Para mayor claridad, supongamos que la tasa de bus I2C estándar es de 100 kHz.

La longitud máxima viene a jugar con la capacitancia introducida por la longitud. Demasiada capacitancia y podría afectar su velocidad. Así que como siempre, esto depende.
@GustavoLitovsky Tienes razón sobre la capacitancia. También depende del tipo de cables que se utilicen (blindados o no blindados). Estoy más interesado en una guía general.
@Guía de Nate: capacitancia de bus neta máxima de 400pF. (Algo relacionado con la pregunta: Memorias de un bus I2C demasiado grande ).
I2C = Bus de Circuito Inter-Integrado. No está diseñado para largas distancias entre cajas, y ciertamente no a 400kHz.
Solo quería aportar algo de experiencia personal además de los cálculos. Hice una demostración que va de una placa de desarrollo a un convertidor I2C a USB con un cable sin blindaje de aproximadamente 3 pies. No se veía bonito, pero funcionó el 90% del tiempo.
A veces, en circuitos de potencia extremadamente baja donde los transceptores de larga distancia no son viables debido al consumo de corriente, he usado I2C en distancias superiores a 30 m. Esto se logró utilizando cables Cat5E con una velocidad de placa de 1 KHz.

Respuestas (6)

Para el modo rápido y la elevación de la resistencia, la capacitancia debe ser inferior a 200 pF, de acuerdo con este documento de NXP, especificación de bus I2C y manual del usuario .

Con pullups de fuente actual puede ir a 400pF, pero no con resistencias.

Si su cable es de 20pF/30cm y tiene otros 50pF de capacitancia parásita y de entrada, está limitado a 2,25 m de longitud de cable. Diferentes suposiciones conducirán a diferentes números.

@KrunalDesai Se menciona específicamente en el documento NXP vinculado anteriormente. Especificación de bus I2C y manual de usuario
Para un ejemplo del mundo real, el "Wiimote" de Nintendo Wii usa 400kHz I2C ( wiibrew.org/wiki/Wiimote/Extension_Controllers ) para comunicarse con periféricos como el Nunchuk ( wiibrew.org/wiki/Wiimote/Extension_Controllers/Nunchuck ) que, como se puede ver, tiene un cable que mide como 1m. Los extensores pasivos se venden para dar 1 m adicional ( amazon.com/Extension-Cable-Wii-Nunchuck-Nintendo/dp/B0039OEV9K ), por lo que están empujando, pero manteniéndose dentro de ese límite de 2,25 m.

Las longitudes de sonido insanas como 10, 25 y 100 m son perfectamente posibles, y uso el método a menudo (con UART no I2C, pero el método se mantiene) cuando necesito armar cosas rápidamente. Sin embargo, no es exactamente la mejor manera.

La clave es conocer su umbral de voltaje de entrada. Asegúrese de que la caída de voltaje en el cable de tierra esté muy por debajo de esto, de lo contrario, un transmisor con un potencial de tierra alto no podrá reducir el voltaje lo suficiente. En mi humilde opinión, la falta de tolerancia para las compensaciones de tierra es la principal razón para usar RS485 o transceptores de lata (I2C sobre CAN se menciona en algunas notas de aplicación).

Idealmente, todos los dispositivos tendrán su propia verruga de pared y batería y no se enviará energía a través del cable de tierra entre los dispositivos.

Pero, tomemos CAT5 por ejemplo. CAT5 no puede ser superior a 52 pf/m, o no es CAT5.

100 m de cable de 52 pf tiene una capacitancia de 5200 pf o 5,2 nf.

5.2n por 20kohms (pullup) da una constante de tiempo de alrededor de 104 microsegundos. Eso limita la velocidad a unos 10 kHz más o menos.

Usando pullups de 2.2kohm, probablemente podría llegar a 100kHz.

Escuché que los dispositivos deben tener una resistencia en SDL y SCK, debido a la gran carga capacitiva que manejan, de algo así como 180 o 200 ohmios.

Pero, sinceramente, I2C no es para nada el camino a seguir para largas distancias. Los transceptores CAN o RS485 utilizados con UART normal son una solución robusta con muy buena protección contra fallas, resistencia ESD, velocidad, distancia, etc., a un costo de un dólar por chip más o menos, las compensaciones de tierra no importan tanto, así que usted es libre de transportar energía junto con los datos.

El único inconveniente es que un transceptor de lata puede alcanzar 70ma en transmisión y 1 o 2ma solo en escucha, por lo que I2C o UART TTL directo pueden ser útiles en situaciones de potencia extremadamente baja, pero considere cuánto tiempo realmente dedica a enviar.

Un poco fuera de tema, pero veo que Raspberry Pi tiene 2 pines I2C y el resto son SPI que se ven aquí . ¿Sabes si habría alguna diferencia en estos pines?

Trabajo para una empresa que fabrica sensores USB. La mayoría de ellos se basan en chips de sensores I2C, esos dispositivos se pueden dividir en dos, por lo que puede instalar la parte de la CPU en un lugar y la parte del sensor en otro. Realizamos muchas pruebas en la conexión I2C entre la CPU del dispositivo y los sensores I2C. A 100 kHz, con un buen protocolo de recuperación de errores, se pueden alcanzar fácilmente 25 m utilizando cables básicos. Incluso pudimos alcanzar los 100 m una vez con cable CAT5.

Parece que estás hablando de la longitud del cable USB . El OP está preguntando sobre el cableado de I2C sin procesar . Este es un tema completamente diferente. Si estoy incorrecto, edite su respuesta y eliminaré mi voto negativo.
25m es bastante incluso para un usb...
No, realmente estoy hablando de la conexión I2C entre la CPU del dispositivo y los chips del sensor I2C, no de la conexión USB entre el host y la CPU. Aquí hay un ejemplo: yoctopuce.com/EN/products/yocto-meteo/doc/…
Si quisiera usar un par trenzado para I2C y alimentación, ¿qué par entrelazaría? (SDA, SCL), (VCC, GND) o (SDA, GND), (SCL, VCC) ?
Idealmente, no usa par trenzado en absoluto. El par trenzado es útil para señales balanceadas. Si no tiene ningún otro cable, tuerza la señal con tierra. Si realmente solo tiene cuatro cables, piense en cuánta energía consume el extremo remoto (puede terminar con una compensación de tierra más alta de lo tolerable) antes de comprometerse a usar solo un cable para GND. Usualmente uso cable Cat5 viejo (¡no más alto! El blindaje doble agrega capacidad que no necesita) con un par de tierra, un par de +5V y pares SDA+GND y SCL+GND.
¿Cómo ejecutaría el protocolo de recuperación para el lado del sensor? Los circuitos integrados de sensores listos para usar con la interfaz I2C generalmente no tienen ninguna disposición para la detección o recuperación de errores. Nunca he visto sensores con ese tipo de características.

Se podría usar algo como el P82B96 de NXP para cambiar los niveles de voltaje en el bus, lo que permite distancias mucho más largas.

La hoja de datos contiene ejemplos de longitudes de cable I2C de 3 m, 25 m, 100 m y 250 m.

Hay otros chips que tienen una funcionalidad similar.

El problema con el chip NXP es que terminas requiriendo el doble de cables. ¿Alguna otra idea? los circuitos integrados bidireccionales que he encontrado no superan los +5V.

IIC es un protocolo síncrono y, como tal, se puede ejecutar de manera arbitrariamente lenta para cumplir con los requisitos del sistema con respecto a la distancia y el ruido.

Hay muchos ejemplos del uso de IIC a través de un cable, desde ACCESS.bus en la década de 1990 hasta cómo se usa hoy en día para recuperar información EDID de pantallas de video.

Otro ejemplo es el Wii Nunchuck, que se conecta al Wii Remote a través de I²C usando un cable blindado de 4 pies.
Si bien, en teoría, los protocolos sincrónicos podrían cronometrarse arbitrariamente lentos, en realidad esto no es cierto para I2C en general, por lo que este consejo es malo. La razón es que muchos chips I2C tienen una frecuencia SCL mínima admitida debido a los detalles de implementación específicos del proveedor. Esto lleva a no poder sincronizar dichos circuitos integrados con frecuencias inferiores a 70-100 Khz (límite real que se encuentra en los manuales correspondientes, por supuesto). No todos los chips I2C tienen este límite inferior a la frecuencia SCL, pero muchos sí lo tienen.

Tal vez sea excesivo si funcionaba antes, pero una opción es usar un convertidor I2C a diferencial como PCA9615, LTC4331, etc. Si hacer que las resistencias sean más pequeñas no funciona o si 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.

https://electronics.stackexchange.com/a/428983/147302

El Adafruit LTC431 1 puede ser una opción.

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

https://www.sparkfun.com/products/16988

  1. Utilice un extensor de bus. El P82B96 o PCA9600 serían buenas opciones en su caso.
  2. Si necesita velocidades más altas o cables extremadamente largos, puede usar un transceptor I2C diferencial como el PCA9600. Sin embargo, esto hará que su circuito sea considerablemente más complicado y necesitará un IC en ambos extremos del cable. Eche un vistazo a AN10658 y AN11084 de NXP para obtener más información.

https://electronics.stackexchange.com/a/461016/147302

Utilice un extensor de bus I2C como el P82B715.

https://electronics.stackexchange.com/a/461030/147302

Elija un sensor que pueda funcionar a una velocidad más lenta.

Además, https://hackaday.com/2017/02/08/take-the-leap-off-board-an-introduction-to-i2c-over-long-wires/ es una buena lectura.