Gegentakt/offener Abfluss; Hochziehen/Herunterziehen

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

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

Denn GPIO_PUPDRich habe drei Möglichkeiten:

  • Kein Hochziehen oder Herunterziehen
  • Hochziehen
  • Herunterziehen

Denn GPIO_0TYPEich habe zwei Möglichkeiten:

  • Ausgang Gegentakt
  • Ausgang Open-Drain

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

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

Antworten (3)

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 sich mit Low und sonst nichts
  • Open Drain, mit Pull-up - ein Transistor verbindet sich mit Low und ein Widerstand verbindet sich mit High
  • Push-Pull - ein Transistor verbindet sich mit High und ein Transistor verbindet sich mit Low (es wird jeweils nur einer betrieben)

Eingangspins können ein Gate-Eingang sein mit:

  • Pull-up - ein Widerstand, der mit High verbunden ist
  • Pulldown - 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 Schmitt-getriggerten Eingangsmodus, bei dem der Eingangsstift mit einem schwachen Pull-up 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 gezogen werden.

Open Drain ist nützlich, wenn mehrere Gates oder Pins mit einem (externen oder internen) Pull-up miteinander verbunden sind. Wenn alle Pins hoch sind, sind sie alle offene Schaltkreise und das Hochziehen treibt die Pins hoch. Wenn ein Stift niedrig ist, gehen alle niedrig, wenn sie miteinander verbunden sind. Diese Konfiguration bildet effektiv ein ANDTor.

_____________________________

Hinweis hinzugefügt im November 2019 – 7+ Jahre später: Die Konfiguration der Kombination mehrerer Open-Collector/Drain-Ausgänge wird traditionell als „Wired OR“-Konfiguration bezeichnet. Es als OR zu bezeichnen (sogar traditionell) macht es nicht zu einem. Wenn Sie negative Logik verwenden (was traditionell der Fall gewesen sein mag), werden die Dinge anders sein, aber im Folgenden werde ich mich an die Konvention der positiven Logik halten, die von Rechts wegen verwendet wird, sofern nicht ausdrücklich anders angegeben.

Der obige Kommentar zur Bildung eines „UND“-Gatters wurde im Laufe der Jahre mehrmals abgefragt – und es wurde vermutet, dass das Ergebnis „wirklich“ ein „ODER“-Gatter ist. Es ist komplex.

Das einfache Bild ist, dass, wenn mehrere Open-Collector-Ausgänge miteinander verbunden sind, dann, wenn einer der Open-Collector-Transistoren eingeschaltet wird, der gemeinsame Ausgang niedrig ist. Damit der gemeinsame Ausgang hoch ist, müssen alle Ausgänge ausgeschaltet sein.

Wenn Sie 3 Ausgänge kombinieren möchten, müssten alle 3 einzeln hoch gewesen sein, damit das Ergebnis hoch ist. 111 -> 1. Das ist ein 'UND'.

Wenn Sie jede der Ausgangsstufen als Wechselrichter betrachten, muss ihr Eingang niedrig sein, damit jede einen hohen Ausgang hat. Um also eine kombinierte hohe Leistung zu erzielen, benötigen Sie drei 000 -> 1 . Das ist ein 'NOR'.

Einige haben vorgeschlagen, dass dies ein ODER ist - Jeder von XYZ mit mindestens 1 davon ist eine 1 -> 1.
Ich kann diese Idee nicht wirklich der Situation "aufzwingen".

_________________________________

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 treiben, damit ein aktiver Auf- und Abantrieb erforderlich ist, sodass Gegentakt angezeigt wird. In einigen Fällen mit mehreren RAMs möchten Sie vielleicht etwas Cleveres tun und Zeilen kombinieren, wo ein anderer Modus möglicherweise besser geeignet ist.

Wenn bei SRAM mit Dateneingängen vom SRAM der RAM-IC immer Daten ausgibt, ist ein Pin ohne Pull-up wahrscheinlich in Ordnung, da der RAM immer den Pegel festlegt und dies die Last minimiert. Wenn die RAM-Datenleitungen manchmal offen oder tristate sind, benötigen Sie die Eingangspins, um ihren eigenen gültigen Zustand einstellen zu können. Bei sehr schneller Kommunikation möchten Sie möglicherweise einen Pull-up und einen Pull-down verwenden, sodass der parallele Wirkwiderstand der Abschlusswiderstand ist und die Bus-Leerlaufspannung durch die beiden Widerstände eingestellt wird, aber dies ist etwas spezialisiert.

Nur um klar zu sein, was meinst du mit "ein Transistor, der an Low und sonst nichts angeschlossen ist"? Ein Transistor hat 3 Pins. Wie sind die einzelnen Pins verbunden?
@Randomblue - Entschuldigung - Transistorkollektor oder -drain, wenn er als Ausgang fungiert
Um Ihre Antwort auf "pull down" zu verdeutlichen, was ist der Unterschied zwischen "ground", "low" und "-ve"?
Ich habe viele Änderungen an Ihrer Frage vorgenommen. Könnten Sie bitte überprüfen, ob ich keine Fehler gemacht habe?
@Randomblue - Bearbeitungen scheinen gut zu sein. Ich frage mich, was ich anfangs geschrieben habe? Du scheinst gesagt zu haben, was ich denke :-).
Tolle Antwort, Russell, es hat mir wirklich geholfen. Wenn jedoch in der Open-Drain-Konfiguration ein Transistor eingeschaltet ist, ist das nicht so, als hätte man ein ODER-Gatter?
@Dave Ich habe die Logikfunktionalität nicht kommentiert, da dies mit dem Hauptthema hier zusammenhängt, aber peripher ist. | Man kann mit Sicherheit sagen, dass Open-Drain-Ausgänge zusammen mit anderen Komponenten verwendet werden können, um ODER-Gatter zu implementieren. Ein Open-Drain-N-Kanal-Gerät mit einem Widerstand zu hoch implementiert einen Inverter. Zwei solche Open-Drains, die mit einem Widerstand hoch verbunden sind, implementieren ein NOR-Gatter für positive Logik (da 00 in der einzige Zustand ist, der High-Out ausgibt. Für negative Logik ist es ein NAND-Gatter, da Low Low = Logik_11, High-Out = kLogik_0 ergibt. | SO - Ein Open-Drain-Gate kann verwendet werden, um eine Logik vom RTL-Typ zu implementieren.
Tut mir leid, Russell, ich habe nicht kommentiert, wie man Logik mit dieser Konfiguration implementiert. Als Sie sagten: "Wenn ein Pin niedrig ist, gehen sie alle niedrig, wenn sie miteinander verbunden sind. Diese Konfiguration bildet effektiv ein UND-Gatter.", Ich fand es nur seltsam, weil das für mich das ODER-Verhalten beschreibt. Ich verstehe wahrscheinlich falsch, was Sie sagen, weil ich nicht weiß, wie UND-Gatter implementiert werden.
@ Dave Ah - OK - Ich habe verpasst, dass ich das gesagt habe. Mal sehen. Für positive Logik und Eingang = 1 wird der Transistor eingeschaltet, also Ausgang = 0. Verbinden Sie zwei Drains wie oben. Dann in in out = 00 1, 10 0, 01 0, 11 0. Dies ist ein NOR-Gatter für +ve-Logik oder NAND für negative Logik (wie oben). Meine Aussage war also schlampig und Ihre bzw. meine Aussage ist bei entsprechenden Annahmen „richtig“ . zB Ausgang ist hoch, wenn A UND B beide niedrig sind. Oder Ausgang ist niedrig, wenn A ODER B hoch sind. Es ist ein Fish & Fowl Gate :-)
Ich würde den UND- Kommentar korrigieren. Ich fand es beim ersten Lesen nicht richtig (immer noch nicht wirklich ...) und ich denke, viele andere könnten die Aussage falsch interpretieren.
@RussellMcMahon Was ist mit dem "Totempfahl" -Ausgang oder ist es eher ein Relikt von TTL-Schaltungen?
@EugeniuRosca Ja - Totempfahl ist eine "etwas andere" Ausgangsstruktur. Die Frage war spezifisch für die Situation des OP, in der Totempfahl keine Option war. Aus praktischen Gründen sind Totempfahl und Push-Pull praktisch identisch, mit Ausnahme der Einschränkungen, die auf TP in der Nähe der Schiene (n) aufgrund der wirklich seltsamen Architektur basieren (im Vergleich zu etwas, das Sie mit diskreten Komponenten tun würden). .
@theorifice 7 Jahre nach meiner Antwort und 3 Jahre nach Ihrem Kommentar - bitte beachten Sie die hinzugefügte Notiz. Ich stimme dir nicht zu und erkläre warum. Eine Erklärung der gegenteiligen Sichtweise wäre wirklich willkommen.
@Dave Update zu unserer Diskussion vom 18. Juni – bitte beachten Sie die hinzugefügte Anmerkung zur UND/ODER-Diskussion. Eine Erklärung der gegenteiligen Sichtweise wäre wirklich willkommen.
@RussellMcMahon Ich denke, was Sie vermissen, ist, dass "negative Logik", dh Active-Low, sehr verbreitet ist. Wenn die Dokumentation etwas als "verdrahtetes Oder" bezeichnet, bedeutet dies, dass es sich um Open-Drain (oder Open-Collector, praktisch dasselbe) Active-Low handelt.
(Übrigens ist ein wichtiger Grund, warum Sie ein bestimmtes Signal aktiv-niedrig machen würden, der, dass (1) ein ODER von Signalen häufiger gewünscht wird als ein UND, und (2) die Verwendung eines Transistors, um ein Signal niedrig zu ziehen, etwas billiger ist / effizienter als die Verwendung eines Transistors, um ein Signal hochzuziehen, zumindest wenn Sie FETs verwenden, aufgrund der Asymmetrie zwischen P-FETs und N-FETs.)
@GlennWillen Als ich in der Elektronik anfing konnte man fast noch RTL kaufen und TTL war die neue Welle :-). dh nein, ich vermisse es nicht - ich sage nur, dass es für den größten Teil meines Elektroniklebens nicht das ist, woran die meisten Menschen gewöhnt wären. || RS232 Markierungspegel = 1 = welche Polarität? :-) (normalerweise -12 oder -15 V). Startbit geht positiv +=0) dann .... . Innerhalb der (normalerweise) invertierenden Treiber bei (normalerweise damals (TTL-Pegel 0 war <= +0,6 V und 1 war +2,4-+5 (wenn die alte Erinnerung dient). Also ja, beide haben ihren Platz. Zu wissen, wo einer ist Arbeiten mit ist ein guter Anfang :-).
@GlennWillen Ein Gedanke - beachten Sie, was ich oben gesagt habe, was die Ein- und Ausgänge für ein OR darstellt, um die richtige Antwort zu sein. Verwenden Sie H für hoch und L für niedrig. Wenn L = 1 und H = 0 dann: - Für sagen wir zwei Geräte (OC-Transistoren oder was auch immer) mit LH HL oder LL geben L ein ODER mit negativer Logik. UND / ABER, wenn Sie 2 NPN-Transistoren ansteuern, sagen Sie mit offenen Kollektoren oder zwei invertierenden Gates. LL HL LH HH ergibt HLLL = für negative Logik 11 01 10 00 ergibt 0 1 1 1, was UND ist. ...
| Da man normalerweise den Eingang zu Gattern oder Stufen oder Transistoren (oder FETs) betrachtet, wenn man entscheidet, was die Eingangs- / Ausgangslogikfunktion ist, passt UND besser als ODER, es sei denn, Sie verwenden (und erklären) den Sonderfall und die betreffende Perspektive. || Ich versuche nicht nur, nervig oder "immer richtig" zu sein (es ist schön, wenn man es schafft :-) ). - Ich sehe es wirklich so, wie es beschrieben wird, und obwohl dies traditionell "verdrahtetes ODER" ist, scheint es nicht wirklich sinnvoll zu sein, es so zu nennen - mit beiden logischen Polaritäten, außer wenn Sie den Sonderfall wie oben nehmen.
Der Sinn von "Wired-OR" ist, dass, wenn Sie zwei (oder mehr) Open-Drain-Ausgänge nehmen und sie direkt ohne andere Gates dazwischen verdrahten, wenn L 0 V und H VCC ist, dann LL HL LH HH Ihnen LLLH gibt , da der Pull-up die Leitung genau dann hochzieht, wenn keiner der Ausgänge sie niedrig zieht. Aus diesem Grund wird Active-Low-Open-Drain als Wired-OR bezeichnet. (Ich kann nicht sagen, ob Sie mit "negativer Logik" ein System meinen, bei dem Masse 0 und die negative Spannung 1 ist - das System, das ich beschreibe, ist eines, bei dem Masse 1 und die positive Spannung 0 ist, wie Sie in finden würden ein TTL-System für ein Active-Low-Signal.)
@GlennWillen Ja. Wie oben erwähnt, kenne ich den PUNKT von verdrahtetem ODER und warum es verwendet wird und was es tut. Was Sie beschreiben, ist eine Teilmenge dessen, was ich oben gesagt habe. Es ist ein ODER, wenn Sie die AUSGÄNGE der einzelnen Gatter nehmen und sie mit dem Ergebnis vergleichen - was sinnvoll genug ist, ABER als Vorgehensweise nahezu einzigartig ist. Tatsächlich wird das ODER-Gatter mit negativer Logik (niedrig = wahr) aus den Drähten gebildet, die die mehreren Ausgänge miteinander verbinden. (Der einzelne Widerstand, den sie teilen, ist nur die parallele Kombination der mehreren Widerstände, die vor der Kombination vorhanden sind).

Ich habe diese Antwort von STM32 GPIO-Einstellungen verstehen gefunden

  • GPIO_PuPd (Pull-up / Pull-down)

In digitalen Schaltungen ist es wichtig, dass Signalleitungen niemals "schweben" dürfen. Das heißt, sie müssen immer in einem hohen Zustand oder einem niedrigen Zustand sein. Beim Schweben ist der Zustand unbestimmt und verursacht einige verschiedene Arten von Problemen.

Die Möglichkeit, dies zu korrigieren, besteht darin, einen Widerstand von der Signalleitung entweder zu Vcc oder Gnd hinzuzufügen. Wenn die Leitung nicht aktiv hoch oder niedrig angesteuert wird, bewirkt der Widerstand auf diese Weise, dass das Potential auf einen bekannten Pegel driftet.

Der ARM (und andere Mikrocontroller) haben dafür eingebaute Schaltkreise. Auf diese Weise müssen Sie Ihrer Schaltung kein weiteres Teil hinzufügen. Wenn Sie beispielsweise "GPIO_PuPd_UP" wählen, entspricht dies dem Hinzufügen eines Widerstands zwischen der Signalleitung und Vcc.

  • GPIO_OType (Ausgangstyp):

Push-Pull: Dies ist der Ausgabetyp, den die meisten Leute als "Standard" betrachten. Wenn der Ausgang niedrig wird, wird er aktiv auf Masse "gezogen". Umgekehrt, wenn der Ausgang auf hoch gesetzt ist, wird er aktiv in Richtung Vcc "geschoben". Vereinfacht sieht das so aus:Geben Sie hier die Bildbeschreibung ein

Ein Open-Drain-Ausgang hingegen ist nur in eine Richtung aktiv. Es kann den Stift in Richtung Boden ziehen, aber es kann ihn nicht hoch treiben. Stellen Sie sich das vorherige Bild vor, aber ohne den oberen MOSFET. Wenn er nicht auf Masse zieht, ist der (untere) MOSFET 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 niedrig 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 MOSFET intern mit nichts verbunden ist. Diese Art der Ausgabe wird auch als "Open-Collector" bezeichnet, wenn ein BJT anstelle eines MOSFET verwendet wird.

  • GPIO_Geschwindigkeit

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

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

Außerdem heißt es auf Seite 146 des oben verlinkten STM32-Referenzhandbuchs Folgendes [meine Ergänzungen stehen in eckigen Klammern] :

– Open-Drain-Modus: Eine „0“ im Output-Register aktiviert den N-MOS [wodurch aktiv LOW angesteuert wird, indem der Pin mit GND verbunden wird], während eine „1“ im Output-Register den Port in Hi-Z verlässt (der P- MOS wird nie aktiviert) [Hochimpedanzmodus – wie ein schwebender Eingang ohne Pull-up- oder Pull-down-Widerstände]

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


Im 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 zum Einschalten des internen Pullup-Widerstands auf einem Arduino Folgendes tun können:

pinMode(pin, INPUT_PULLUP);

ODER (gleiches):

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

Zusätzliche Lektüre: