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

Me gustaría conectar una Raspberry Pi con un microcontrolador ATmega328p usando el bus I2C. Estas dos partes actúan ambas como maestras, pero no al mismo tiempo. El Raspberry Pi se alimenta a través del pin de +5 V en el cabezal GPIO y la alimentación del RPi se controla mediante un MOSFET de canal p a través del ATmega328p µC (ver esquemas). Cuando el RPi está en estado de corte de energía, el bus I2C se reduce y se desactiva toda la comunicación I2C.

¿Cómo desconecto el RPi del bus I2C cuando se corta la energía?

esquemático

simular este circuito : esquema creado con CircuitLab

En detalle, existen los siguientes dos modos de funcionamiento:

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

Este modo funciona como se esperaba.

  1. La alimentación de Raspberry Pi se corta a través de un MOSFET de canal p cuando se apaga. Mientras que la línea de +5 V está desconectada por el FET, el RPi todavía está conectado a GND común tirando de todos los pines GPIO en 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 Raspberry PI I2C del bus cuando está apagado?

Probé las siguientes soluciones:

  1. El RPi se alimenta a través del conector micro USB normal y se mantiene en estado de reinicio (encabezado P6) cuando se apaga. Las líneas I2C son de alta impedancia y no interfieren con el resto del bus. Esta solución funciona, pero me gustaría cortar completamente la energía del RPi.
  2. Adición de diodos simples en líneas SDA y SCL. Esto funciona para la línea SCL ya que el bus RPi I2C siempre actúa como maestro y genera la 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 corresponde)?

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

Muchas gracias por su ayuda.

Su PFET no funcionará. No tiene el circuito de accionamiento correcto para encender/apagar el interruptor de alimentación PFET de 5 V, con el Atmega de 3,3 V. ¡Parece que piensa que los PFET y los NFET funcionan de la misma manera!
Creo que su mejor apuesta es encontrar un IC de búfer de tres estados compatible con I2C (bidireccional), y usar su pin ENABLE controlado al mismo tiempo que el PFET para esencialmente "separar" los pines I2C del RPI del bus I2C al mismo tiempo .
Creo que el PMOS está al revés. Desea conectar la fuente a la fuente de alimentación y el drenaje a la frambuesa pi. Desea abrir la puerta a la fuente (5V). Use un pequeño NMOS o NPN BJT para bajar la puerta cuando desee que se encienda la frambuesa pi. Deje que la compuerta suba hasta 5 V cuando desee desconectarla.
¿Por qué está alimentando el atmega a 3.3 cuando tiene 5V disponibles?
Nota rápida. Seguí el enlace que me proporcionaste. "Ejemplos del circuito de Poul". El circuito etiquetado como "aislador de bus I2C con 2 MOSFET" funcionará para usted. Le sugiero que coloque un pequeño capacitor (en algún lugar en el rango de cero a 18pF) desde la fuente hasta el drenaje de los BSS138. Es posible que no se necesite el límite, pero puede mejorar los bordes ascendentes si encuentra que los tiempos de subida y bajada de la señal son demasiado lentos.
Gracias, corregí el esquema, la fuente y el drenaje de PFET estaban al revés. El IC de búfer de tres estados I2C tendría que ser bidireccional y compatible con I2C. ¿Tiene alguna sugerencia sobre qué IC en particular sería adecuado?
El bus I2C debe ser de 3,3 V, ya que los pines GPIO de Raspberry Pi no son tolerantes a 5 V.
El bus i2c si, el atmega power y gpio no

Respuestas (1)

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

Encontré uno de NXP llamado PCA9517A (que está en Digikey por $ 1.37 por 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 energía del RPI se puede usar para activar 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 puerta de nivel lógico, y necesita usar un BJT para encender / apagar correctamente el PFET, y al menos colocar la resistencia de extracción allí.

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

esquemático

simular este circuito : esquema creado con CircuitLab

Tenga en cuenta que los condensadores que muestro son muy importantes, el RPI necesita un buen desacoplamiento de la fuente de alimentación y una capacitancia a granel de servicio pesado cerca, le sugiero que coloque los condensadores lo más cerca posible de la entrada de 5V del RPI.

cambie Q1 a un BJT de tipo NPN. Has dibujado accidentalmente un PNP. Además, sugeriría un pullup de 100k, una resistencia base de 10k. No hace falta cargar el gpio con 100 Ohmios. Y estoy de acuerdo contigo en que IRF9530 es una mala elección. OP debería encontrar algo con Rds (encendido) especificado en 4V o menos.
@mkeith ah sí, accidente en el tipo BJT. Y el IRF9530 era solo el PFET predeterminado de circuitlab.
@mkeith Estoy de acuerdo con los cambios de resistencia, también los he cambiado.
@mkeith Cambió IRF9530 a IRF5305PbF que tiene VGS de -2V a -4V y es compatible con el nivel lógico.
En realidad, sugeriría algo como esto: Número de pieza de Diodes, Inc DMG2305UX-13. Hay muchas otras opciones. Puedes buscar en digikey. Busque algo en el paquete SOT 23 con Rds inferior a 100 mOhm cuando Vgs es 4 o 4.5V. (Puede seleccionar en función de este parámetro en la página de búsqueda de Digikey).
Lo que quieres ver no es Vgs(th). Desea mirar Rds y ver a qué voltaje se especifica. Vgs(th) generalmente se especifica con una corriente muy baja como 250 uA o 1mA.
@mkeith generalmente los proveedores mostrarán Rds_on a 10 V como una especie de estándar extraño, incluso si son puertas de nivel lógico. Es molesto, y no ayuda mucho. Para ver los valores reales de Rds_on para varios valores de Vgs(th), a menudo tiene que ver la hoja de datos completa y el gráfico/curva
@KyranF, sé lo que quieres decir. Pero muchas hojas de datos de mosfet lo enumeran en múltiples voltajes, incluidos 4 o 4.5 y 2.7. Digikey le permitirá seleccionar en función de Rds especificados en 4 o 4,5, para que pueda descartar rápidamente las piezas inadecuadas. O simplemente puede buscar Vgs (th) que sea 2V o menos. Eso eliminará principalmente las partes inadecuadas. Muchos fet más pequeños (SOT23) tienen Vgs max de 8V, por lo que definitivamente no enumeran Rds a 10V. ;-)
@mkeith wow solo 8V. Supongo que están llegando a una operación de voltaje bastante bajo en general. Estoy acostumbrado a usar MOSFET de +-20V o al menos +-12V, incluso los de nivel lógico. Para los de 8V, ¿cuáles son las clasificaciones típicas de Vds? 20V?