Push-Pull / Open Drain; Pull-Up / Pull-Down


49

Ich lese das Datenblatt eines ARM Cortex-Chips, insbesondere das Kapitel über GPIO. Letztendlich möchte ich verschiedene GPIO-Pins so konfigurieren, dass sie im Modus "Alternative Funktion" für den Lese- / Schreibzugriff auf SRAM verwendet werden.

Von allen verfügbaren GPIO-Registern verstehe ich zwei nicht: GPIO_PUPDRund GPIO_OTYPEdas sind jeweils das "Pull-Up / Pull-Down-Register" und das "Ausgabetyp-Register".

Denn GPIO_PUPDRich habe drei Möglichkeiten:

  • Kein Hochziehen oder Herunterziehen
  • Klimmzug
  • Nach unten ziehen

Denn GPIO_0TYPEich habe zwei Möglichkeiten:

  • Ausgang Gegentakt
  • Ausgang Open-Drain

Was ist der Unterschied zwischen all den verschiedenen Konfigurationen und welche wären für die SRAM-Kommunikation am besten geeignet?

Die Dokumentation für das Board, an dem ich arbeite, finden Sie hier (siehe Seite 24 für die SRAM-Schaltpläne). Das Referenzhandbuch für den ARM-Chip finden Sie hier (die GPIO-Register finden Sie auf den Seiten 145 und 146).


Können Sie Modellnummern / Links zu Datenblättern der verwendeten SRAM- und ARM-CPU bereitstellen?
Dean

@ Dean: Sicher. Ich habe meine Frage mit zwei Links aktualisiert.
Randomblue

Antworten:


54

Diese Antwort gilt allgemein für Prozessoren und Peripheriegeräte und enthält am Ende einen SRAM-spezifischen Kommentar, der wahrscheinlich für Ihren spezifischen RAM und Ihre CPU relevant ist.

Ausgangspins können in drei verschiedenen Modi angesteuert werden:

  • Open Drain - Ein Transistor verbindet Low und sonst nichts
  • Open Drain, mit Pull-Up - ein Transistor wird mit Low und ein Widerstand mit High verbunden
  • Push-Pull - ein Transistor verbindet sich mit High und ein Transistor verbindet sich mit Low (nur einer wird gleichzeitig betrieben)

Eingangspins können ein Gate-Eingang sein mit:

  • pull-up - ein Widerstand, der mit high verbunden ist
  • pull-down - ein Widerstand, der mit low verbunden ist
  • Pull-Up und Pull-Down - sowohl ein Widerstand, der mit High verbunden ist, als auch ein Widerstand, der mit Low verbunden ist (nur in seltenen Fällen nützlich).

Es gibt auch einen durch Schmitt ausgelösten Eingabemodus, in dem der Eingabestift bei schwachem Hochziehen in einen Anfangszustand gezogen wird. Wenn es in Ruhe gelassen wird, bleibt es in seinem Zustand, kann aber mit minimalem Aufwand in einen neuen Zustand versetzt werden.

Open Drain ist nützlich, wenn mehrere Tore oder Stifte mit einem (externen oder internen) Pull-up verbunden sind. Wenn alle Stifte hoch sind, sind sie alle offen und der Pull-up treibt die Stifte hoch. Wenn ein Stift niedrig ist, gehen alle auf niedrig, wenn sie zusammengebunden werden. Diese Konfiguration bildet effektiv ein ANDTor.

Wenn Sie einen SRAM ansteuern, möchten Sie wahrscheinlich entweder die Datenleitungen oder die Adressleitungen so fest und schnell wie möglich hoch oder niedrig ansteuern, damit ein aktives Hoch- und Runterfahren erforderlich ist, sodass Push-Pull angezeigt wird. In einigen Fällen mit mehreren RAMs möchten Sie möglicherweise etwas Cleveres tun und Zeilen kombinieren, wo ein anderer Modus besser geeignet ist.

Wenn bei einem SRAM mit Dateneingaben vom SRAM der RAM-IC immer Daten aktiviert, ist ein Pin ohne Pull-up wahrscheinlich in Ordnung, da der RAM immer den Pegel festlegt und dadurch die Last minimiert. Wenn die RAM-Datenleitungen manchmal offen oder dreistufig sind, müssen die Eingangspins ihren eigenen gültigen Zustand einstellen können. Bei sehr schnellen Kommunikationen möchten Sie möglicherweise ein Pull-up und ein Pull-down verwenden, damit der parallele effektive Widerstand der Abschlusswiderstand ist und die Busleerlaufspannung von den beiden Widerständen festgelegt wird. Dies ist jedoch etwas speziell.


Um es klar auszudrücken, was meinst du mit "einem Transistor, der an Low angeschlossen ist und nichts anderes"? Ein Transistor hat 3 Pins. Wie ist jeder Pin verbunden?
Randomblue

@ Randomblue - sorry - Transistor Kollektor oder Drain als Ausgang
Russell McMahon

Was ist der Unterschied zwischen "Ground", "Low" und "-ve", um Ihre Antwort auf "Pulldown" zu verdeutlichen?
Randomblue

Ich habe viele Änderungen an Ihrer Frage vorgenommen. Könnten Sie bitte überprüfen, ob ich keine Fehler gemacht habe?
Randomblue

@ Randomblue - Bearbeitungen scheinen gut zu sein. Ich frage mich, was ich ursprünglich geschrieben habe. Du scheinst gesagt zu haben, was ich dachte :-).
Russell McMahon

17

Ich habe diese Antwort von STM32 gefunden

  • GPIO_PuPd (Pull-Up / Pull-Down)

In digitalen Schaltkreisen ist es wichtig, dass Signalleitungen niemals "floaten" dürfen. Das heißt, sie müssen sich immer in einem hohen oder niedrigen Zustand befinden. Im schwebenden Zustand ist der Zustand unbestimmt und verursacht einige verschiedene Arten von Problemen.

Um dies zu korrigieren, fügen Sie einen Widerstand von der Signalleitung entweder zu Vcc oder zu Gnd hinzu. Auf diese Weise bewirkt der Widerstand, dass das Potential auf einen bekannten Pegel abweicht, wenn die Leitung nicht aktiv hoch oder niedrig angesteuert wird.

Der ARM (und andere Mikrocontroller) verfügen dazu über eine integrierte Schaltung. Auf diese Weise müssen Sie Ihrer Schaltung keinen weiteren Teil hinzufügen. Wenn Sie beispielsweise "GPIO_PuPd_UP" wählen, ist es gleichbedeutend damit, einen Widerstand zwischen der Signalleitung und Vcc hinzuzufügen.

  • GPIO_OType (Ausgabetyp):

Push-Pull: Dies ist der Ausgabetyp, den die meisten Leute als "Standard" betrachten. Wenn der Ausgang niedrig wird, wird er aktiv auf Masse "gezogen". Wenn umgekehrt der Ausgang auf hoch eingestellt ist, wird er aktiv in Richtung Vcc "geschoben". Vereinfacht sieht es so aus: Bildbeschreibung hier eingeben

Ein Open-Drain-Ausgang ist dagegen nur in eine Richtung aktiv. Es kann den Stift in Richtung Boden ziehen, aber nicht hoch fahren. Stellen Sie sich das vorherige Bild vor, jedoch ohne den oberen MOSFET. Wenn der (untere) MOSFET nicht an Masse gezogen wird, ist er einfach nicht leitend, wodurch der Ausgang schwebt.

Für diese Art von Ausgang muss der Schaltung ein Pull-up-Widerstand hinzugefügt werden, der bewirkt, dass die Leitung hoch geht, wenn sie nicht tief angesteuert wird. Sie können dies mit einem externen Teil tun oder indem Sie den GPIO_PuPd-Wert auf GPIO_PuPd_UP setzen.

Der Name kommt von der Tatsache, dass der Drain des MOSFETs intern mit nichts verbunden ist. Diese Art von Ausgang wird auch als "Open-Collector" bezeichnet, wenn ein BJT anstelle eines MOSFET verwendet wird.

  • GPIO_Speed

Grundsätzlich regelt dies die Anstiegsgeschwindigkeit (Anstiegs- und Abfallzeit) des Ausgangssignals. Je schneller die Anstiegsgeschwindigkeit ist, desto mehr Rauschen wird von der Schaltung abgestrahlt. Es wird empfohlen, die Anstiegsgeschwindigkeit langsam zu halten und nur zu erhöhen, wenn Sie einen bestimmten Grund haben.


3

Noch ein kleiner Vorgeschmack: Für Mikrocontroller, die keinen expliziten "Open Drain" -Modus haben, wie z. B. AVR- und Arduino ATmega328-basierte Boards wie das Uno, kann dieser "Open Drain" -Modus durch Schreiben einer Wrapper-Funktion simuliert werden Das setzt einfach einen Pin auf "Output LOW", wenn Sie ihn senden 0und konfiguriert den Pin als "Input LOW" (hochohmiger Modus, interner Pullup-Widerstand NICHT an), wenn Sie ihn senden 1. Auf diese Weise erhalten Sie den gleichen Effekt. Diese modernen 32-Bit-ARM-Core-Mikrocontroller bieten einfach mehr Optionen.

Außerdem gibt p146 des STM32-Referenzhandbuchs, das mit den obigen Angaben verknüpft ist, Folgendes an [meine Ergänzungen sind in eckigen Klammern angegeben] :

- Open-Drain-Modus: Eine „0“ im Ausgangsregister aktiviert den N-MOS [wodurch LOW aktiv durch Verbinden des Pins mit GND angesteuert wird], während eine „1“ im Ausgangsregister den Port in Hi-Z verlässt (der P- MOS wird nie aktiviert) [Hochimpedanzmodus - wie ein potentialfreier Eingang ohne Pull-up- oder Pull-down-Widerstände]

- Push-Pull-Modus: Eine „0“ im Ausgangsregister aktiviert den N-MOS [steuert aktiv LOW durch Verbinden des Pins mit GND], während eine „1“ im Ausgangsregister den P-MOS [steuert aktiv HIGH durch Verbinden ] aktiviert der Pin zu VCC]


In Arduino-Code könnte diese "Wrapper-Funktion" folgendermaßen implementiert werden:

digitalWriteOpenDrain(byte pin, bool state)
{
    // Actively drive LOW
    if (state==LOW)
    {
        pinMode(pin, OUTPUT);
        digitalWrite(pin, LOW);
    }
    // High impedance mode 
    // (note that an internal or external pull-up resistor can optionally be added if you like, according to your requirements)
    else //state==HIGH
    {
        pinMode(pin, INPUT);
        digitalWrite(pin, LOW);
    }
}

Oder vereinfacht:

digitalWriteOpenDrain(byte pin, bool state)
{
    digitalWrite(pin, LOW);

    // Actively drive LOW
    if (state==LOW)
    {
        pinMode(pin, OUTPUT);
    }
    // High impedance mode
    // (note that an internal or external pull-up resistor can optionally be added if you like, according to your requirements)
    else //state==HIGH
    {
        pinMode(pin, INPUT);
    }
}

Beachten Sie, dass Sie Folgendes tun können , um den internen Pullup-Widerstand auf einem Arduino einzuschalten :

pinMode(pin, INPUT_PULLUP);

ODER (dasselbe):

pinMode(pin, INPUT);
digitalWrite(pin, HIGH);

Zusätzliche Lektüre:

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.