I2C: So verbinden Sie Raspberry Pi (Stromausfall) mit ATmega328p

Ich möchte einen Raspberry Pi mit einem ATmega328p-Mikrocontroller über den I2C-Bus verbinden. Diese beiden Teile agieren beide als Master, aber nicht gleichzeitig. Der Raspberry Pi wird über den +5-V-Pin am GPIO-Header mit Strom versorgt, und die Stromversorgung des RPi wird von einem p-Kanal-MOSFET über den ATmega328p µC gesteuert (siehe Schaltpläne). Wenn sich das RPi im Stromausfallzustand befindet, wird der I2C-Bus auf Low gezogen, wodurch die gesamte I2C-Kommunikation deaktiviert wird.

Wie trenne ich das RPi bei Stromausfall vom I2C-Bus?

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

Im Einzelnen gibt es folgende zwei Betriebsarten:

  1. Der Raspberry Pi ist eingeschaltet (läuft) und fungiert als I2C-Master. Der Raspberry Pi liest/stellt die Zeit von einem PCF8583 RTC (I2C-Slave) ein und zeigt Zeit und andere Informationen auf einem HD44780-kompatiblen 16x2-LCD an, das über einen PCF8574-I2C-Expander-IC angeschlossen ist. Während das RPi läuft, schläft der ATmega µC I2C-Bus und ist an keiner I2C-Kommunikation beteiligt.

Dieser Modus funktioniert wie erwartet.

  1. Die Stromversorgung des Raspberry Pi wird beim Herunterfahren über einen p-Kanal-MOSFET unterbrochen. Während die +5-V-Leitung durch den FET getrennt wird, ist das RPi immer noch mit dem gemeinsamen GND verbunden und zieht alle GPIO-Pins auf dem RPi auf Low. Daher wird der I2C-Bus ständig auf Low gezogen und die I2C-Kommunikation ist deaktiviert.

Meine Frage ist, wie kann ich die Raspberry PI I2C-Verbindung vom Bus isolieren, wenn sie ausgeschaltet ist?

Folgende Lösungen habe ich ausprobiert:

  1. Das RPi wird über den normalen Micro-USB-Stecker mit Strom versorgt und im Reset-Zustand (P6-Header) gehalten, wenn es ausgeschaltet ist. Die I2C-Leitungen sind hochohmig und stören den Rest des Busses nicht. Diese Lösung funktioniert, aber ich möchte die Stromzufuhr zum RPi komplett unterbrechen.
  2. Hinzufügen einfacher Dioden in SDA- und SCL-Leitungen. Dies funktioniert für die SCL-Leitung, da der RPi-I2C-Bus immer als Master fungiert und das Taktsignal für die I2C-Slaves erzeugt. Die SDA-Leitung ist jedoch bidirektional und somit ist eine Kommunikation mit einer dazwischen geschalteten Diode nicht möglich.

Was ist die einfachste Lösung? Ich habe hier Vorschläge gefunden , aber ich verstehe nicht, wie diese Schaltungen funktionieren, und es wird keine Erklärung gegeben. Welcher dieser Schaltpläne eignet sich am besten für dieses Problem (falls vorhanden)?

Alle anderen (einfacheren?) Lösungen sind willkommen.

Vielen Dank für Ihre Hilfe.

Ihr PFET wird nicht funktionieren. Sie haben die Treiberschaltung nicht richtig zum Ein-/Ausschalten des 5-V-PFET-Leistungsschalters mit dem 3,3-V-Atmega. Es sieht so aus, als würden Sie denken, dass PFETs und NFETs auf die gleiche Weise funktionieren!
Ich denke, Ihre beste Wahl ist, einen I2C-kompatiblen (bidirektionalen) Tri-State-Puffer-IC zu finden und dessen ENABLE-Pin gleichzeitig mit dem PFET zu verwenden, um die I2C-Pins des RPI im Wesentlichen gleichzeitig vom I2C-Bus zu "trennen". .
Ich denke, das PMOS ist rückwärts. Sie möchten Source an Stromversorgung und Drain an Himbeer-Pi anschließen. Sie möchten das Gate zur Quelle (5 V) hochziehen. Verwenden Sie einen kleinen NMOS- oder NPN-BJT, um das Gate niedrig zu fahren, wenn Sie möchten, dass der Himbeer-Pi eingeschaltet wird. Lassen Sie das Gate auf 5 V hochziehen, wenn Sie es stromlos machen möchten.
Warum versorgen Sie den Atmega mit 3,3, wenn Sie 5 V zur Verfügung haben?
Schnelle Notiz. Ich bin dem von Ihnen angegebenen Link gefolgt. "Pouls Schaltungsbeispiele." Die Schaltung mit der Bezeichnung "I2C-Busisolator mit 2 MOSFETs" funktioniert für Sie. Ich schlage vor, Sie legen einen kleinen Kondensator (irgendwo im Bereich von 0 bis 18 pF) von Source zu Drain des BSS138. Die Kappe wird möglicherweise nicht benötigt, kann aber die Anstiegsflanken verbessern, wenn Sie feststellen, dass die Anstiegs- und Abfallzeiten des Signals zu langsam sind.
Danke, ich habe den Schaltplan korrigiert, Source und Drain von PFET waren tatsächlich falsch herum. Der I2C-Tri-State-Puffer-IC müsste bidirektional und I2C-fähig sein. Haben Sie Vorschläge, welcher spezielle IC geeignet wäre?
Der I2C-Bus muss 3,3 V betragen, da die GPIO-Pins des Raspberry Pi nicht 5 V-tolerant sind.
Der i2c Bus ja, die Atmega Power und GPIO nein

Antworten (1)

Ich schlage vor, dass Sie einen I2C-kompatiblen bidirektionalen Puffer mit Tri-State-/Hochimpedanzmodus mit "ENABLE" -Stilsignal erhalten.

Ich habe einen von NXP namens PCA9517A gefunden (der auf Digikey für 1,37 USD pro Stück oder 59 Cent in großen Mengen erhältlich ist), der alle oben genannten Funktionen erfüllt und außerdem eine Verschiebung des Spannungspegels ermöglicht und Probleme mit der Buskapazität beseitigt! Das gleiche Signal, das zum Trennen der Stromversorgung vom RPI verwendet wird, kann zum Ansteuern des Aktivierungsstifts verwendet werden, wodurch die gesamte Seite des I2C-Busses von der Seite des AVR getrennt wird.

Ein weiterer Hinweis zu der von Ihnen gezeigten PFET-Schaltung: Sie benötigen einen PFET mit Gate-Spannung auf Logikpegel, und Sie müssen einen BJT verwenden, um den PFET ordnungsgemäß ein- und auszuschalten, und dort zumindest den Pull-up-Widerstand platzieren.

Es sollte eher so aussehen, um korrekt zu funktionieren:

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

Bitte beachten Sie, dass die Kondensatoren, die ich zeige, sehr wichtig sind, das RPI eine gute Entkopplung der Stromversorgung und eine Hochleistungs-Bulk-Kapazität in der Nähe benötigt. Ich schlage vor, dass Sie die Kondensatoren so nah wie möglich am 5-V-Eingang des RPI platzieren.

Bitte ändern Sie Q1 in einen BJT vom NPN-Typ. Sie haben versehentlich einen PNP eingezeichnet. Außerdem würde ich 100k Pullup, 10k Basiswiderstand vorschlagen. Das GPIO muss nicht mit 100 Ohm belastet werden. Und ich stimme Ihnen zu, dass IRF9530 eine schlechte Wahl ist. OP sollte etwas finden, bei dem Rds (on) auf 4 V oder niedriger festgelegt ist.
@mkeith ah ja, Unfall beim BJT-Typ. Und der IRF9530 war nur der Circuitlab-Standard-PFET.
@mkeith Ich stimme den Widerstandsänderungen zu, ich habe sie auch geändert.
@mkeith IRF9530 in IRF5305PbF geändert, das einen VGS von -2 V bis -4 V hat und mit Logikpegeln kompatibel ist.
Eigentlich würde ich so etwas vorschlagen: Diodes, Inc Teilenummer DMG2305UX-13. Es gibt viele andere Optionen. Sie können auf digikey suchen. Suchen Sie nach etwas im SOT 23-Paket mit Rds von weniger als 100 mOhm, wenn Vgs 4 oder 4,5 V beträgt. (Sie können basierend auf diesem Parameter auf der Digikey-Suchseite auswählen).
Was Sie sich ansehen möchten, ist nicht Vgs(th). Sie möchten sich Rds ansehen und sehen, bei welcher Spannung sie angegeben ist. Vgs(th) wird normalerweise mit einem sehr niedrigen Strom wie 250 uA oder 1 mA angegeben.
@mkeith Normalerweise zeigen Lieferanten Rds_on bei 10 V als eine Art seltsamen Standard an, selbst wenn es sich um Gates mit Logikpegel handelt. Das nervt und hilft nicht viel. Um die tatsächlichen Rds_on-Werte für verschiedene Vgs(th)-Werte zu sehen, müssen Sie oft das vollständige Datenblatt und das Diagramm/die Kurve sehen
@KyranF, ich weiß, was du meinst. Aber viele Mosfet-Datenblätter listen es mit mehreren Spannungen auf, einschließlich 4 oder 4,5 und 2,7. Digikey ermöglicht Ihnen die Auswahl basierend auf Rds, die bei 4 oder 4,5 angegeben sind, sodass Sie ungeeignete Teile schnell aussortieren können. Oder Sie können einfach nach Vgs (th) suchen, das 2 V oder weniger beträgt. Das wird meistens ungeeignete Teile aussortieren. Viele kleinere (SOT23) Fets haben Vgs max von 8 V, also listen sie Rds definitiv nicht bei 10 V auf. ;-)
@mkeith wow nur 8V. Ich denke, sie erreichen im Allgemeinen einen ziemlich niedrigen Spannungsbetrieb. Ich bin es gewohnt, + -20 V oder mindestens + -12 V MOSFETs zu verwenden, sogar die mit Logikpegel. Was sind die typischen Vds-Werte für die 8-V-Modelle? 20V?