Desagüe push-pull / open; pull-up / pull-down

43

Estoy leyendo la hoja de datos de un chip ARM Cortex, específicamente el capítulo GPIO. En última instancia, quiero configurar varios pines GPIO para usarlos en el modo "Función alternativa" para el acceso de lectura / escritura a la SRAM.

De todos los registros GPIO disponibles, no entiendo dos: GPIO_PUPDR y GPIO_OTYPE , que son respectivamente el "registro de subida / bajada" y el "registro de tipo de salida".

Para GPIO_PUPDR tengo tres opciones:

  • Sin pull-up o pull-down
  • Pull-up
  • tirar hacia abajo

Para GPIO_0TYPE tengo dos opciones:

  • Salida push-pull
  • Salida de drenaje abierto

¿Cuál es la diferencia entre todas las configuraciones diferentes y cuál sería la más adecuada para la comunicación SRAM?

La documentación de la placa en la que estoy trabajando está disponible aquí ( vea la página 24 para los esquemas SRAM). El manual de referencia para el chip ARM está disponible aquí (consulte las páginas 145 y 146 para los registros GPIO).

    
pregunta Randomblue

3 respuestas

51

Esta respuesta es general para procesadores y periféricos, y tiene un comentario específico de SRAM al final, que probablemente sea pertinente para su RAM y CPU específicas.

Los pines de salida se pueden accionar en tres modos diferentes:

  • drenaje abierto : un transistor se conecta a bajo y nada más
  • drenaje abierto, con pull-up : un transistor se conecta a bajo y una resistencia se conecta a alto
  • push-pull : un transistor se conecta a alto, y un transistor se conecta a bajo (solo se opera uno a la vez)

Los pines de entrada pueden ser una entrada de compuerta con un:

  • pull-up : una resistencia conectada a alta
  • desplegable : una resistencia conectada a baja
  • pull-up y pull-down : tanto una resistencia conectada a alta como una resistencia baja (solo es útil en casos raros).

También hay un modo de entrada activado por Schmitt donde el pin de entrada se tira con un pull-up débil a un estado inicial. Cuando se deja solo, persiste en su estado, pero puede ser llevado a un nuevo estado con un mínimo esfuerzo.

El drenaje abierto es útil cuando varias puertas o pasadores están conectados entre sí con un pull-up (externo o interno). Si todos los pines están altos, todos son circuitos abiertos y el pull-up hace que los pines estén altos. Si alguno de los pasadores está bajo, todos bajan a medida que se unen. Esta configuración forma efectivamente una puerta AND .

Cuando conduzca una SRAM, es probable que desee conducir tanto las líneas de datos como las líneas de dirección altas o bajas de la manera más sólida y rápida posible, de modo que se necesite una unidad activa hacia arriba y hacia abajo, por lo que se indica push-pull. En algunos casos, con varias RAM, puede querer hacer algo inteligente y combinar líneas, donde otro modo puede ser más adecuado.

Con la SRAM con entradas de datos desde la SRAM, si el IC RAM siempre está afirmando datos, un pin sin pull-up es probablemente OK, ya que la RAM siempre establece el nivel y esto minimiza la carga. Si las líneas de datos de la RAM están a veces en circuito abierto o estado inactivo, necesitará los pines de entrada para poder establecer su propio estado válido. En comunicaciones de muy alta velocidad, es posible que desee utilizar un pull-up y aa pull-down, de modo que la resistencia efectiva en paralelo sea la resistencia de terminación, y el voltaje de ralentí del bus sea establecido por las dos resistencias, pero esto es algo especial.

    
respondido por el Russell McMahon
13

Encontré esta respuesta en STM32 Descripción de las configuraciones de GPIO

  • GPIO_PuPd (Pull-up / Pull-down)

En los circuitos digitales, es importante que las líneas de señal nunca puedan "flotar". Es decir, necesitan estar siempre en un estado alto o bajo. Cuando está flotando, el estado es indeterminado y causa varios tipos diferentes de problemas.

La forma de corregir esto es agregar una resistencia de la línea de señal a Vcc o Gnd. De esa manera, si la línea no se impulsa de forma activa alta o baja, la resistencia hará que el potencial se desvíe a un nivel conocido.

El ARM (y otros microcontroladores) tienen circuitos integrados para hacer esto. De esa manera, no necesita agregar otra parte a su circuito. Si elige "GPIO_PuPd_UP", por ejemplo, es equivalente a agregar una resistencia entre la línea de señal y Vcc.

  • GPIO_OType (Tipo de salida):

Push-Pull: este es el tipo de salida que la mayoría de la gente considera "estándar". Cuando la salida baja, se "arrastra" activamente a tierra. Por el contrario, cuando la salida se establece en alta, se "empuja" activamente hacia Vcc. Simplificado, se ve así:

Porotrolado,unasalidadedrenajeabiertosoloestáactivaenunadirección.Puedetirardelpasadorhaciaelsuelo,peronopuedeelevarlo.Imaginalaimagenanterior,perosinelMOSFETsuperior.Cuandonoestátirandoatierra,elMOSFET(ladoinferior)simplementenoesconductor,loquehacequelasalidaflote.

Paraestetipodesalida,esnecesarioqueseagregueunaresistenciadepull-upalcircuito,loqueharáquelalíneaseelevecuandonoestébajo.Puedehacerestoconunaparteexterna,oconfigurandoelvalordeGPIO_PuPdenGPIO_PuPd_UP.

ElnombreprovienedelhechodequeeldrenajedelMOSFETnoestáconectadointernamenteanada.Estetipodesalidatambiénsedenomina"colector abierto" cuando se usa un BJT en lugar de un MOSFET.

  • GPIO_Speed

Básicamente, esto controla la velocidad de giro (el tiempo de subida y el tiempo de caída) de la señal de salida. Cuanto más rápida sea la velocidad de giro, más ruido se irradia desde el circuito. Es una buena práctica mantener la velocidad de respuesta lenta y solo aumentarla si tiene una razón específica.

    
respondido por el Abhishek
1

Un poco más de tid-bit: para los microcontroladores que no tienen un modo explícito de "drenaje abierto", como los tableros basados en AVR y Arduino ATmega328 como el Uno, este modo de "drenaje abierto" se puede simular escribiendo una función de envoltura que simplemente establece un pin en "Salida BAJA" cuando le envía un 0 y que configura el pin como una "Entrada BAJA" (modo de alta impedancia, resistencia interna pullup NO activada) cuando le envía un% código%. De esta manera obtienes el mismo efecto. Estos modernos microcontroladores ARM de 32 bits solo tienen muchas más opciones, eso es todo.

También, p146 de STM32 Manual de referencia vinculado anteriormente indica que [mis adiciones están entre corchetes] :

  

- Modo de drenaje abierto: Un "0" en el registro de Salida activa el N-MOS [por lo tanto, activa LOW conectando el pin a GND] mientras que un "1" en el Registro de Salida deja el puerto en Hi-Z (el P-MOS nunca se activa) [modo de alta impedancia: igual que una entrada flotante sin resistencias de pull-up o pull-down]

     

- Modo push-pull: Un "0" en el registro de Salida activa el N-MOS [impulsa activamente BAJO conectando el pin a GND] mientras que un "1" en el Registro de Salida se activa el P-MOS [controla activamente ALTO conectando el pin a VCC]

En el código de Arduino, esa "función de envoltura" podría implementarse así:

digitalWriteOpenDrain(byte pin, bool state)
{
    if (state==LOW)
    {
        pinMode(pin, OUTPUT);
        digitalWrite(pin, LOW);
    }
    else //state==HIGH
    {
        pinMode(pin, INPUT);
        digitalWrite(pin, LOW);
    }
}

O simplificado:

digitalWriteOpenDrain(byte pin, bool state)
{
    digitalWrite(pin, LOW);
    if (state==LOW)
    {
        pinMode(pin, OUTPUT);
    }
    else //state==HIGH
    {
        pinMode(pin, INPUT);
    }
}

Tenga en cuenta que para activar la resistencia de extracción interna en un Arduino, puede hacerlo:

pinMode(pin, INPUT_PULLUP);

O (lo mismo):

pinMode(pin, INPUT);
digitalWrite(pin, HIGH);
    
respondido por el Gabriel Staples

Lea otras preguntas en las etiquetas