Cómo bloquear / permitir que una señal de datos i2c pase a otro dispositivo

0

Tengo tres dispositivos en los que estoy trabajando y uno de ellos necesita controlar la comunicación i2c entre los otros dos.

Cada uno de los dispositivos se basa en un chip AtMega o AtTiny. El Controlador (basado en alguna entrada externa desconocida por el Maestro o el Esclavo) debe poder decidir si transmite o no las señales i2c al Esclavo.

Supongo que puedes simplemente 'bloquear' la señal de datos (no es necesario detener la señal de reloj que está pasando) de alguna manera. He examinado dispositivos como los interruptores de bus Fet único, pero me pregunto si esa es la mejor manera o no.

La configuración es similar a: Maestro --i2c- > Controlador --i2c- > Esclavo

    
pregunta Jon

2 respuestas

2

Si bien la reducción de la línea del reloj puede funcionar en algunos casos, depende en gran medida de cómo estén codificados el maestro y el esclavo. Puede dar lugar a intentos fallidos de arbitraje o congelación debido a una extensión inesperada del reloj.

Hay dos opciones simples. Uno, sería conectar la Línea de Reloj del esclavo, a través de un transistor, como lo haría con una configuración de traducción de nivel simple. Pero en lugar de conectar el transistor a siempre encendido, a un voltaje diferente, la base se conectará al pin de habilitación de su controlador. Si está activado, la línea SCL está conectada al esclavo, lo que le permite ver los pulsos del reloj. Si está apagado, el esclavo no ve ningún pulso en la línea del reloj, por lo que se queda inactivo y el maestro no ve nada diferente en la línea.

Las otras opciones son un búfer i2c, un expansor de bus o un interruptor, con un pin de habilitación. Algunos de ellos tienden a requerir un byte de dirección i2c adicional para permitir la comunicación al otro lado.

    
respondido por el Passerby
1

Sería mejor bloquear la señal del reloj. Si deja que el esclavo vea el reloj pero no los datos, intentará leer los bits de la línea de datos cada vez que el reloj pulsa. Si bloquea el reloj, el esclavo no intentará leer el bus en absoluto.

Un método simple, pero un tanto burdo, sería usar una salida de colector abierto para tirar de la línea del reloj hacia abajo y mantenerla. Mientras la línea del reloj se mantenga baja, no se podrán realizar comunicaciones en el bus. Como de todos modos solo tiene 2 dispositivos comunicándose en el bus, esto debería ser suficiente.

Si tuvieras más de 2 dispositivos y quisieras aislar uno de ellos, mientras permitieras que los demás usaran el bus, entonces los conmutadores de bus que mencionaste serían una mejor solución.

    
respondido por el jwygralak67

Lea otras preguntas en las etiquetas