= Puertos Series (USART) en el microcontrolador LPC43XX con la biblioteca LPCOpen = Los periféricos USART (por sus siglas en ingles de Universal Synchronous/Asynchronous Receiver/Transmitter) son dispositivos de comunicación serie síncrona o asíncrona, que permite conectar el microcontrolador con otros equipos, obteniendo de esta forma un método simple para comunicar o recibir datos del exterior. El LPC43xx posee 3 USART y 1 UART (solo permite el modo asíncrono) esta última con los pines necesarios para implementar una comunicación con un MODEM. === Lineas de comunicación === ==== USART 0,2,3 ==== || '''Señal''' || '''Descripción''' || || RxD || Entrada || || TxD || Salida || || DIR || Utilizado en RS-485 y EIA-485 || || UCLK || Clock para modo síncrono || || BAUD || Solo disponible en USART3 para interfaz IrDA|| ==== UART 1 ==== || '''Señal''' || '''Descripción''' || || RxD || Entrada || || TxD || Salida || || CTS || Clear To Send || || DCD || Data Carrier Detect || || DSR || Data Set Ready || || DTR || Data Terminal Ready || || RI || Ring Indicator || || RTS || Request To Send || == UART (Universal Asynchronous Receiver/Transmitter) == EL modo de transmisión asíncrono (UART) corresponde a uno de los protocolos de comunicación serie mas difundidos, en este modo de transición los datos son enviados sin una señal de reloj externa. Todas las UART del LPC43xx (las 3 USART funcionando en modo asíncrono y la UART) son compatibles con el estándar 550, esto significa que son compatibles con la UART diseñada por National Semiconductors 16550 y salida al mercado en 1987, esta UART reemplazaba a la 8250 primera interfaz serie de la PC XT. En una transmisión asíncrona, los datos son divididos en palabras de una longitud fija, generalmente octetos, a los cuales se le agregan al comienzo códigos de sincronismo y luego al final del word se pueden agregar espacios, con lo cual permite al receptor identificar un nuevo código de sincronismo. Como se comentó arriba, las palabras suelen ser octetos, este tipo de comunicación asíncrona se denomina orientada a caracter y uno de los estándar mas comunes es el RS-232 (Recommended Standard 232). === RS-232 === El estándar RS-232 es una norma para el intercambio de datos entre dos dispositivos denominados DTE (Equipo terminal de datos) con un DCE (Equipo de comunicación de datos), A pesar de que este estándar soporta comunicación síncrona, su uso mas habitual es en comunicaciones asíncronas por ejemplo el implementado en una PC. En el caso habitual de una PC llamaremos a la misma DTE, donde el DCE generalmente era el modem, en el caso de comunicarse dos PC entre si (DTE con DTE) no habrá modem, con lo cual la conexión se llamará Null Modem, en estos casos el cable que une las dos computadoras, debe unir las señales de manera cruzada, es decir por ejemplo que la señal denominada TxD en una de las PC debe unirse con la denominada RxD de la otra PC. == Registros == || RBR || RO || 0x000 || Receiver Buffer Register. contiene el proximo byte a ser leido (DLAB = 0). || || THR || WO || 0x000 || Transmit Holding Register se escribe el proximo byte a enviar (DLAB = 0). || || DLL || R/W || 0x000 || Divisor Latch LSB. parte menos significativa del divisor (DLAB = 1). || || DLM || R/W || 0x004 || Divisor Latch MSB. parte mas significativa del divisor (DLAB = 1). || || IER || R/W || 0x004 || Interrupt Enable Register. contiene la habilitación de las 7 posibles fuentes de interrupción (DLAB = 0) || || IIR || RO || 0x008 || Interrupt ID Register. Interrupciones pendientes || || FCR || WO || 0x008 || FIFO Control Register. Controla la FIFO || || LCR || R/W || 0x00C || Line Control Register. Contiene el formato de del frame || || - || || 0x010 || Reservado || || LSR || RO || 0x014 || Line Status Register. Contiene las banderas del estado de la transmisión y recepción || || - || || 0x018 || Reservado || || SCR || R/W || 0x01C || Scratch Pad Register. Registro de datos temporales || || ACR || R/W || 0x020 || Auto-baud Control Register. || || ICR || R/W || 0x024 || IrDA control register (solo USART3) || || FDR || R/W || 0x028 || Fractional Divider Register. || || OSR || R/W || 0x02C || Oversampling Register. || || - || || 0x030-0x3C || Reservado || || HDEN || R/W || 0x040 || Half-duplex enable Register || || - || || 0x044 || Reservado || ||SCICTRL || R/W || 0x048 || Smart card interface control register || ||RS485CTRL || R/W || 0x04C || RS-485/EIA-485 Control. || ||RS485ADRMATCH|| R/W || 0x050 || RS-485/EIA-485 address match || ||RS485DLY || R/W || 0x054 || RS-485/EIA-485 direction control delay. || ||SYNCCTRL || R/W || 0x058 || Synchronous mode control register. || ||TER || R/W || 0x05C || Transmit Enable Register. || === RBR/THR Registro de Recepción y Transmisión === La misma posición de memoria es utilizada por dos registros, depende del tipo de operación realizada sobre esa memoria a cual de ello se acceda. * Operación de lectura, se accede al registro de recepción el cual posee el byte recibido mas antiguo contenido en la FIFO, en caso de configurar una trama menor a 8 bits de datos, los bits mas altos de este registro permanecerán en 0. * Operación de escritura, el registro será colocado en la FIFO para ser transmitido. En ambos casos el DLAB (Divisor Latch Access Bit) debe ser cero === DLR (Divisor Latch Register) === Esta compuesto por dos registros de 8 bits cada uno el LSB y MSB, donde el LSB comparte la dirección de memoria con el registro de recepción y transmisión y el MSB lo hace con el registro de habilitación de interrupción. El valor total formado por los dos registros, tendrá una longitud de 16bits y es el divisor del VPB que se deberá configurar para determinar el baud rate de la transmisión y/o recepción. El baud rate será calculado como: {{{ VPB baud rate = ---------- DLR x 16 }}} Conociendo la velocidad con la cual deseamos transmitir y la frecuencia del VPB, podemos despejar el DLR, el cual nos dará un valor de 16 bits, guardando en DLL el byte menos significativo y en DLM el mas significativo. === IER Registro de habilitación de interrupción === Este registro es el usado para habilitar las diferentes interrupciones que puede realizar la UART según distintos eventos * bit 0 RBRIE habilita la generación de una interrupción cuando hay un dato disponible para leer * bit 1 THREIE habilita la generación de la interrupción cuando la FIFO de transmisión se ha vaciado, el estado de esta interrupción puede ser leída en el bit 5 del LSR * bit 2 RXIE habilita la generación de una interrupción por Rx, el estado de esta interrupción puede ser leída de LSR[4:1]. * bit 8 ABEOINTEN habilita la generación de una interrupción por auto-baud. * bit 9 ABTOINTEN habilita la generación de una interrupción por auto-baud time out . === IIR Registro de identificación de Interrupción === Muestra el estado de las interrupciones, pudiendo leer el origen y la prioridad de una interrupción pendiente, las interrupciones son congeladas en un acceso a la U0IIR, si ocurriera alguna interrupción en el momento en que se accede, esta se reflejara recién la próxima vez * bit 0 interrupción pendiente 0 = al menos una interrupción está pendiente, las interrupciones pendientes pueden ser leídas en U0IIR[3:1] * bits 1 a 3 identificación de interrupción: || bits|| Prioridad || Denominación || Descripción || Reset || || 0x3 || 1 || Receive Line Status (RLS) || Es generada por cuatro condiciones de error, (OE) overrun error, (PE) Parity error, (FE) Framing error o error de trama y (BI) break interrupt || leyendo el U0LSR || || 0x2 || 2a || Receive Data Available (RDA) || Se activa cuando la FIFO de lectura llegue a la cantidad establecida en U0FCR[7:6]. || leyendo U0RBR o modificando la FIFO a un valor mas alto || || 0x6 || 2b || Character Time-out Indicator (CTI) || Ocurre cuando hay al menos un carácter en la FIFO de recepción y no ocurrió ninguna actividad en la misma por 3,5 a 4,5 tiempos de caracter, esta interrup., permite leer uno o varios datos que quedaron en la FIFO pero que por su cantidad no llega a generar una RDA || leyendo el URBR || || 0x1 || 3 || THRE Interrupt || Es activada cuando la FIFO de transmisión se vacía || leyendo el U0IIR o escribiendo el U0THR || * bit 6 a 7 FIFO equivalente al los bits correspondiente al FCR[6:7] * bit 8 ABEOINT el auto-band finalizó con éxito * bit 9 ABTOINT auto-band generó un time out . === FCR Registro de Control de FIFO === * bit 0 FIFOEN habilitar FIFO, activo por alto, habilita las dos FIFO (recepción y transmisión), este bit además habilita el resto de la configuración de este registro * bit 1 RXFIFORES borrar FIFO de Rx, un 1 es este bit borra toda la FIFO de recepción, luego de esto, es puesto a 0 por la misma UART * bit 2 TXFIFORES borrar FIFO de Tx, un 1 es este bit borra toda la FIFO de transmisión, luego de esto, es puesto a 0 por la misma UART * bit 3 DMAMODE Activar modo DMA * bit 6 a 7 Selector del nivel de trigger de Rx, selecciona a cuantos caracteres recibidos se activará la interrupción RDA * 00: trigger nivel 0 (1 caracter) * 01: trigger nivel 1 (4 caracteres) * 10: trigger nivel 2 (8 caracteres) * 11: trigger nivel 3 (14 caracteres) === LCR Registro de Control de Linea === Determina el formato de los datos a transmitir o recibir * bits 0 a 1: WLS Selección del largo del word * 00: 5 bit de largo * 01: 6 bit de largo * 10: 7 bit de largo * 11: 8 bit de largo * bit 2: SBS Largo del bit de stop * 0: 1 bit de stop * 1: 2 bit de stop ( 1.5 en caso de 5 bit de largo ) * bit 3: PE Habilitar Paridad esto significa que con 1, estos agregando un bit extra a los datos, el valor de este bit depende de la selección de paridad (bit 4:5) * bits 4 a 5: PS * 00: paridad impar * 01: paridad par * 10: fuerza a 1 el bit de paridad * 11: fuerza a 0 el bit de paridad * bit 6: BC Control de Corte, cuando se configura a 1, fuerza al pin de transmisión a un valor lógico 0 * bit 7: DLAB bit de acceso al divisor de latch (DLAB) este bit en 1 permite el acceso a los registro del divisor de latch ( DLL y DLM ) === LSR Registro de Estado de la Linea === es un registro de solo lectura que provee acceso a estado del bloque de transmisión y recepción * bit 0: Receiver Data Ready (RDR), un 1 en este bit indica que hay un dato dentro de la FIFO sin leer. * bit 1: Overrun error (OE), se activa en el caso de que un nuevo caracter es recibido y la FIFO se encuentra llena, el caracter se pierde y se activa el OE * bit 2: Parity Error (PE), se activa cuando la verificación de la paridad en el caracter recibido falla * bit 3: Framing Error (FE), ocurre cuando en e bit de stop se lee un 0, esto puede ocurrir cuando no está correctamente sincronizado el receptor con respecto al transmisor queda a la espera de recibir todos 1 * bit 4: Break Interrupt (BI): se activa cuando recibe 0 durante el periodo de un dato (bit de start + datos + bit de stop) en este caso el receptor * bit 5: Transmitter Holding Empty (THRE), un 0 indica que el registro de transmisión contiene datos 1 indica que este registro está vacío * bit 6: Transmitter Empty (TEMT) un 1 indica que se transmitieron todos los datos * bit 7: Error in Rx FIFO (RXFE) ocurre cuando el dato leído posee algún error (FE,PE o BI) * bit 8: Error in transmitted character (TXERR) == Utilización de la USART del LPC43xx == Para implementar una interfaz serie RS-232, utilizaremos una USART en particular, la número 2, en la placa EDU-CIAA esta USART fue cableada al integrado FTDI2232, el mismo es el encargado de realizar la interfaz JTAG del microcontrolador y el USB, además de esta tarea, incorpora un puerto extra configurado en este caso como puerto serie asíncrono. Es en ese puerto donde se conecta los pines de la USART2 permitiendo realizar una muy sencilla conexión entre la PC y la EDU-CIAA. Para la configuración de el puerto, se utilizará la librería LPCOpen === Configurar el SCU === Se deben configurar los pines para ser usados por la USART, en su modo asincrónico solo utiliza dos señales RX y TX, estas serán las que se deberan configurar en la SCU. Para evitar anular un dispositivo por ser requerido los pines para otra función, este microcontrolador mapea en varios pines cada linea de la USART, en el caso de la USART2 tenemos las siguientes opciones ||U2_TXD ||en los pines P1_15, P2_10, P7_1, PA_1|| ||U2_RXD ||en los pines P1_16, P2_11, P7_2, PA_2|| En el momento de rutear la placa se eligió la dupla P7_1 y P7_2 como los pines para ser unidos al FTDI2232, eso obliga a seleccionar esos pines como la salida para la UART {{attachment:uart_1.png | "uart_1.png" | width="60%" }} {{{ Chip_SCU_PinMux(7,1,0,FUNC6); /* P7_1: UART2 TXD */ Chip_SCU_PinMux(7,2,0,FUNC6); /* P7_2: UART2 RXD */ }}} === Configurar el Periférico === Como segunda fase, se encuentra la configuración del propio dispositivo en este caso se deberá * Inicializar la UART {{{ void Chip_UART_Init(LPC_USART_T *pUART); }}} * Configurar velocidad de transmisión {{{ Status Chip_UART_SetBaud(LPC_USART_T *pUART,uint32_t baudrate); }}} * Configurar la FIFO {{{ STATIC INLINE void Chip_UART_SetupFIFOS(LPC_USART_T *pUART,uint32_t fcr);}}} Donde fcr se deberá configurar de la siguiente forma UART_FCR_FIFO_EN para habilitar la FIFO y UART_FCR_TRG_LEV0 para generar evento por cada byte recibido Todas estas acciones se realizan sobre el registro FCR, este registro es utilizado para configurar la FIFO, se muestra a continuación las distintas opciones que posee,(extraído del manual del usuario) {{attachment:uartfcr_svg.png | "uartfcr_svg.png" | width="40%" }} * Habilitar la Transmisión {{{ STATIC INLINE void Chip_UART_TXEnable(LPC_USART_T *pUART); }}} === Uso de la UART === Una vez habilitada y en funcionamiento, se podrá enviar o leer los bytes recibido por medio de dos funciones de la LPCOpen * Enviar un byte {{{STATIC INLINE void Chip_UART_SendByte (LPC_USART_T *pUART, uint8_t data); }}} * Recibir un byte {{{STATIC INLINE uint8_t Chip_UART_ReadByte (LPC_USART_T *pUART);}}}