¿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.
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.
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.
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.
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.
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.
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
- Utilice un extensor de bus. El P82B96 o PCA9600 serían buenas opciones en su caso.
- 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.
Gustavo Litovsky
Nate
Nick Alexeev
Spehro Pefhany
mcmiln
antonio phan