¿Cómo evitar un cortocircuito al conectar un microcontrolador y un dispositivo mediante el bus I2C?

0

Estoy intentando conectar un microcontrolador compatible con 8051 a un acelerómetro usando el bus I2C. Ambos dispositivos funcionan a la misma tensión, 3.3v. Sin embargo, no logro entender algo: ¿no se creará un cortocircuito directo cuando el microcontrolador establece una lógica ALTA en SCL o SDA y el dispositivo esclavo intenta mantener la línea en la lógica BAJA? No entiendo cómo evitar esto ...

¿Cómo puedo hacer que la MCU flote las líneas en lugar de colocar una lógica ALTA en ellas? Me doy cuenta de que puedo cambiar el estado de las líneas a "entrada" en lugar de salida, pero ¿es seguro evitar un cortocircuito?

Como yo lo veo, podría ocurrir el siguiente escenario:

Si la MCU cambió del modo 'entrada' al modo 'salida', ¿no podría el pin estar en el estado ALTO, incluso si configuró el pin en BAJO, y luego configuró el modo de entrada en 'salida'? ¿El voltaje de entrada no cambiará el estado de nuevo a ALTO debido a que el pin está en modo "entrada", antes de que tenga la oportunidad de cambiar al modo de salida? Luego, durante unos pocos uS, estaría emitiendo una lógica alta, antes de que la MCU ejecutara la siguiente instrucción para convertir el pin en BAJO.

    
pregunta Ryan Griggs

2 respuestas

0

Cambiar a entrada para flotar la línea es completamente aceptable. Los MCU PIC de Microchip lo han hecho de esta manera durante años. Solo recientemente han introducido dispositivos que pueden configurarse como drenaje abierto.

Su MCU debe tener un control separado para la entrada / salida y para el valor del bit de salida. La forma habitual de operar esto es establecer los datos de salida en cero y cambiar el bit de dirección (el que determina la entrada o la salida). Es decir, conviértalo en una salida para afirmar un cero, y conviértalo en una entrada para afirmar (sugerir, realmente) un 1. Establecer el bit de entrada también permite leerlo; esto y el estado "alto" son intercambiables.

    
respondido por el gbarry
3

La última oración en el O.P. debería ser:

  

Luego, para algunas uS, establecería la salida de MCU en high-Z emitiría una lógica alta , antes de que MCU ejecutara la siguiente instrucción para convertir el pin en BAJO.

I 2 C es un bus de drenaje abierto con resistencias pull up. Maestro y esclavos solo pueden tirar de las líneas bajas. Ni el maestro ni el esclavo suben las líneas I 2 C (SDA y SCL). En otras palabras, el maestro y el esclavo solo pueden tomar corriente de las líneas I 2 C, pero la corriente de la fuente de ellos puede. El maestro y los esclavos solo pueden poner las salidas en estado de alta Z, y las resistencias pueden subir las líneas hacia arriba.

Los valores de las resistencias de pull-up están en algún lugar entre 1,5 kΩ y 10 kΩ, dependiendo de los niveles de voltaje lógico, la velocidad del bus y la capacitancia del bus. Cuando el bus se baja, las resistencias limitan la corriente, por lo que no existe un cortocircuito.

( fuente )

Esto se detalla en la I 2 C especificación (UM10204) . Cualquiera que trabaje con el bus I 2 C debería al menos hojearlo.

    
respondido por el Nick Alexeev

Lea otras preguntas en las etiquetas