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 están fijadas 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.
No hay nada integrado en I2C para hacer esto, normalmente los dispositivos esclavos tendrán algunos pines externos que se pueden configurar 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 hardware específico que maneja la comunicación I2C, es decir, el ACK esclavo está en el hardware, por lo que realmente no puede piratearlo.
En cuanto al módulo de traducción, puede comprar algunos PIC de $ 0.50 con 2 buses I2C y escribir un código rápido para que actúen como traductores de direcciones, supongo.
Acabo de encontrarme con este problema con varios dispositivos I2C con una dirección fija. Nuestra solución fue usar líneas de E/S en el microcontrolador para forzar las líneas SDA en lo alto de los dispositivos que no queremos abordar, mientras que la línea de E/S para el dispositivo al que nos dirigimos 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 los datos posteriores.
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 bajo cuando transmite datos al host.
Ahora hay una respuesta: Linear Tech tiene la serie LTC4316/17/18 de traductores de direcciones. Son relativamente nuevos y la disponibilidad es incierta.
Si ninguno de los dispositivos I2C usa la extensión del reloj (apretón de manos), y si está golpeando el maestro I2C, un truco simple 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á cada bit "1" como una parada I2C y comienzo (el reloj sube mientras los datos están bajos, seguido por el aumento y la caída de los datos, seguido por la caída del reloj). Las condiciones de inicio y detención 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 inicio y detención entre los bits "1", sería poco probable que algún dispositivo "accidentalmente"
Varios fabricantes ofrecen circuitos integrados de conmutación y multiplexación 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 , 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
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), 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 dejaría 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 ninguno a mano.
Consideraría usar conmutadores de bus para multiplexar el bus I2C entre los dispositivos con direcciones en conflicto. Los interruptores de bus son de muy baja capacitancia y resistencia y, a diferencia de los controladores/búferes, son verdaderos interruptores que conectan o desconectan dos nodos de circuito.
Los interruptores de bus suelen tener una característica extraña, que no importa para I2C porque utiliza dispositivos de drenaje abierto: un interruptor de bus tiene una resistencia de encendido baja cuando une voltajes cercanos a 0 (Vss), pero la resistencia aumenta drásticamente a medida que se acercan los voltajes. 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 a medida que los voltajes conmutados se acercan a Vdd, el Vgs disponible es mucho más bajo)
Use un chip demux simple (por ejemplo, 74HC139 afaik) y conecte el pin I2C CLK a la entrada (ya que el pin I2C CLK es solo de salida). Use pines GPIO para controlar la salida deseada. Luego, el pin de datos I2C se puede compartir entre todos los esclavos.
Simón Stevens
Marca
Simón Stevens
Ladrillo