Cambiar la dirección del pin sin fallas en LPC800

Estoy viendo un microcontrolador LPC812 Cortex M0+ y sus funciones GPIO. En un microcontrolador PIC, uno siempre configuraría el LAtch antes de cambiar la dirección de un pin dado. Esto evita la situación posiblemente desagradable en la que un alfiler se "tuerce". es decir: el estado de salida del pin es 1 justo antes de cambiar de dirección y establecerlo en 0. Esto da como resultado que la salida del pin cambie de 1 a 0 durante una duración de submicrosegundos. (relacionado: ¿Por qué configurar PORTx antes de TRISx? )

Sin embargo, no es obvio en el manual del usuario (UM10601) si escribir un valor en un pin que actualmente es una entrada tiene algún efecto lógico (no tendrá un efecto físico en el estado del pin, ya que es una entrada). Por lo tanto, si escribo un cero en PIN0 (página 92/93), en teoría debería borrar todos los bits de salida. Si estaban trabados, lo cual no es seguro.

La Sección 7.7.2 dice que "Si una o ambas de estas condiciones (es decir, establecer en gpio y establecer en salida) no se cumplen, escribir en el pin no tiene efecto". Lo cual no es útil ya que sé que no hay efecto físico.

Bajo la descripción de IOCON (6.3, página 68) se encuentra el siguiente comentario:

Si los pines de drenaje abierto PIO0_10 y PIO0_11 no están disponibles en el paquete, evite que los pines floten internamente de la siguiente manera: establezca los bits 10 y 11 en el registro GPIO DIR0 en 1 para habilitar el controlador de salida y escriba 1 en los bits 10 y 11 en el registro GPIO CLR0 para conducir las salidas a nivel BAJO internamente.

En mi opinión, esta es una secuencia incorrecta (a menos que el puerto GPIO tenga una salida predeterminada baja, algo más que no está documentado). En un PIC16, primero establecería el estado HI/LO, luego cambiaría la dirección.

Admito que si la pieza hubiera llegado, simplemente probaría esto en el banco. Sin embargo, pondré esto en stackexchange ya que veo ejemplos en todas partes que establecen la dirección y luego el valor, todos los cuales pueden estar fallando en los pines de salida.

Respuestas (2)

Estás analizando demasiado esto. Hay dos registros involucrados en un pin GPIO, el registro de datos de salida y el registro de dirección. Se puede escribir en ambos en cualquier momento (y estoy de acuerdo en que su cita de la Sección 7.7.2 no deja esto muy claro).

El comentario en p68 no se preocupa por una transición, se preocupa por un estado final estable con optimización de energía. Cambiar el orden no hace una diferencia real, pero es más limpio como lo describe.

no changing from 1 to 0 over a sub-microsecond durationhay Cuando habilita la salida, toma el valor impulsado de la misma manera que si lo hiciera pasar de 1 a 0 usando el valor de los datos.

Es solo cuando el valor de reinicio de datos es 0, el tri-estado se levanta, y después de habilitar la salida, escribe 1 en el pin de datos que verá un pulso.

Todos los periféricos son diferentes, pero por ejemplo

Una lectura de GPIODATA devuelve el valor del último bit escrito si los pines respectivos están configurados como salida, o devuelve el valor en el bit GPIN de entrada correspondiente cuando estos están configurados como entradas. Todos los bits se borran mediante un reinicio.

Específicamente, la última escritura y no la última escritura mientras la dirección del pin se estableció como salida .

Analizo todo en exceso :-) Me doy cuenta de lo que dices sobre el comentario y el ahorro de energía. Pero si los pines están físicamente disponibles, se mantiene el mismo consejo ya que no hay resistencias de PU en esas líneas.
Su párrafo final es exactamente el problema. Asumiría que el valor de reinicio es 0 y un pulso es lo que desea evitar (al menos algunas veces). Creo que está diciendo que puede cambiar el orden: es decir: escriba 1 en GPIO CLR0 primero y luego configure el registro GPIO DIR0 en 1 para habilitar el controlador de salida y eso es efectivo. No estaba convencido de que sería efectivo ya que la documentación era un poco confusa allí.
sí, casi seguro que funcionará. Los datos son persistentes sobre la activación/desactivación tri-estado, y es casi seguro que se pueden escribir incluso cuando no hay un efecto secundario inmediato. Escribir hojas de datos claras es difícil.
Gracias por aclarar eso. Y sí, es aún más complicado con quisquillosos como yo. Estuve en control de calidad antes y siempre estoy pensando que nada es obviamente así, ¡si no está documentado, entonces podría no ser cierto! El PIC tiene LAT que es completamente explícito. Cuando solo tenía PORT, no estaba tan claro, especialmente en una lectura-modificación-escritura.

Sin embargo, no es obvio en el manual del usuario (UM10601) si escribir un valor en un pin que actualmente es una entrada tiene algún efecto.

No tiene. Ver output enableen el esquema a continuación.

En mi opinión, esta es una secuencia incorrecta (a menos que el puerto GPIO tenga una salida predeterminada baja, algo más que no está documentado).

Quieren que habilites el pull-down fuerte. El orden no importa, ya que de todos modos ya estaba flotando. (ver valor de reset de registros IOCON/GPIO)

lpc800 manual de usuario fig configuración de 6 pines

Gracias por incluir esa imagen para mí. Cuando dije "tiene algún efecto", me refiero a "cualquier efecto lógico, incluido el establecimiento de algún registro". Mi preocupación es sobre la línea de "salida de datos". Si eso está habilitado, entonces uno de los fuertes pull up o pull down está habilitado. Pensé que era impredecible cuál a menos que la "salida de datos" se establezca mediante una escritura en PIN0 o CLR0 o SET0 o lo que sea.
@carveone Pero solo si Output Enabletambién está habilitado. Y si habilita Open Drain, el pull-up fuerte nunca estará activo.
¡Argh! ¡Creo que no estaba pensando cuando escribí el comentario anterior! Sí, quise decir que cuando la Output Enablelínea se habilita, no está claro (de la hoja de datos) cuál de los pull up o pull down se habilita. Tampoco está claro si escribir en, digamos, SET0 establecerá la data outputlínea alta. Ahora sé que desde el reinicio, cambiar DIR0 a salida bajará el pin y que SET0/CLR0 establecerá/borrará la data outputlínea (incluso si es una entrada), pero la hoja de datos no lo hace explícito.
Y todo parece un poco pedante, pero he descubierto que ser desconfiado y obsesivo desde el principio me evita estar confundido a largo plazo. Me pregunto si NXP aceptará sugerencias en sus hojas de datos :-)