Estoy tratando de conectar muchos (~ 80) sensores de distancia ToF VL53L0X en un solo bus i2c. Tienen la dirección i2c predeterminada 0x52, que es programable, pero no persistente. Por lo tanto, puedo elegir entre el encendido/apagado selectivo de los sensores (a través de la expansión GPIO en i2c, etc.) y reprogramar cada dirección individual al inicio, o hacer que las direcciones se traduzcan sobre la marcha en el hardware. Se trata de la segunda opción.
Habría el traductor T
(algo así como LTC4316, pero preferiblemente uno sin divisores de voltaje) siempre entre el sensor S
y el bus, así, cada traductor configurado para una dirección diferente, por supuesto:
master ---+---+---+---+
T T T T
S S S S
Ahora me gustaría poder conectar otros módulos idénticos como este uno tras otro, pero para evitar conflictos de direcciones, cada módulo tendría un traductor N
al principio:
(-- module 1 --) (-- module 2 --) (-- module 3 --)
M---+---+---+---+ === M---+---+---+---+ === M---+---+---+---+
T T T T T T T T T T T T
S S S S S S S S S S S S
El módulo 1 se traduciría por M
, el módulo 2 por MM
, el módulo 3 por MMM
y así sucesivamente, por ejemplo así (con la dirección del sensor 0 para simplificar, T
sumando 1, M
sumando 4)
global address 4 5 6 7 8 9 10 11 12 13 14 15
module-level address 0 1 2 3 0 1 2 3 0 1 2 3
sensor address 0 0 0 0 0 0 0 0 0 0 0 0
Me gustaría tener un comentario sobre si esta es una buena manera de avanzar lógicamente, si tiene sentido eléctricamente y tal vez incluso una sugerencia para IC similar al LTC4316, con dirección de traducción seleccionable tirando de los pines alto/bajo.
Suena costoso y exige muchos recursos tener un traductor de direcciones para cada sensor. Quizás podría usar un interruptor analógico controlado por I2C en su lugar, y simplemente cambiar el SCL a cada uno de los sensores para que no vean ningún comando cuando estén desconectados.
Por ejemplo, Linear Tech LTC1380 es un mux analógico controlado por I2C 8:1 que también se puede desactivar para no tener conexión analógica.
Podría simplemente poner en paralelo dos de los LTC1380 para dividir SCL en 16 rutas diferentes y luego colocar otro LTC1380 en cada una de las 16 rutas para hablar con 8 sensores diferentes en cada una de las 16 rutas de reloj.
Otra posibilidad es mantener 7 canales mux en cada placa y pasar uno a la siguiente placa. Los siguientes tableros también tendrían 7 a bordo y un paso. La resistencia de ~100 ohmios del interruptor analógico eventualmente causaría problemas, pero probablemente podría salirse con la suya a 4 niveles de profundidad con resistencias pull-up de 4.7K. Después de 4 niveles te quedas sin direcciones para los muxes de todos modos.
Si combinó los dos métodos, podría tener un 8: 1 en el nivel superior hablando con 8 3 cadenas profundas con 7 sensores cada una, lo que le da 8 * 21 = 168 sensores.
Para ayudar a mantener la calidad de la señal, tal vez podría combinar los multiplexores analógicos con el LTC-4302 , que es básicamente una conexión programable entre dos buses I2C que pueden tener 32 direcciones de pines diferentes programadas. También tiene aceleración de tiempo de subida, lo que podría ayudar con autobuses largos.
No importa lo que haga, asegúrese de no exceder las especificaciones de carga capacitiva de I2C (~400pf). Dividir los autobuses puede ayudar con eso.
harry svensson
eudoxos