Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

30/06/2015 #1


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. ...
30/06/2015 #2

Avatar de Daniel Meza

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
30/06/2015 #3
Moderador

Avatar de D@rkbytes

elhomiloko dijo: Ver Mensaje
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.
elhomiloko dijo: Ver Mensaje
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 Ω

elhomiloko dijo: Ver Mensaje
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.
30/06/2015 #4

Avatar de Ardogan

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.
01/07/2015 #5


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.
03/07/2015 #6


Primero que nada gracias a todos por sus comentarios , pero creo que me inclino mas por el uso del adaptador que menciona D@rkbytes

D@rkbytes dijo: Ver Mensaje
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...r-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.
Imágenes Adjuntas
Tipo de Archivo: jpg Adaptador niveles I2C.jpg (96,7 KB (Kilobytes), 15 visitas)
Tipo de Archivo: jpg Adaptador niveles I2C Diagrama.jpg (96,2 KB (Kilobytes), 17 visitas)
03/07/2015 #7
Moderador

Avatar de D@rkbytes

elhomiloko dijo: Ver Mensaje
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.
Archivos Adjuntos
Tipo de Archivo: pdf Adaptador de niveles I2C bidireccional.pdf (473,3 KB (Kilobytes), 59 visitas)
08/07/2017 #8


Habrá un equivalente a transistores bjt?
08/07/2017 #9
Moderador

Avatar de D@rkbytes

También existe una forma de hacerlo con transistores comunes.


09/07/2017 #10

Avatar de Nuyel

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.
09/07/2017 #11

Avatar de Hellmut1956

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.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.