cambiando la dirección I2C

3

Necesito conectar dos sensores de luz Si114x a un bus I2C. No los tengo físicamente todavía. 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 ( enlace ) menciona un comando BUSADDR que modifica la dirección y la el valor predeterminado del registro modificado es 0x00 (no 0x5A que se da como una dirección de esclavo, eso es un poco extraño).

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 simplemente conectar un sensor primero como único sensor al bus, reprogramar su dirección y luego agregar el segundo sensor? ¿Es algún tipo de patrón en dispositivos I2C? Si no, el comando de modificación de dirección no tendría sentido para mí.

    
pregunta PiotrK

3 respuestas

3

En la página 54, los estados de la hoja de datos:

  

Dirección I2C [7: 0] Especifica una nueva Dirección I2C para que el dispositivo responda. La nueva dirección lleva   efecto cuando se recibe un comando BUSADDR.

Eso significa bastante, que primero establezca este valor de RAM, luego llame al comando BUSADDR.

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

simular este circuito : esquema creado usando CircuitLab

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

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

    
respondido por el Dzarda
3

Esto puede no responder 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 Wayne y Layne's Arduino Video Game Shield . Desplácese hasta el sction titulado Nunchucks . También hay enlaces a esquemas y firmware.

Wii nunchucks (el controlador inalámbrico del famoso videojuego) muestra el mismo problema: se conectan a la red principal controlador inalámbrico que utiliza I2C, pero todos tienen la misma dirección de 0 (cero).

Lo que los autores de ese dispositivo hicieron de manera inteligente 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 hace. A continuación se muestra un diagrama que muestra la idea general detrás de su diseño.

Heconstruidoundispositivodeestetipoutilizandosusesquemasdecódigoabiertoyfuncionaperfectamenteconamboscontroladoresconectadosalavez.Talvezesaseaunaopciónparaqueconsideressifallalaconfiguracióndelasdirecciones(comolosugiere Dzarda ).

    
respondido por el Ricardo
2

Si está utilizando el software bit banging para el maestro I2C, y las partes que está usando no usan el estiramiento de reloj, un truco simple para usar dos pines de E / S para conectar dos piezas I2C idénticas es tener un pin conectado a SCL de la primera parte y a través de la resistencia a la SDA de la otra, y haga que el otro pin haga lo contrario. Lo único que hay que tener en cuenta (y la razón por la que se requiere el bloqueo de bits del software) es que si no se tiene cuidado, el dispositivo cuyas conexiones SDA / SCL se invierten desde el dispositivo con el que se 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 SDA es 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 el SDA pasa de bajo a alto mientras se envían datos al primer dispositivo, el tiempo se registra en un "0" al segundo; una condición de "parada" para el primer dispositivo cronometrará en un "1" al 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 I2C Bit-bang pueden evitar eso al enviar pulsos redundantes en SDA en ciertos momentos mientras SCL es bajo, pero las implementaciones maestras de I2C de hardware no pueden hacer eso.

    
respondido por el supercat

Lea otras preguntas en las etiquetas