¿Puedo usar I2C sobre cables de 2 m?


24

En mi proyecto actual, necesito comunicarme entre un microcontrolador y algunos sensores a través de I2C. Uno de ellos es un sensor de temperatura, debe colocarse a aproximadamente 2 metros del microcontrolador. No puedo elegir otro protocolo (el sensor está en un módulo con conector / pines / protocolo dado).

¿Crees que es posible comunicarse en esta configuración? ¿Qué información debo buscar para asegurarme de que puede o no ser posible? ¿Tienes algún consejo?

Es la primera vez que me comunico con IC fuera de la PCB.


55
Por favor agregue más información. ¿Cuál sería la velocidad de i2c? Resistencias pull-up? ¿Cable usado y su capacitancia? ¿Cuál es el host MCU y cuál es el sensor? Pero en general, I2C funciona varios metros sobre cables como HDMI, por lo que debería funcionar cuando las cosas se hacen correctamente.
Justme


66
"No puedo elegir otro protocolo" Puede colocar un segundo microcontrolador cerca del sensor, leer los datos y enviarlos con el protocolo que desee.
FooBar

1
¿Tiene una velocidad mínima en kbit / s?
Mástil

2
Si reduce la velocidad del reloj, puede recorrer una distancia bastante larga.
cobre. El

Respuestas:


36

I2C no está diseñado para usarse a largas distancias, pero conozco varias aplicaciones en las que realmente se usa a una distancia de aproximadamente 2 metros. También sé de un caso en el que tuvieron problemas con eso y que eventualmente se solucionó arreglando bucles de tierra, creo.

Para asegurarse de que funcionará, debe usar un extensor de bus I2C como el P82B715.

Sin embargo, la hoja de datos del PB2B715 dice lo siguiente en la sección 8.2:

Para los cables planos o de par trenzado típicos, como los utilizados para telefonía o cableado Ethernet (Cat5e), esa capacitancia es de alrededor de 50 pF a 70 pF / metro, por lo que el cable podría, en teoría, tener hasta 50 m de largo . Según la experiencia práctica, 30 m han demostrado una longitud de cable segura para ser conducida de esta manera simple, hasta 100 kHz, con los valores mostrados. Son posibles distancias más largas y velocidades más altas, pero requieren un diseño más cuidadoso.

Entonces, los expertos (NXP es el ex Philips, el inventor de I2C) dicen que se ha comprobado que una distancia de 30 metros es factible. Mi experiencia dice que 2 metros es una distancia factible, y las experiencias que me informaron indican que también son posibles autobuses I2C más cargados sin ningún extensor.

Los puntos clave para trabajar en autobuses I2C en largas distancias son:

  • Usando un cable de baja capacitancia (par trenzado / Ethernet);
  • Limitar la velocidad del autobús;
  • Tener dominadas que tengan el tamaño correcto.

Cálculo pullup

Texas Instruments tiene una buena nota de aplicación (SLVA689) sobre el cálculo de pull-up .

  • El límite inferior del pullup (valor mínimo) está determinado por la corriente que puede extraer el periférico más débil del bus y el voltaje máximo que representa 0 para cualquier periférico. Entonces, si 1V sigue siendo 0, su VCC es máximo 3V6 y su dispositivo más débil solo puede extraer 20mA, su resistencia está determinada por la pérdida de voltaje sobre la resistencia y la corriente extraída por ese dispositivo: .(3.6 V-1 V) / / 20 metroUNA=130 Ω
  • El límite superior está determinado por el tiempo de subida máximo: su frecuencia I2C máxima está directamente relacionada con eso, pero también hay un límite superior definido por el protocolo. El límite superior es . Donde es el tiempo de subida máximo y es la capacitancia del bus. Entonces, si es 400pF, y el bus está operando en modo estándar ( = 1ms), entonces encontrará . La nota de aplicación de TI tiene gráficos para que pueda encontrar los valores apropiados rápidamente.Rmax=tr/(0.8473Cb)trCbCbtrRmax=2950 Ω
  • Por supuesto, el valor del pullup es el valor equivalente de todos los pullups en paralelo combinados. Puede tener un pullup en el extremo maestro, el extremo esclavo y cualquier otro esclavo / maestro en el bus.
  • Cuanto más esté "en el límite", más deberá tener en cuenta los "parásitos", como la caída de voltaje en el cable.

¿Tiene pull-ups de tamaño correcto? ¿Cómo determinar el valor y la potencia nominal?
Quantum0xE7

Como Nick B comentó sobre otra respuesta, tenga cuidado con la posibilidad de que el chip extensor del bus o cualquier otra cosa caliente el sensor de temperatura en un par de grados.
Peter Cordes

14

Generalmente está limitado por una capacitancia de bus máxima de 400 pF.

Debería funcionar bien si baja la frecuencia a algo así como 1 kHz y proporciona un desacoplamiento de la fuente de alimentación junto al sensor.

Si necesita algo más robusto, puede usar convertidores diferenciales I2C en ambos extremos, como PCA9615 .


Recuerdo vagamente algunos sensores que tienen una frecuencia I2C mínima (no estoy seguro de por qué).
Michael

14

Puedes, pero no es recomendable.

Diferentes autobuses para diferentes propósitos.

I2C, como SPI, está diseñado para la comunicación dentro de una placa o grupo de placas (piense en Raspberry Pi y sus sombreros o arduino y sus escudos). Puede funcionar a distancias más largas (ver otras respuestas) pero no debe usarse en esos casos, simplemente porque no es para eso para lo que fue diseñado, optimizado y calificado.

El riesgo que corre es que es posible que no pueda agregar más sensores en el futuro, o que su sistema no funcione en todas partes o falle en ciertas circunstancias.

Lo que debería estar buscando es un bus de campo, algo así como 1 cable, CAN, RS-485, ethernet, etc.

Los sistemas inalámbricos como bluetooth o zigbee también podrían ser una opción.


9

Como señaló @filo, I2C generalmente está limitado por la capacitancia del bus. Sin embargo, hay formas de evitar esto:

  1. Use 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 diferencial I2C como el PCA9600 . Sin embargo, esto hará que su circuito sea mucho más complicado y necesitará un CI en ambos extremos del cable.

Eche un vistazo a AN10658 y AN11084 de NXP para obtener más información.


1
Esto funcionará bien con un extensor de bus, como han dicho varios otros. Algo que no es obvio de inmediato es que el extensor del bus en el extremo del sensor puede disipar suficiente calor para elevar la lectura de los sensores de temperatura en un par de grados si el sensor y el extensor del bus están muy juntos.
Nick B

4

Me gustan las respuestas de filo y Caleb.

Otra opción es usar uno o varios puentes maestros DS28E17 1-Wire-to-I2C Master en los sensores individuales y conectar el bus como Onewire. Esto es bueno para autobuses de más de 100 my es muy adecuado para aplicaciones de matriz de sensores de bajo rendimiento como la temperatura distribuida y la gestión de la batería.


Pensamiento interesante, aunque puede introducir una sobrecarga de software adicional si el maestro no tiene una interfaz 1-Wire.
Caleb Reister

Principalmente es una opción si tiene un host Linux, ya que tiene la pila de controladores completa para este truco. En una Raspberry Pi, solo tiene que conectar GPIO4 a la entrada de 1W del DS28E17 a través de esos 100m de cable (más GND, por supuesto), edite config.txt y listo. Es totalmente transparente, parece un I²C local. Solo más lento.
Janka

Gracias. Me sorprendió mucho que 1-Wire pueda hacer ese tipo de distancia. Supongo que tiene sentido, ya que las resistencias son más pequeñas.
Domen

Onewire no se basa en el tiempo del borde ascendente, sino que todo el tiempo de bits se realiza en relación con el borde descendente, que se activa activamente. Es por eso que es menos susceptible a una alta carga capacitiva. Algunos nF están bien.
Janka
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.