1 votos

Múltiples esclavos I²C con diferentes direcciones VS. usando un multiplexor

Me gustaría interconectar un montón de sensores I²C idénticos, digamos 32, con un MCU que sólo tiene 2 buses I²C.

Puedo configurar cada sensor para que tenga hasta 8 direcciones diferentes. Por lo tanto, puedo tener 8 sensores por bus o 16 sensores en total, lo cual no es suficiente para mi aplicación.

Tengo previsto utilizar un multiplexor o algún tipo de buffer I²C (descrito en este documento , página 8) para aumentar el número de sensores que puedo interconectar.

Sin embargo, ahora tengo que elegir entre varias opciones:

  • Tener 4 buses de sensores diferentes con 8 sensores cada uno y usar dos multiplexores de 2 canales (o buffers) en cada bus de la MCU para cambiar entre esos 4 buses de sensores.
  • Tener 8 buses de sensores diferentes con 4 sensores cada uno y usar dos multiplexores de 4 canales en cada bus de la MCU para cambiar entre esos 8 buses de sensores.

Esos son sólo ejemplos, hay muchas otras configuraciones pero la pregunta es la misma:

¿Hay alguna razón para preferir tener más canales con menos sensores en cada uno que tener menos canales con más sensores en cada uno?

Traté de averiguar si habría un cambio en la tasa de actualización máxima de mis sensores en cada configuración, pero no puedo ver ninguna diferencia.

Si alguno de vosotros ya se ha enfrentado a este dilema y/o tiene algún elemento de respuesta, ¡me encantaría escucharlo!

EDIT : el sensor en cuestión es el TLV493D un magnetómetro de 3 ejes. Una descripción del bus con hasta 8 sensores está disponible en la página 24 del Manual de Usuario enlazado anteriormente.

Todavía no tengo una idea precisa de los multiplexores, pero probablemente será algo similar a la familia PCA954*.

1voto

Janka Puntos 305

Desde el punto de vista de la programación:

Lo más probable es que todos sus magnetómetros sean manejados por un solo hilo. Favorablemente, reserve un bus I²C para este hilo, de modo que pueda implementar fácilmente el muestreo isócrono. Así será más sencillo implementar un control de bucle cerrado discreto en el tiempo.

El otro I²C puede entonces ser controlado por otro hilo y recoge todos los demás sensores que pueda necesitar.

1voto

Tom Carpenter Puntos 7192

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:

  1. 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.

  2. 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.

  3. 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.

  4. 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.

0voto

ianb Puntos 659

Puedo configurar cada sensor para que tenga hasta 8 direcciones diferentes. Por lo tanto, puedo tener 8 sensores por bus o 16 sensores en total, lo cual no es suficiente para mi aplicación.

Según la hoja de datos, para configurar 8 esclavos con diferentes direcciones se necesitan 7 líneas IO adicionales. Para enrutar (a través de un mutliplexor) el bus a 32 esclavos requiere 5 líneas IO adicionales y no hay que complicarse con la configuración de las direcciones de los esclavos.

Probablemente puedas utilizar un mutiplexor estándar (1:16 o 2 x 1:8) para conmutar la alimentación de 1 de los 16 dispositivos esclavos (o 2 esclavos en diferentes buses I2C) y, por lo tanto, no es necesario multiplexar el(los) bus(s). No sé cuál es el tiempo de arranque desde una condición de apagado para los esclavos, por lo que esto podría terminar siendo un poco lento.

Ciertamente no estoy diciendo que esta sea la solución óptima para tu aplicación específica, pero debería considerarse como una opción si los pines IO están en demanda.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X