44 votos

¿Cómo resolver los conflictos de direcciones I2C?

Quiero conectar múltiples dispositivos esclavos I2C a un micro controlador todos en el mismo conjunto de pines, pero los dispositivos I2C todos comparten la misma dirección. Las direcciones se fijan en el hardware.

¿Hay alguna forma de conectar varios dispositivos con la misma dirección?

Tal vez algún tipo de módulo de traducción de direcciones I2C con cada dispositivo con una dirección configurable para que pueda asignar mis propias direcciones a cada uno.

26voto

Jon Ericson Puntos 9703

No hay nada incorporado en I2C para hacer esto, normalmente los dispositivos esclavos tendrán algunos pines externos que se pueden poner a 0 o 1 para alternar un par de bits de dirección para evitar este problema. Alternativamente, he tratado con algunos fabricantes que tienen 4 o 5 números de pieza para una parte, la única diferencia es su dirección I2C.

La mayoría de los dispositivos tienen hardware específico que maneja la comunicación I2C, es decir, el esclavo ACK está en el hardware por lo que realmente no se puede hackear alrededor de él.

En cuanto al módulo de traducción, podrías comprar algunos PIC's de 0.50$ con 2 buses I2C y escribir algo de código rápido para hacerlos actuar como traductores de direcciones supongo.

0 votos

Gracias. Sí, estos dispositivos tienen una selección de dirección, pero sólo entre dos direcciones y quiero conectar 5+ dispositivos, así que todavía terminaría con enfrentamientos. No había pensado en usar un PIC. Eso debería funcionar. ¿No hay nada en el estante que hace este tipo de cosas?

13 votos

NXP hace un montón de multiplexores / interruptores para I2C, usted puede ser capaz de aparejar algo de esos: ics.nxp.com/productos/i2cmuxes por ejemplo usted podría crear en su caso 3 sub ramas, cada una con 2 dispositivos en ella, y utilizar uno de los interruptores de NXP para lograr su objetivo.

0 votos

Genial, es exactamente lo que estaba buscando. Sólo que no sabía el nombre. Gracias.

7voto

user3608541 Puntos 11

Ahora hay una respuesta: Linear Tech tiene la serie LTC4316/17/18 de traductores de direcciones. Son relativamente nuevos, y la disponibilidad es incierta.

0 votos

Componente muy interesante. La mayoría de los dispositivos I2C tienen 2 direcciones fijas y esto puede LTC4316 podría ser potencialmente el doble de direccionamiento en un costo razonable.

6voto

Alex Andronov Puntos 178

Si ninguno de los dispositivos I2C utiliza el estiramiento de reloj (handshaking), y si estás golpeando el maestro I2C, un truco sencillo es hacer que algunos de los dispositivos intercambien los pines de reloj y datos. Durante la transmisión de un byte, el dispositivo que tiene los pines de reloj y datos intercambiados verá cada bit "0" como un no-evento (datos subiendo y bajando sin reloj) y verá cada bit "1" como una parada y arranque I2C (reloj subiendo mientras los datos están bajos, seguidos por datos subiendo y bajando, seguidos por reloj bajando). Las condiciones de parada y arranque intencionadas de un dispositivo pueden ser vistas como bits de datos por el otro, pero a menos que un dispositivo tenga un número excesivo de condiciones de arranque y parada entre bits "1", sería improbable que cualquier dispositivo viera "accidentalmente" una condición de arranque seguida de ocho bits de datos sin una condición de parada intermedia.

6 votos

No voy a votar en contra, pero esto me parece un poco arriesgado. Mi experiencia con I2C es que es bastante propenso al ruido con sólo la conexión habitual. Sin embargo, usas la palabra "hack" y mencionas la advertencia "si ninguno de los dispositivos i2c usa estiramiento de reloj", así que si a alguien le puede funcionar, pues más poder para él.

5voto

fearphage Puntos 250

Consideraría usar interruptores de bus para multiplexar el bus I2C entre los dispositivos con direcciones en conflicto. Los conmutadores de bus tienen muy baja capacitancia y resistencia y, a diferencia de los buffers/drivers, son verdaderos interruptores que conectan o desconectan dos nodos del circuito.

Los interruptores de bus suelen tener una característica impar, que no importa para I2C porque utiliza dispositivos de drenaje abierto: un interruptor de bus tiene una baja resistencia a la conexión cuando une tensiones cercanas a 0 (Vss), pero la resistencia aumenta drásticamente a medida que las tensiones se acercan a la fuente de alimentación Vdd. (Esto se debe a que son básicamente MOSFETs con voltajes de puerta en la fuente de alimentación cuando se encienden, por lo que a medida que los voltajes conmutados se acercan a Vdd, el Vgs disponible es mucho menor).

1 votos

5voto

nayoso Puntos 107

Tenía dos sensores de luz de color TCS3414 que quería comparar (Los paquetes FN y CS, que tienen diferentes filtros). La dirección I2C está cableada. Después de mirar cómo funciona I2C en términos de las líneas SCL(reloj) y SDA(datos), parecía que apagar la línea SDA impediría que el chip recibiera un bit de arranque o parada y por lo tanto lo dejaría inactivo. Así que usé un interruptor analógico CMOS (4066B) para activar o desactivar la línea SDA de cada dispositivo. Esto funcionó muy bien para cambiar entre los dos dispositivos. Sé que es un hack, y el PCA9548 sería mucho mejor, pero no tenía uno a mano.

1 votos

En realidad, esto no es un hack en absoluto, y yo diría que esto debería ser la respuesta aceptada. He visto esto usado en varios productos comerciales, y no puedo pensar en una mejor solución (a menos que no tengas GPIO disponible y por lo tanto necesites una solución I2C pura como los muxes específicos I2C). Los viejos muxes analógicos tienen mucho ancho de banda y son muy baratos.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X