Cambio de dirección I2C

Necesito conectar dos sensores de luz Si114x a un bus I2C. Todavía no los tengo físicamente. Cada sensor tiene la misma dirección I2C, por lo que conectarlos con la configuración predeterminada significaría un conflicto. Sin embargo, la hoja de datos ( http://www.silabs.com/Support%20Documents/TechnicalDocs/Si114x.pdf ) menciona un BUSADDRcomando que modifica la dirección, y el valor predeterminado del registro modificado es 0x00(no 0x5Ael que se da como esclavo dirección, eso es un poco raro).

Mi pregunta es: ¿el sensor guarda la dirección en una memoria no volátil? La hoja de datos no lo dice explícitamente. ¿Puedo conectar un sensor primero como el único sensor al bus, reprogramar su dirección y luego agregar el segundo sensor? ¿Es algún tipo de patrón en los dispositivos I2C? Si no, el comando de modificación de dirección no tendría sentido para mí.

Apostaría mi último dólar a que no tiene NVM
En segundo lugar, si desea conectar varios sensores, tendrá que usar varios buses I2C (no es tan difícil en SW), o multiplexar un solo bus en hardware (muxear solo el SCLK, que es unidireccional, servirá).

Respuestas (3)

En la página 54, la hoja de datos dice:

Dirección I2C[7:0] Especifica una nueva dirección I2C a la que debe responder el dispositivo. La nueva dirección entra en vigor cuando se recibe un comando BUSADDR.

Eso significa que primero establece este valor de RAM y luego llama al comando BUSADDR.


De todos modos, creo que tu única oportunidad es separar uno de los sensores de alguna manera. Esto podría significar un transistor para mantener alta la línea SCL mientras programa la dirección del otro sensor. Después de la inicialización, puede mantener la conducción de este transistor.

esquemático

simular este circuito : esquema creado con CircuitLab

... Espero no haber estropeado la orientación del MOSFET...

Por supuesto, esto requiere una señal separada. Y no creo que puedas prescindir de él.

Es posible que esto no responda a su pregunta directamente, pero otra forma de solucionar el problema, que no requiere cambiar las direcciones del dispositivo, es usar un CD4066 para conectar uno de los dos sensores a la vez, como en Arduino Video Game Shield de Wayne y Layne . . Desplácese hacia abajo hasta la sección titulada Nunchucks . También hay enlaces a esquemas y firmware.

Los nunchucks de Wii (el controlador inalámbrico del famoso videojuego) presentan el mismo problema: se conectan al controlador inalámbrico principal mediante I2C, pero todos tienen la misma dirección de 0 (cero).

Lo que hicieron inteligentemente los autores de ese dispositivo fue usar un interruptor bidireccional IC (el CD4066) para comunicarse con un controlador a la vez, desconectando el otro de las líneas de datos mientras lo hacían. A continuación se muestra un diagrama que muestra la idea general detrás de su diseño.

Diagrama para seleccionar entre dos dispositivos I2C con la misma dirección usando CD4066

Construí un dispositivo de este tipo utilizando sus esquemas de código abierto y funciona perfectamente con ambos controladores conectados a la vez. Tal vez esa sea una opción para que usted considere si la configuración de las direcciones (como lo sugiere Dzarda ) falla.

Si está utilizando software bit-banging para el maestro I2C, y las partes que está usando no usan expansión de reloj, un truco simple para usar dos pines de E/S para conectar dos partes I2C idénticas es tener un pin conectado a SCL de la primera parte y vía resistencia al SDA de la otra, y hacer que el otro pin haga lo contrario. Lo único que se debe tener en cuenta (y la razón por la que se requiere el software bit-banging) es que si uno no tiene cuidado, el dispositivo cuyas conexiones SDA/SCL están invertidas desde el dispositivo con el que está tratando de hablar podría malinterpretar las comunicaciones destinadas a el otro dispositivo como una solicitud para comenzar a hablar con él. Si el SCL destinado a un dispositivo tiene un flanco descendente mientras que el SDA está alto (lo que sería normal al enviar un bit "1"), el otro dispositivo lo verá como una condición de "inicio". Cada vez que SDA va de bajo a alto mientras se envían datos al primer dispositivo, se registrará un "0" en el segundo; una condición de "parada" para el primer dispositivo registrará un "1" para el segundo. Enviar a un dispositivo ciertas secuencias de datos seguidas de una condición de parada podría hacer que el otro vea una condición de inicio seguida de una dirección válida. Las implementaciones de Bit-bang I2C pueden evitar eso mediante el envío de pulsos redundantes en SDA en ciertos momentos mientras el SCL es bajo, pero las implementaciones maestras de hardware I2C no pueden hacer eso. Enviar a un dispositivo ciertas secuencias de datos seguidas de una condición de parada podría hacer que el otro vea una condición de inicio seguida de una dirección válida. Las implementaciones de Bit-bang I2C pueden evitar eso mediante el envío de pulsos redundantes en SDA en ciertos momentos mientras el SCL es bajo, pero las implementaciones maestras de hardware I2C no pueden hacer eso. Enviar a un dispositivo ciertas secuencias de datos seguidas de una condición de parada podría hacer que el otro vea una condición de inicio seguida de una dirección válida. Las implementaciones de Bit-bang I2C pueden evitar eso mediante el envío de pulsos redundantes en SDA en ciertos momentos mientras el SCL es bajo, pero las implementaciones maestras de hardware I2C no pueden hacer eso.

Gracias por la idea, pero en mi caso particular tengo que usar DMA, por lo que no tomo en cuenta el bit-banging.