Drain push-pull / ouvert; pull-up / pull-down

49

Je suis en train de lire la fiche technique d'une puce ARM Cortex, plus précisément le chapitre GPIO. En fin de compte, je souhaite configurer diverses broches GPIO pour les utiliser en mode "Fonction alternative" pour un accès en lecture / écriture à la mémoire SRAM.

De tous les registres GPIO disponibles, je ne comprends pas deux: GPIO_PUPDRet GPIO_OTYPEqui sont respectivement le "registre de montée / descente" et le "registre de type de sortie".

Car GPIO_PUPDRj'ai trois choix:

  • Pas de pull up ou pull-down
  • Remonter
  • Tirer vers le bas

Car GPIO_0TYPEj'ai deux choix:

  • Sortie push-pull
  • Sortie à drain ouvert

Quelle est la différence entre les différentes configurations et quelle serait la plus appropriée pour la communication SRAM?

La documentation de la carte sur laquelle je travaille est disponible ici (voir page 24 pour les schémas SRAM). Le manuel de référence de la puce ARM est disponible ici (voir pages 145 et 146 pour les registres GPIO).

Randomblue
la source
Pouvez-vous fournir des numéros de modèle / des liens vers les fiches techniques de la SRAM et de la CPU ARM que vous utilisez?
Dean
@ Dean: Bien sûr. J'ai mis à jour ma question avec deux liens.
Randomblue

Réponses:

54

Cette réponse est générale pour les processeurs et les périphériques et comporte à la fin un commentaire spécifique à la mémoire SRAM, qui est probablement pertinent pour votre RAM et votre CPU.

Les broches de sortie peuvent être pilotées selon trois modes différents:

  • drain ouvert - un transistor se connecte à faible et rien d'autre
  • drain ouvert, avec pull-up - un transistor se connecte à bas, et une résistance se connecte à haut
  • push-pull - un transistor se connecte à haut, et un transistor se connecte à bas (un seul est exploité à la fois)

Les broches d’entrée peuvent être une entrée de porte avec:

  • pull-up - une résistance connectée à haute
  • pull-down - une résistance connectée à faible
  • pull-up et pull-down - à la fois une résistance connectée à haute et une résistance connectée à faible (utile uniquement dans de rares cas).

Il existe également un mode d'entrée déclenché par Schmitt dans lequel la broche d'entrée est tirée avec une traction faible vers un état initial. Lorsqu'il est laissé seul, il persiste dans son état, mais peut être entraîné dans un nouvel état avec un effort minimal.

Le drain ouvert est utile lorsque plusieurs portes ou broches sont connectées avec un pull-up (externe ou interne). Si toutes les broches sont hautes, ce sont tous des circuits ouverts et le pull-up entraîne les broches vers le haut. Si une des épingles est basse, elles le sont toutes car elles sont attachées ensemble. Cette configuration forme effectivement une ANDporte.

_____________________________

Remarque ajoutée en novembre 2019 - 7 ans et plus: La configuration consistant à combiner plusieurs sorties de collecteur / drain ouvert a généralement été appelée configuration "Wired OR". Le fait d'appeler un OU (même traditionnellement) n'en fait pas un. Si vous utilisez la logique négative (ce qui était traditionnellement le cas), les choses seront différentes, mais dans ce qui suit, nous nous en tiendrons à la convention de la logique positive, qui est ce qui est utilisé de plein droit, sauf indication contraire.

Le commentaire ci-dessus sur la formation d'une porte "ET" a été interrogé à plusieurs reprises au cours des années - et il a été suggéré que le résultat était "vraiment" une porte "OU". C'est complexe.

L'image simple 'est que si plusieurs sorties à collecteur ouvert sont connectées ensemble, alors si l'un des transistors à collecteur ouvert est activé, la sortie commune sera basse. Pour que la sortie commune soit haute, toutes les sorties doivent être désactivées.

Si vous envisagez de combiner 3 sorties - pour que le résultat soit élevé, toutes les 3 auraient dû être élevées individuellement. 111 -> 1. C'est un 'ET'.

Si vous considérez chacun des étages de sortie comme un inverseur, son entrée doit donc être basse pour que chacun d'entre eux ait une sortie élevée. Donc, pour obtenir un haut rendement combiné, vous avez besoin de trois 000 -> 1. C'est un "NOR".

Certains ont suggéré qu'il s'agissait d'un OU - N'importe lequel de XYZ avec au moins un de ceux-ci est un 1 -> 1.
Je ne peux pas vraiment "forcer" cette idée sur la situation.

_________________________________

Lorsque vous conduisez une mémoire SRAM, vous souhaiterez probablement piloter les lignes de données ou les lignes d’adresses haut ou bas aussi solidement et rapidement que possible, de manière à nécessiter un entraînement actif en montée et en descente. Dans certains cas, avec plusieurs RAM, vous voudrez peut -être faire quelque chose d'intelligent et combiner des lignes, où un autre mode peut être plus approprié.

Avec une mémoire SRAM avec des entrées de données provenant de la mémoire SRAM si le circuit intégré de mémoire RAM affirme toujours des données, une broche sans remontée est probablement OK car la mémoire RAM définit toujours le niveau et minimise la charge. Si les lignes de données de la RAM sont parfois en circuit ouvert ou à trois états, vous aurez besoin des broches d’entrée pour pouvoir définir leur propre état valide. Dans les communications à très grande vitesse, vous pouvez utiliser une montée et une descente de manière à ce que la résistance effective parallèle soit la résistance finale et que la tension de repos du bus soit réglée par les deux résistances, bien que ce soit un peu spécialisé.

Russell McMahon
la source
Pour être clair, qu'entendez-vous par "un transistor connecté en bas et rien d'autre"? Un transistor a 3 broches. Comment chaque broche est-elle connectée?
Randomblue
@ Randomblue - désolé - collecteur de transistor ou drain lorsqu'il agit en tant que sortie
Russell McMahon
Pour clarifier votre réponse sur "pull down", quelle est la différence entre "ground", "low" et "-ve"?
Randomblue
J'ai apporté beaucoup de modifications à votre question. Pourriez-vous vérifier que je n'ai commis aucune erreur?
Randomblue
@ Randomblue - Les modifications semblent bonnes. Cela me fait me demander ce que j'ai écrit au début? Vous semblez avoir dit ce que je pense avoir pensé :-).
Russell McMahon
18

J'ai trouvé cette réponse de STM32 Comprendre les paramètres GPIO

  • GPIO_PuPd (Pull-up / Pull-down)

Dans les circuits numériques, il est important que les lignes de signal ne puissent jamais "flotter". C'est-à-dire qu'ils doivent toujours être dans un état haut ou bas. Lorsqu’il est flottant, l’état est indéterminé et pose différents types de problèmes.

La solution consiste à ajouter une résistance de la ligne de signal à Vcc ou à Gnd. Ainsi, si la ligne n'est pas activement pilotée haut ou bas, la résistance risque de dériver à un niveau connu.

L'ARM (et les autres microcontrôleurs) sont dotés d'un circuit intégré permettant de le faire. De cette façon, vous n'avez pas besoin d'ajouter une autre partie à votre circuit. Si vous choisissez "GPIO_PuPd_UP", par exemple, il est équivalent d'ajouter une résistance entre la ligne de signal et Vcc.

  • GPIO_OType (Type de sortie):

Push-Pull: C'est le type de sortie que la plupart des gens considèrent comme "standard". Lorsque la sortie devient basse, il est activement "tiré" à la terre. Inversement, lorsque la sortie est réglée sur haut, elle est activement "poussée" vers Vcc. Simplifié, ça ressemble à ça: entrez la description de l'image ici

En revanche, une sortie Open-Drain n’est active que dans un sens. Il peut tirer la goupille vers le sol, mais il ne peut pas la pousser haut. Imaginez l'image précédente, mais sans le MOSFET supérieur. Lorsqu'il ne tire pas à la terre, le MOSFET (côté inférieur) est simplement non conducteur, ce qui provoque la sortie de la sortie.

Pour ce type de sortie, il faut ajouter une résistance de rappel au circuit, ce qui fera monter la ligne quand elle ne sera pas asservie. Vous pouvez le faire avec un composant externe ou en définissant la valeur GPIO_PuPd sur GPIO_PuPd_UP.

Le nom vient du fait que le drain du MOSFET n'est connecté à rien en interne. Ce type de sortie est également appelé "collecteur ouvert" lorsqu’on utilise un BJT au lieu d’un MOSFET.

  • GPIO_Speed

Fondamentalement, ceci contrôle la vitesse de balayage (le temps de montée et le temps de descente) du signal de sortie. Plus la vitesse de balayage est rapide, plus le circuit émet de bruit. Il est judicieux de maintenir la vitesse de balayage lente et de ne l'augmenter que si vous avez une raison spécifique.

Abhishek
la source
4

Encore un petit morceau: pour les microcontrôleurs qui ne disposent pas d'un mode "open drain" explicite, tel que les cartes basées sur AVR et Arduino ATmega328 telles que l'Uno, ce mode "open drain" peut être simulé en écrivant une fonction wrapper qui définit simplement une broche sur "Output LOW" lorsque vous l'envoyez 0et qui la configure en tant que "Input LOW" (mode haute impédance, résistance pull-up interne NON activée) lorsque vous l'envoyez a 1. De cette façon, vous obtenez le même effet. Ces microcontrôleurs ARM-core 32 bits modernes ont tout simplement plus d’options.

De plus, la p146 du manuel de référence STM32 associée aux états ci-dessus indique ce qui suit [mes ajouts sont entre crochets] :

- Mode drain ouvert: un “0” dans le registre de sortie active le N-MOS [entraînant ainsi activement un LOW en connectant la broche à GND], tandis qu'un “1” dans le registre de sortie laisse le port dans Hi-Z (le P- MOS n'est jamais activé) [mode haute impédance - comme une entrée flottante sans résistances pull-up ou pull-down]

- Mode push-pull: un “0” dans le registre de sortie active le N-MOS [active activement le BAS en connectant la broche à GND] alors qu'un “1” dans le registre de sortie active le P-MOS [active activement le HIGH en connectant la broche à VCC]


Dans le code Arduino, cette "fonction wrapper" pourrait être implémentée de la manière suivante:

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);
    }
}

Ou simplifié:

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);
    }
}

Notez que pour activer la résistance de rappel interne sur un Arduino, vous pouvez effectuer les opérations suivantes:

pinMode(pin, INPUT_PULLUP);

OU (même chose):

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

Lecture complémentaire:

Gabriel Staples
la source