I2C: Cómo conectar Raspberry Pi (corte de energía) a ATmega328p

2

Me gustaría conectar una Raspberry Pi con un microcontrolador ATmega328p utilizando el bus I2C. Estas dos partes actúan como maestros, pero no al mismo tiempo. La Raspberry Pi se alimenta a través del pin de + 5V en el encabezado de GPIO y la potencia del RPi se controla mediante un MOSFET de canal p a través del ATmega328p µC (consulte los esquemas). Cuando el RPi está en estado de corte de energía, el bus I2C se desactiva, desactivando todas las comunicaciones I2C.

¿Cómo desconecto el RPi del bus I2C cuando se corta la alimentación?

simular este circuito : esquema creado usando CircuitLab

En detalle, hay los siguientes dos modos de operación:

  1. La Raspberry Pi está encendida (en ejecución) y actúa como maestro I2C. La Raspberry Pi lee / establece la hora desde un PCF8583 RTC (esclavo I2C) y muestra la hora y otra información en un LCD 16x2 compatible con HD44780 conectado a través de un PCF8574 I2C expansor IC. Mientras se ejecuta el RPi, el bus I2C ATmega µC está inactivo y no está involucrado en ninguna comunicación I2C.

Este modo funciona como se esperaba.

  1. La alimentación de la Raspberry Pi se corta a través de un MOSFET de canal p cuando se apaga. Mientras que la línea + 5V está desconectada por el FET, el RPi aún está conectado a la GND común, tirando de todos los pines GPIO en el RPi bajo. Por lo tanto, el bus I2C se baja constantemente y la comunicación I2C está deshabilitada.

Mi pregunta es, ¿cómo puedo aislar la conexión de la Raspberry PI I2C del bus cuando está apagado?

Probé las siguientes soluciones:

  1. El RPi se alimenta a través del enchufe micro USB normal y se mantiene presionado restablecer el estado (encabezado P6) cuando se apaga. Las líneas I2C son altas. Impedancia y no interferir con el resto del bus. Esta La solución funciona, pero me gustaría reducir el poder a la RPi por completo.
  2. Adición de diodos simples en líneas SDA y SCL. Esto funciona para el SCL. línea como el bus RPi I2C siempre actúa como maestro y genera el Señal de reloj para los esclavos I2C. Sin embargo, la línea SDA es bidireccional y por lo tanto la comunicación no es posible con un diodo insertado en el medio.

¿Cuál es la solución más fácil? Encontré sugerencias aquí , pero no entiendo cómo funcionan estos circuitos y no se da ninguna explicación. ¿Cuál de estos esquemas es mejor para este problema (si existe)?

Cualquier otra solución (¿más simple?) es bienvenida.

Muchas gracias por tu ayuda.

    
pregunta Pohl7534

1 respuesta

3

Le sugiero que obtenga un búfer bidireccional compatible con I2C con modo de triple estado / alta impedancia usando la señal de estilo "ENABLE".

Encontré uno por NXP llamado PCA9517A (que está en digikey por $ 1.37 una pieza o 59c a granel) que hace todo lo anterior, Además, permite el cambio de nivel de voltaje y elimina los problemas de capacitancia del bus. La misma señal utilizada para eliminar la alimentación del RPI se puede usar para impulsar el pin de habilitación, separando así todo el lado del bus I2C del lado del AVR.

Otra nota sobre el circuito PFET que muestra: necesita un PFET de voltaje de compuerta de nivel lógico, y necesita usar un BJT para encender / apagar adecuadamente el PFET, y al menos colocar la resistencia de levantamiento allí.

Debería verse más como esto para funcionar correctamente:

simular este circuito : esquema creado usando CircuitLab

Tenga en cuenta que los capacitores que muestro son muy importantes, que el RPI necesita un buen desacoplamiento de la fuente de alimentación y una capacitancia de gran volumen cerca. Le sugiero que coloque los capacitores lo más cerca posible de la entrada de 5 V del RPI.

    
respondido por el KyranF

Lea otras preguntas en las etiquetas