Problema de multiplexación de bus I2C

Veo un efecto secundario inesperado y me vendrían bien algunos consejos. Estoy trabajando en un proyecto que utiliza cinco sensores de color TCS34725 . Estos sensores se conectan a través de I2C en un Launchpad TI F28069M DSP . El primer problema al que me enfrenté fue que todos los sensores de color tienen la misma dirección (y no se pueden reescribir). Me dieron un mux analógico dual de 8 canales DG407 para intentar una solución. Al principio pensé que esta solución era bastante sencilla: usaría mux para SDA y SCL. Sin embargo, lo que estoy viendo es que la primera dirección mux que configuré funciona perfectamente bien, puedo leer la identificación del sensor de color y leer/escribir registros de configuración, etc. La siguiente dirección mux que configuro hace que el bus I2C se registre como ocupado en el TI DSP.

Mi teoría es que el mux cambia temporalmente a alta impedancia entre los cambios de dirección, y ese estado de alta impedancia de alguna manera se ve como una condición de inicio por parte del DSP, por lo tanto, siempre ocupa el bus hasta que se reinicia.

De acuerdo con el manual de referencia técnica del DSP , puedo configurar el bit I2CMDR.IRS en 1, lo que deshabilita efectivamente el periférico, restablece sus bits de estado y conserva su configuración. Intenté configurar este bit, retrasar 10uS, cambiar el mux, esperar 10uS y luego borrar el bit, pero sigo viendo el problema.

¿Alguna idea de cómo puedo solucionar este problema?

Diagrama de circuito a continuación.

esquemático

simular este circuito : esquema creado con CircuitLab

¿Tiene un osciloscopio o analizador lógico?
Un fragmento esquemático tampoco vendría mal.
@ uint128_t, tengo un alcance. Cuando examiné las líneas SDA y SCL en el lado DSP, no vi nada alarmante. El nivel del autobús pareció mantenerse alto durante la transición.
@NickAlexeev, esquema agregado para mayor claridad.
¿Tiene resistencias pull-up en todos los lados del mux?
@Tom Carpenter, no, pero debería haber mencionado que los pull ups internos están en el lado del DSP. Probé con varios pull ups externos (desde 180 hasta 2,7k) en el lado del sensor para limpiar las formas de onda, pero el osciloscopio mostró que cuando se usaban pull ups externos en el lado del sensor, el sensor no podía bajar la línea lo suficiente como para reconocer el flujo de control I2C.

Respuestas (2)

Intente colocar resistencias pull-up en el bus I2C en los lados de entrada y salida del mux. Si ya tiene resistencias más bien pequeñas (1 a 2k) en el lado de salida, sería razonable agregar resistencias más grandes (10k) en el lado de entrada, ya que solo servirían para mantener el nivel alto mientras el mux está conectado y no controlar el autobús de menor a mayor.

Lo más probable es que el problema sea la falta de resistencias. Básicamente, cuando cambia el multiplexor de un canal al siguiente, la salida del que acaba de desconectar ahora está flotando. Con toda probabilidad, flotará hasta el suelo, lo que podría causar algunas condiciones extrañas de inicio/parada en los dispositivos esclavos, dependiendo de qué mux decaiga a cero primero.

Como resultado de la conmutación, es probable que el esclavo se encuentre ahora en un estado extraño y cuando vuelva a conectar el mux, seguirá confundido y probablemente dejará de responder. Tengo la ligera sospecha de que si intenta acceder a él por segunda vez después de que haya fallado sin cambiar el mux, el segundo acceso puede tener éxito ya que la lógica esclava se habrá restablecido por la condición de parada del primer acceso fallido.


La solución es agregar resistencias pull-up en todas las ramas del mux para garantizar que, cuando se desconecten, los canales floten alto, evitando así condiciones falsas de inicio/parada.

Usted dice que su lado DSP tiene resistencias internas, lo cual está bien, que mantiene alta la rama maestra del bus. Pero aún necesitará resistencias en las otras ramas. Estos solo necesitan ser pull-ups de baja fuerza ya que no intentan impulsar los bordes SDA/SCL, solo están allí para mantener el nivel cuando están desconectados.

El 180R que probó es demasiado fuerte para I²C, e incluso 2.7k será demasiado fuerte si el lado maestro ya tiene pull-ups razonablemente fuertes. Como sugiere @alex.forencich, 10k es probablemente un valor mucho más razonable. Esto debería tener una potencia de accionamiento lo suficientemente baja como para no causar ningún problema a sus esclavos. Probablemente podría incluso subir más con la resistencia si sus esclavos están luchando, tal vez intente con 22k o 47k.