Tras una inspección más detallada de los dispositivos que estás utilizando, parece que para poder configurar su dirección, necesitas poder encender cada dispositivo individualmente, lo que significa que necesitarás un pin de E/S por dispositivo para poder configurar la dirección.
Además, para poder configurar 8 direcciones, es necesario poder establecer la tensión en el pin SDA cuando el dispositivo está encendido. Esta condición será difícil de satisfacer utilizando multiplexores I2C. Para conseguirlo, tendrías que enviar un paquete a través del bus I2C, asegurándote de mantener la línea SDA alta o baja durante 200us. Durante estos 200us, necesitas encender un dispositivo.
Por ello, es mejor que elijas un conjunto de opciones diferente al que te sugerí originalmente:
Opción 1
El método más sencillo sería utilizar un par de multiplexores I2C, uno conectado a cada maestro I2C. Cada expansor de E/S tendría 4 buses descendentes de 4 dispositivos.
Debido a que sólo hay 4 dispositivos en cada bus, esto significa que el LSB de la dirección (establecido por el voltaje del pin SDA/ADDR al encenderse) siempre puede establecerse en 1 (el valor inactivo del bus I2C). Esto elimina la dificultad de ajustar la tensión SDA al nivel correcto al encender los dispositivos.
En segundo lugar, puedes limitarte a necesitar sólo 3 pines de E/S para alimentar los dispositivos. La secuencia de encendido puede ser:
-
El primer dispositivo de cada bus se enciende con VCC. Una vez encendido, se escribe en cada bus para cambiar el registro MOD1 a b11.
-
Se utiliza una línea de E/S para alimentar el segundo dispositivo de cada bus. De nuevo, ahora puedes escribir en cada bus y cambiar el registro MOD1 a b10.
-
Utiliza una segunda línea de E/S para alimentar el tercer dispositivo en cada bus. Escribe en cada bus para cambiar MOD1 a b01.
-
Utiliza la tercera línea de E/S para alimentar el cuarto y último dispositivo de cada bus.
Esto le da 8 buses, cada uno de los cuales consta de 4 dispositivos con una dirección única. No hay necesidad de enredar con la configuración del pin SDA/ADDR a un voltaje específico.
Opción 2
La segunda opción es utilizar un buffer/aislador I2C (por ejemplo, PCA9515a) para cada dispositivo. Conectas un grupo de 16 mediante aisladores a un maestro, y el otro grupo de 16 mediante aisladores al segundo maestro.
Entonces necesitarías 16 pines de E/S para controlar los pines de habilitación de los aisladores. Cada pin de E/S controla un aislador en cada maestro I2C.
Para leer de un dispositivo, basta con habilitar el aislador correspondiente, y leer dos dispositivos simultáneamente utilizando sus dos maestros. Habilitar el pin 0 de E/S permite leer desde el dispositivo 0 en cada maestro, el pin 1 de E/S permite leer desde el dispositivo 1 en cada maestro, y así sucesivamente.
Para ahorrar pines de E/S, podrías utilizar un decodificador de líneas 4:16 74HC154 o similar, dado que sólo tendrás un aislador seleccionado en todo momento. Esto reduce el requerimiento de pines de E/S de 16 a 4.
Respuesta antigua (aplicable a los dispositivos que establecen la dirección mediante los pines Axx):
Cuando se utiliza un multiplexor I2C, hay que escribir un comando en el multiplexor para cambiar el bus de bajada que está activo. Esto lleva tiempo.
Si tienes menos buses de bajada entre los que cambiar (es decir, maximizar el número de dispositivos en cada bus), reduces el número de comandos necesarios para leer todos los dispositivos: puedes leer todos los dispositivos de un bus y luego cambiar al siguiente.
La forma más rápida de leer todos los dispositivos es optar por la opción que tiene más dispositivos por bus de bajada y menos buses de bajada.
En tu caso tienes dos buses de subida. Conecta cada uno de ellos a un multiplexor I2C. A cada multiplexor I2C haz dos buses de bajada de 8 dispositivos.
Mientras que puedes optar por un mux 1:2 que te da el espacio de direcciones suficiente, también puedes optar por un mux 1:4 dejando dos buses de bajada sin usar en cada mux. Esto le da la posibilidad de añadir dispositivos adicionales más adelante si es necesario.