Estoy leyendo la ficha técnica de un chip ARM Cortex, concretamente el capítulo GPIO. En última instancia, quiero configurar varios pines GPIO para usarlos en el modo "Función alternativa" para acceso de lectura/escritura a SRAM.
De todos los registros GPIO disponibles, no entiendo dos: GPIO_PUPDR
y GPIO_OTYPE
cuáles son respectivamente el "registro pull-up/pull-down" y el "registro de tipo de salida".
Porque GPIO_PUPDR
tengo tres opciones:
Porque GPIO_0TYPE
tengo dos opciones:
¿Cuál es la diferencia entre todas las diferentes configuraciones 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í (consulte la página 24 para ver los esquemas de SRAM). El manual de referencia para el chip ARM está disponible aquí (consulte las páginas 145 y 146 para los registros GPIO).
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íficos.
Los pines de salida se pueden controlar en tres modos diferentes:
Los pines de entrada pueden ser una entrada de puerta con un:
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 compuertas o pines 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 eleva los pines. Si algún pin está bajo, todos bajan cuando se unen. Esta configuración forma efectivamente una AND
puerta.
_____________________________
Nota añadida en noviembre de 2019, más de 7 años después: la configuración de combinar múltiples salidas de drenaje/colector abierto se ha denominado tradicionalmente como una configuración de "O cableado". LLAMARLO OR (incluso tradicionalmente) no lo convierte en uno. Si usa la lógica negativa (que tradicionalmente puede haber sido el caso), las cosas serán diferentes, pero a continuación me ceñiré a la convención de lógica positiva, que es lo que se usa correctamente a menos que se indique específicamente.
El comentario anterior sobre la formación de una puerta 'Y' se ha cuestionado varias veces a lo largo de los años, y se ha sugerido que el resultado es 'realmente' una puerta 'O'. es complejo
La imagen simple es que si varias salidas de colector abierto están conectadas juntas, si cualquiera de los transistores de colector abierto está encendido, la salida común será baja. Para que la salida común sea alta, todas las salidas deben estar apagadas.
Si considera combinar 3 salidas, para que el resultado sea alto, las 3 deberían haber sido altas individualmente. 111 -> 1. Eso es un 'Y'.
Si considera cada una de las etapas de salida como un inversor, para que cada una tenga una salida alta, su entrada debe ser baja. Entonces, para obtener un alto rendimiento combinado, necesita tres 000 -> 1. Eso es un 'NOR'.
Algunos han sugerido que esto es un OR: cualquiera de XYZ con al menos 1 de estos es un 1 -> 1.
Realmente no puedo "forzar" esa idea en la situación.
_________________________________
Al conducir una SRAM, probablemente desee conducir las líneas de datos o las líneas de dirección hacia arriba o hacia abajo de la manera más sólida y rápida posible para que se necesite una unidad activa hacia arriba y hacia abajo, por lo que se indica push-pull. En algunos casos, con múltiples RAM, es posible que desee hacer algo inteligente y combinar líneas, donde otro modo puede ser más adecuado.
Con SRAM con entradas de datos desde SRAM, si el IC de RAM siempre está afirmando datos, entonces un pin sin pull-up probablemente esté bien, ya que la RAM siempre establece el nivel y esto minimiza la carga. Si las líneas de datos de la RAM a veces son de circuito abierto o triple estado, 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 un pull-down para que la resistencia paralela efectiva sea la resistencia de terminación, y las dos resistencias establezcan el voltaje inactivo del bus, pero esto es algo especial.
Encontré esta respuesta de STM32 Comprender la configuración de GPIO
En los circuitos digitales, es importante que nunca se permita que las líneas de señal "floten". Es decir, necesitan estar siempre en un estado alto o bajo. Cuando flota, el estado es indeterminado y causa algunos tipos diferentes de problemas.
La forma de corregir esto es agregar una resistencia desde la línea de señal a Vcc o Gnd. De esa manera, si la línea no está siendo impulsada activamente hacia arriba o hacia abajo, la resistencia hará que el potencial se desvíe a un nivel conocido.
El ARM (y otros microcontroladores) tienen circuitos incorporados 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.
Push-Pull: este es el tipo de salida que la mayoría de la gente considera "estándar". Cuando la salida baja, se "tira" activamente a tierra. Por el contrario, cuando la salida se establece en alta, se "empuja" activamente hacia Vcc. Simplificado, se ve así:
Una salida de drenaje abierto, por otro lado, solo está activa en una dirección. Puede tirar del pasador hacia el suelo, pero no puede llevarlo alto. Imagina la imagen anterior, pero sin el MOSFET superior. Cuando no está tirando a tierra, el MOSFET (lado inferior) simplemente no es conductor, lo que hace que la salida flote.
Para este tipo de salida, se debe agregar una resistencia pull-up al circuito, lo que hará que la línea suba cuando no esté baja. Puede hacer esto con una parte externa o configurando el valor GPIO_PuPd en GPIO_PuPd_UP.
El nombre proviene del hecho de que el drenaje del MOSFET no está conectado internamente a nada. Este tipo de salida también se denomina "colector abierto" cuando se usa un BJT en lugar de un MOSFET.
Básicamente, esto controla la velocidad de respuesta (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 respuesta, 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.
Un pequeño detalle más: para los microcontroladores que no tienen un modo de "drenaje abierto" explícito, como AVR y placas basadas en Arduino ATmega328 como el Uno, este modo de "drenaje abierto" se puede simular escribiendo una función contenedora que simplemente establece un pin en "Salida BAJA" cuando lo envía 0
y que configura el pin como "Entrada BAJA" (modo de alta impedancia, resistencia pullup interna NO activada) cuando lo envía 1
. De esta manera se obtiene el mismo efecto. Estos modernos microcontroladores ARM-core de 32 bits tienen muchas más opciones, eso es todo.
Además, la página 146 del Manual de referencia de STM32 vinculado a lo anterior establece lo siguiente [mis adiciones están entre corchetes] :
– Modo de drenaje abierto: un “0” en el registro de salida activa el N-MOS [por lo tanto, impulsa activamente BAJO 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 pull-up o pull-down]
– Modo push-pull: un "0" en el registro de salida activa el N-MOS [controla activamente el nivel BAJO al conectar el pin a GND] mientras que un "1" en el registro de salida activa el P-MOS [controla activamente el nivel ALTO al conectar el pin a VCC]
En el código Arduino, esa "función contenedora" podría implementarse así:
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);
}
}
O simplificado:
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);
}
}
Tenga en cuenta que para encender la resistencia pullup interna en un Arduino puede hacer:
pinMode(pin, INPUT_PULLUP);
O (lo mismo):
pinMode(pin, INPUT);
digitalWrite(pin, HIGH);
Aleatorioazul
Russel McMahon
Aleatorioazul
Aleatorioazul
Russel McMahon
dave
Russel McMahon
dave
Russel McMahon
teoría
Eugenio Rosca
Russel McMahon
Russel McMahon
Russel McMahon
glen willen
glen willen
Russel McMahon
Russel McMahon
Russel McMahon
glen willen
Russel McMahon