Conexion de varios dispositivos I2C que trabajan con diferente Vdd

Hola camaradas,


Resulta que me surgieron unas dudas en cuanto a la conexion de varios dispositivos I2C.

Lo que pasa es que no todos operan al mismo Voltaje Vdd, unos son de 5V y otros trabajan a 3.3V. Entonces, las resistencias pull up en este caso como se deberian de calcular? o hay que hacer alguna modificación extra?

Yo pensaba utilizar resistencias de 10k para las lineas SDA y SCL, por lo que he visto, es muy comun utilizar este valor, aunque un sensor recomienda usar de 5k (este trabaja a 3.3V) y otros por ejemplo no dicen que valor usar.

Ah, y una cosa mas, solo es necesario poner 2 resistencias pull up (SDA y SCL), aunque utilice por ejemplo 10 dispositivos I2C verdad?

Gracias, espero me puedan orientar con estas dudas por favor. ...
 
Hola, intenta haciendo la prueba de conectar los resistores de pull-up a +3.3V. Los dispositivos que funcionan a +5V seguramente tienen un umbral que interprete esos 3.3V como 1 lógico sin problemas.

Y sobre tu segunda duda, si, sólo basta un resistor de pull-up por línea del bus.

El valor de 4k7 es el que se recomienda para altas velocidades y para cuando el bus tiene varios dispositivos (como es tu caso).

Saludos
 
Resulta que me surgieron unas dudas en cuanto a la conexión de varios dispositivos I2C.

Lo que pasa es que no todos operan al mismo Voltaje Vdd, unos son de 5V y otros trabajan a 3.3V. ¿Entonces, las resistencias pull up en este caso cómo se deberían de calcular? ¿O hay que hacer alguna modificación extra?
Si los dispositivos trabajan con diferentes voltajes, necesitas un adaptador de niveles I2C bidireccional.
Son sencillos de hacer, con transistores bipolares o mosfets. También venden módulos con varios canales.
Puedes buscar información sobre los diferentes tipos de adaptadores en la red.
Yo pensaba utilizar resistencias de 10k para las lineas SDA y SCL, por lo que he visto, es muy común utilizar este valor, aunque un sensor recomienda usar de 5k (este trabaja a 3.3V) y otros por ejemplo no dicen que valor usar.
Por lo que mencioné anteriormente, te resultará más conveniente el uso del adaptador, ese ya tiene las resistencias pull-up.
Pero la fórmula para determinar las resistencias pull-up del bus I2C, es la siguiente:
RPU = Tr/Cb
Donde Tr es el tiempo de subida de ambas líneas. (SCL y SDA)
Y Cb es la carga capacitiva de cada línea del bus.
Esas especificaciones son las que debes buscar en la hoja de datos.

Como un ejemplo:
Tenemos que Tr es igual a 750 ns y que Cb es igual a 300 pF.
Entonces:
Tr = 0.00000075 Segundos.
Cb = 0.0000000003 Faradios.

0.00000075 / 0.0000000003 = 2500 Ω

Ah, y una cosa más. ¿Sólo es necesario poner 2 resistencias pull up (SDA y SCL), aunque utilice por ejemplo 10 dispositivos I2C, verdad?
Sí, si hablamos de un bus que trabaja al mismo voltaje, pero con el adaptador ya lo tienes resuelto.
 
Última edición:
Adhiero a @D@rkBytes, pensalo como que vas a tener 2 buses por separado (eléctricamente, va a ser 1 solo desde el punto de vista lógico). El problema es en el sentido 5V -> a 3.3V, donde no queremos meterle 5V a un integrado que trabaja con 3V3 porque lo podemos dañar. En el otro sentido 3V3->5V el integrado de 5V suele tener margen suficiente para interpretar nivel de 3V3 como un '1'.

En cuanto a los resistores, si vas a usar el bus a 400KHz precisas resistores de valor más bajo que para 100 KHz.
No hay un valor exacto, la idea es que cuando uno envía una señal cuadrada por la línea de clock o de datos, no se distorsione por tiempos de carga/descarga de las capacidades parásitas del circuito más allá del límite necesario que viole la temporización de operación del bus (el timing del bus: al poner un flanco en la línea de reloj se precisa que la línea de datos esté estable x tiempo antes, etc).

El Tr a que referencia D@rkBytes es el tiempo de subida que uno quiere en el bus para asegurar el timing. El Cb incluye la capacidad parásita de los pines del micro, más capacidad de la traza de la placa, más capacidad del pin de dispositivo I2C que se conecta al micro. Normalmente se desconoce (la capacidad de la traza sobre todo), se puede estimar un mínimo.

Esa capacidad aumentan con la longitud del bus I2C, si tenes un bus de 30cm probablemente precises utilizar resistores más chicos (para que el bus use mayor corriente y cargue capacidades más rápido) que si el bus tiene 4 cm. Hay otros efectos pero a baja frecuencia (<10 MHz) no pesan mucho.

En la práctica, podes probar con resistores de 1 a 10Kohm y elegir el que más te guste.
¿Cuando quisiera poner resistores de alto valor?, si por ejemplo el micro lo alimento con una pila botón y quiero ahorrar la mayor cantidad de energía posible (resistores de bajo valor = mayor consumo). En este caso hasta podría probar con resistores de 47K si es que el consumo del bus I2C pesa mucho en el consumo total. Pero si veo que la señal de reloj se redondea mucho (mido con osciloscopio en la pata del dispositivo I2C), entonces vuelvo para atrás y me quedo con 10K.
¿Cuando optaría por resistores de bajo valor? (1K, 2K), cuando tengo algún dispositivo que manda datos por el bus a alta velocidad (para el I2C alta velocidad es 1 Mbit/s, un acelerómetro o giróscopo por ejemplo) que está a 10cm del micro.
 
yo hice un proyecto con dispositivos I2C que funcionaban a 3.3V, 5V, y 9V y los hice trabajar a los tres con una resistencia de 10k. con una resistencia de 10k van a funcionar sin problemas.
 
Primero que nada gracias a todos por sus comentarios (y), pero creo que me inclino mas por el uso del adaptador que menciona D@rkbytes

Si los dispositivos trabajan con diferentes voltajes, necesitas un adaptador de niveles I2C bidireccional.

Busque por internet un adaptador y encontre este:
https://learn.sparkfun.com/tutorials/bi-directional-logic-level-converter-hookup-guide

Creo que si me sirve, solo una duda mas ya no tendria que poner una resistencia pull up para los dispositivos de 5V verdad?

Gracias.:)
 

Adjuntos

  • Adaptador niveles I2C.jpg
    Adaptador niveles I2C.jpg
    96.7 KB · Visitas: 20
  • Adaptador niveles I2C Diagrama.jpg
    Adaptador niveles I2C Diagrama.jpg
    96.2 KB · Visitas: 25
Sólo una duda mas. ¿Ya no tendría que poner una resistencia pull up para los dispositivos de 5V, verdad?
No, ya no necesitas poner otras pull-up extra, el adaptador ya las tiene.
Son las resistencias de 10 KΩ que van hacia los 3.3 V y hacia los 5 V.

Adjunto un documento PDF en donde se explica el funcionamiento de este tipo de adaptador.
La página del autor ya no existe, pero el documento fue portado a PDF gracias a @Meta

Ese tipo de adaptador yo lo uso también para módulos bluetooth y memorias microSD.

Los transistores que he usado son los BS170 y funciona perfectamente.

Suerte.
 

Adjuntos

  • Adaptador de niveles I2C bidireccional.pdf
    473.3 KB · Visitas: 68
También existe una forma de hacerlo con transistores comunes.

index.php

 
Última edición:
Lo de hacer conducir el transistor en inversa siempre me confunde, yo hice el adaptador empleado JFET N, a diferencia del MOSFET el gate del JFET se conecta a tierra, con ambos drain en H gate queda en negativo y reduce la corriente, ocupe un 2N5457 pero otros de pequeña señal y Voff de 2,7V o menor sirven.
 
Yo tengo en mi proyecto que comunicarme entre sensores de humedad y temperatura y eso en un entorno con gran "ruido electrónico"! I2C permite aplicar tensiones elevadas al I2C y usar para ello componentes de funcionalidad bi-direcionales. Así en el caso de mi aplicación, donde creo un "HUB-I2C". Hacia el lado del controlador del bus I2C aplico la tensión de 5VDC y a la sección que pasa por el entorno ruidoso 15VDC. Llegando a cada sensor de humedad y temperatura, Sensirion SH20, convierto la tensión de 15 VDC a 3.3 VDC que el sensor me exige. Usando el alto valor de tensión en aquellas tramas que pasar por el entorno ruidoso los 15 VDC aseguran que la transmisión de datos no sea afectada.
 
Atrás
Arriba