Quiero conectar varios dispositivos esclavos I2C a un microcontrolador, todos en el mismo conjunto de pines, pero todos los dispositivos I2C comparten la misma dirección. Las direcciones se arreglan en el hardware.
¿Hay alguna forma de conectar múltiples 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.
Acabo de encontrarme con este problema con múltiples 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 apuntamos se configura como entrada (alta impedancia ) Esto significa que solo el dispositivo de destino coincide con su dirección I2C y los demás ignoran cualquier dato 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 un pullup de 3K3.
Los diodos schottky aseguran que el dispositivo aún pueda tirar de la línea SDA lo suficientemente baja cuando se transmiten datos al host.
fuente
Si ninguno de los dispositivos I2C usa el estiramiento del reloj (apretón de manos), y si está golpeando el 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 (datos subiendo y bajando sin reloj) y verá cada bit "1" como una parada I2C y comenzar (el reloj sube mientras los datos están bajos, seguido por los datos subiendo y bajando, seguido por el reloj cayendo) Las condiciones de parada e inicio intencionales 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 arranque y parada entre "1" bits, sería poco probable que algún dispositivo "accidentalmente"
fuente
Consideraría usar interruptores de bus para multiplexar el bus I2C entre los dispositivos con direcciones en conflicto. Los interruptores de bus tienen muy baja capacitancia y resistencia, y a diferencia de los buffers / drivers, son verdaderos interruptores que conectan o desconectan dos nodos de circuito.
Los interruptores de bus generalmente tienen una característica extraña, que no importa para I2C porque usa dispositivos de drenaje abierto: un interruptor de bus tiene baja resistencia de conexión cuando se juntan voltajes cercanos a 0 (Vss), pero la resistencia aumenta dramáticamente a medida que se acercan los voltajes la fuente de alimentación Vdd. (Esto se debe a que son básicamente MOSFET 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, los Vgs disponibles son mucho más bajos)
fuente
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 observar cómo funciona I2C en términos de las líneas SCL (reloj) y SDA (datos), parece que apagar la línea SDA evitaría que el chip se inicie o pare y, por lo tanto, lo deje 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 truco, y el PCA9548 sería mucho mejor, pero no tenía uno a mano.
fuente
Ahora hay una respuesta: Linear Tech tiene la serie LTC4316 / 17/18 de traductores de direcciones. Son relativamente nuevos y la disponibilidad es incierta.
fuente
Varios fabricantes ofrecen circuitos integrados multiplex de bus I2C y conmutadores.
Un mux puede activar un canal a la vez; Un interruptor puede habilitar múltiples en paralelo.
Compruebe, por ejemplo, las ofertas de NXP , TI y Maxim .
Para la experimentación, Adafruit tiene una 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
fuente
Utilice un chip demux simple (por ejemplo, 74HC139 afaik) y conecte el pin I2C CLK a la entrada (ya que el pin I2C CLK solo se emite). Use pines GPIO para controlar la salida deseada. Entonces el pin de datos I2C se puede compartir entre todos los esclavos.
fuente