¿Cómo resolver los choques de direcciones I2C?

34

Quiero conectar varios dispositivos esclavos I2C a un microcontrolador en el mismo conjunto de pines, pero todos los dispositivos I2C comparten la misma dirección. Las direcciones están fijadas en el hardware.

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

Quizás 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.

    
pregunta Simon P Stevens

8 respuestas

23

No hay nada integrado en I2C para hacer esto, normalmente los dispositivos esclavos tendrán algunos pines externos que pueden configurarse en 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 parte para una parte, la única diferencia es su dirección I2C.

La mayoría de los dispositivos tienen un hardware específico que maneja la comunicación I2C, es decir, el ACK esclavo está en el hardware, por lo que realmente no puedes hackearlo.

En cuanto al módulo de traducción, puede comprar unos PIC de $ 0.50 con 2 autobuses I2C y escribir un código rápido para que actúen como traductores de direcciones, supongo.

    
respondido por el Mark
5

Si ninguno de los dispositivos I2C usa alargamiento de reloj (handshaking), y si está golpeando al maestro I2C, un simple truco es hacer que algunos de los dispositivos intercambien el reloj y los pines de datos. Durante la transmisión de un byte, el dispositivo que tiene el reloj y los pines de datos intercambiados verá cada bit "0" como un no-evento (los datos suben y bajan sin reloj) y verán cada bit "1" como una parada I2C y comenzar (reloj ascendente mientras los datos están bajos, seguidos por datos ascendentes y descendentes, seguidos de reloj descendente). Las condiciones de parada e inicio intencional para 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 inicio y parada entre "1" bits, sería improbable que cualquier dispositivo viera "accidentalmente" condición de inicio seguida de ocho bits de datos sin una condición de parada intermedia.

    
respondido por el supercat
5

Consideraría usar conmutadores de bus para multiplexar el bus I2C entre los dispositivos con direcciones en conflicto. Los conmutadores de bus tienen una capacidad y una resistencia muy bajas y, a diferencia de los búferes / controladores, son conmutadores verdaderos que conectan o desconectan dos nodos de circuito.

Los interruptores de bus generalmente tienen una característica impar, que no importa para I2C porque usa dispositivos de drenaje abierto: un interruptor de bus tiene una resistencia de activación baja cuando une tensiones cercanas a 0 (Vss), pero la resistencia aumenta dramáticamente a medida que Los voltajes se acercan a la fuente de alimentación Vdd. (Esto se debe a que básicamente son MOSFET con voltajes de compuerta en la fuente de alimentación cuando se encienden, por lo que los voltajes conmutados se acercan a Vdd, el Vgs disponible es mucho más bajo)

    
respondido por el Jason S
4

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

    
respondido por el user3608541
4

Acabo de encontrar este problema con varios dispositivos I2C con una dirección fija. Nuestra solución fue utilizar líneas de E / S en el microcontrolador para forzar las líneas SDA en los dispositivos que no queremos abordar, mientras que la línea de E / S para el dispositivo al que nos dirigimos se establece como entrada (alta impedancia). Esto significa que solo el dispositivo seleccionado coincide con su dirección I2C y los demás ignoran cualquier información posterior.

Las resistencias en la línea SDA para los dispositivos inactivos terminan actuando como pull-ups para el bus, por lo que el valor exacto dependerá de cuántos dispositivos tenga y qué pull-up necesite para su bus. Entonces, si elige resistencias de 10K, entonces 3 dispositivos inactivos dan una recuperación 3K3.

Los diodos schottky aseguran que el dispositivo aún puede tirar de la línea SDA lo suficientemente baja cuando se transmiten datos al host.

    
respondido por el Peter Gibson
3

Tenía dos sensores de luz de color TCS3414 que quería comparar (los paquetes FN y CS, que tienen filtros diferentes). La dirección I2C está cableada. Después de ver cómo funciona I2C en términos de las líneas SCL (reloj) y SDA (datos), parecía que apagar la línea SDA evitaría que el chip obtuviera un bit de inicio o parada y, por lo tanto, lo dejara inactivo. Así que usé un interruptor analógico CMOS (4066B) para encender o apagar la línea SDA de cada dispositivo. Esto funcionó 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.

    
respondido por el David Hill
2

Varios fabricantes ofrecen IC de multiplexado y conmutador de bus I2C.

Un mux puede activar un canal a la vez; un interruptor puede habilitar varios en paralelo.

Compruebe, por ejemplo, las ofertas de NXP , < a href="http://www.ti.com/lsds/ti/interface/i2c-multiplexer-switch-products.page"> TI y Maxim .

Para la experimentación, Adafruit tiene un placa TCA9548a .

Si tiene 8 chips de destino con direcciones idénticas, seleccione un MUX de 8 a uno. Antes de acceder a cualquiera de los chips de destino, configure el MUX para activar el bus I2C correcto.

Ventajas

  • No requiere programación (vs enfoque basado en microcontrolador)
  • Puede admitir las funciones y velocidades de I2C que necesita (en comparación con las transmisiones de bus analógicas / digitales normales). Por ejemplo, un MUX normal (no I2C) no pasará las direcciones de llamadas generales a todos sus canales.
respondido por el florisla
-1

Use un chip de demux simple (por ejemplo, 74HC139 afaik) y conecte el pin CLK I2C a la entrada (ya que el pin CLK I2C solo se envía). Use los pines GPIO para controlar la salida deseada. Luego, el pin de datos I2C se puede compartir entre todos los esclavos.

    
respondido por el Socrates

Lea otras preguntas en las etiquetas