Introducción detallada a la comunicación en serie (UART)

El receptor/transmisor asíncrono universal, conocido habitualmente como UART, es un receptor/transmisor asíncrono.

En primer lugar, veamos en qué consisten la comunicación síncrona y la asíncrona. La comunicación síncrona significa que, después de que el emisor envía los datos, espera a que el receptor le envíe una respuesta antes de enviar el siguiente paquete de datos; la comunicación asíncrona significa que, después de que el emisor envía los datos, espera a que el receptor los reciba. La parte envía una respuesta y, a continuación, indica el método de comunicación del siguiente paquete de datos. En otras palabras, la comunicación síncrona es un método bloqueante, mientras que la comunicación asíncrona es un método no bloqueante. Entre los protocolos comunes de bus de comunicación, I2C y SPI pertenecen a la comunicación síncrona, mientras que UART pertenece a la comunicación asíncrona. Las dos partes en la comunicación síncrona deben establecer primero la sincronización, es decir, los relojes de ambas partes deben ajustarse a la misma frecuencia, y el emisor y el receptor deben enviar y recibir continuamente un flujo continuo de bits de sincronización. Al enviar caracteres en la comunicación asíncrona, el extremo emisor puede comenzar a enviar caracteres en cualquier momento. Por lo tanto, en la comunicación UART, el bit de inicio y el bit de parada de los datos son esenciales.

capa de hardware

En este artículo no se explicará en detalle el estándar RS-232, de uso generalizado. Lo importante es que las líneas Tx y Rx del dispositivo correspondiente deben estar correctamente emparejadas.

Capa de protocolo

En la capa de protocolo se establece el contenido del paquete de datos, que consta de un bit de inicio, los datos del cuerpo, un bit de comprobación y un bit de parada. Para poder enviar y recibir datos con normalidad, ambas partes que se comunican deben acordar el formato del paquete de datos.

Velocidad de transmisión: Dado que en la comunicación asíncrona no hay señal de reloj, los dos dispositivos de comunicación deben acordar la velocidad de transmisión. Las más habituales son 4800, 9600, 115200, etc.

Señales de inicio y fin en la comunicación: Un paquete de datos en la comunicación en serie comienza con la señal de inicio y termina con la señal de fin. La señal de inicio del paquete de datos viene representada por un bit de datos de valor lógico 0, mientras que la señal de fin del paquete de datos puede representarse mediante 0,5; 1; 1,5 o 2 bits de datos de valor lógico 1, siempre que ambas partes estén de acuerdo.

Datos válidos: Inmediatamente después del bit de inicio del paquete de datos se encuentra el contenido principal de los datos que se van a transmitir, también denominado «datos válidos». La longitud de los datos válidos suele fijarse en 8 o 9 bits.

Comprobación de datos: Tras los datos válidos, hay un dígito de comprobación opcional. Dado que la comunicación de datos es relativamente susceptible a las interferencias externas, lo que provoca desviaciones en los datos transmitidos, se puede añadir un bit de comprobación al proceso de transmisión para resolver este problema. Los métodos de verificación incluyen la paridad impar (impar), la paridad par (par), la paridad 0 (espacio), la paridad 1 (marca) y la ausencia de paridad (sin paridad).

La paridad impar exige que el número de “1” en los datos válidos y en los bits de comprobación sea impar. Por ejemplo, unos datos válidos de 8 bits son: 01101001. En este caso, hay un total de 4 “1”. Para lograr el efecto de paridad impar, el bit de paridad es un “1”, y los datos finales transmitidos serán 8 bits de datos válidos más 1 bit de control, lo que suma un total de 9 bits. Los requisitos para la paridad par y la paridad impar son exactamente opuestos. El número de “1” en los datos de la trama y en los bits de paridad debe ser par. Por ejemplo, trama de datos: 11001010. En este caso, el número de “1” en la trama de datos es 4, por lo que es par. El dígito de control es “0”. La paridad 0 significa que, independientemente del contenido de los datos válidos, el dígito de control es siempre “0”, mientras que la paridad 1 significa que el dígito de control es siempre “1”.

Análisis del diagrama de bloques funcional del UART

Esta imagen es un diagrama de módulos de modelización UART realizado con System C cuando estaba en la universidad. En cuanto a la parte de la interfaz, los elementos importantes son Tx y Rx (salida y recepción de datos) y clk, que proporciona la señal de reloj inicial al módulo de generación de la velocidad en baudios. En cuanto a la parte del controlador, aquí se utilizan circuitos lógicos para implementar el control específico de la habilitación de salida/recepción, la habilitación del dispositivo, etc.

En los microcontroladores actuales, la parte de control de circuitos digitales está integrada, por lo que ahora solo es necesario manipular los bits correspondientes del registro adecuado para controlar el UART. Tomando como ejemplo el chip STM32F411, en la siguiente figura se muestra el diagrama de bloques del UART:

Módulo de generación de la velocidad en baudios:

El transmisor y el receptor del USART utilizan la misma velocidad de transmisión. La fórmula de cálculo es la siguiente:

Entre ellos, «fck» es el reloj del USART, y «USARTDIV» es un número de punto fijo sin signo almacenado en el registro de velocidad de transmisión (USART_BRR). Los bits DIV_Mantissa[11:0] definen la parte entera de USARTDIV, y los bits DIV_Fraction[3:0] definen la parte fraccionaria de USARTDIV.

Por ejemplo: DIV_Mantissa = 24 (0x18), DIV_Fraction = 10 (0x0A), entonces el valor de USART_BRR es 0x18A; por lo tanto, los dígitos decimales de USARTDIV son 10/16 = 0,625; los dígitos enteros son 24, y el valor final de USARTDIV es 24,625.

Los valores habituales para la velocidad de transmisión son 2400, 9600, 19200 y 115200. A continuación se explica, mediante un ejemplo, cómo configurar el valor del registro para obtener la velocidad en baudios. Sabemos que el USART1 utiliza el reloj del bus APB2, que puede alcanzar hasta 72 MHz, y que los demás USART tienen una frecuencia máxima de 36 MHz. Elegimos el USART1 como ejemplo para la explicación, es decir, fck = 72 MHz. Para obtener una velocidad de transmisión de 115 200 bps, en este caso: 115 200 = 72 000 000 / (16 × USARTDIV), la solución es USARTDIV = 39,0625; se puede calcular que DIV_Fraction = 0,0625 × 16 = 1 = 0x01, DIV_Mantissa = 39 = 0x27; es decir, el valor de USART_BRR debe establecerse en 0x171.

Registro de datos:

Solo son válidos los 9 bits inferiores del registro de datos del UART (USART_DR), y la validez del noveno bit depende de la configuración del bit M del registro de control 1 del UART (USART_CR1). Cuando el bit M es 0, significa que la longitud de la palabra de datos es de 8 bits; un valor de 1 indica una longitud de 9 bits, y por lo general se utiliza una longitud de 8 bits.

USART_DR contiene los datos enviados o recibidos. En realidad, USART_DR contiene dos registros: un TDR (registro de datos de transmisión) en el que se puede escribir, utilizado específicamente para el envío, y un RDR (registro de datos de recepción) en el que se puede leer, utilizado específicamente para la recepción. Al realizar una operación de envío, los datos que se escriben en USART_DR se almacenan automáticamente en el TDR; al realizar una operación de lectura, los datos que se leen en USART_DR se extraen automáticamente del RDR.

Tanto el TDR como el RDR se encuentran entre el bus del sistema y el registro de desplazamiento. La comunicación en serie se transmite bit a bit. Durante el envío, el contenido del TDR se transfiere al registro de desplazamiento de envío y, a continuación, se envía cada bit de los datos del registro de desplazamiento. Durante la recepción, cada bit recibido se almacena secuencialmente en el registro de desplazamiento de recepción y, a continuación, se transfiere al RDR.

El UART admite la transmisión DMA, lo que permite una transmisión de datos a alta velocidad (sin pasar por la CPU). Para habilitar la función DMA del UART, es necesario establecer el bit DMAT del registro USART_CR1 en 1.

Controlador:

El UART cuenta con un transmisor que controla específicamente el envío, un receptor que controla la recepción, así como una unidad de activación, control de interrupciones, etc. Antes de utilizar el UART, es necesario habilitarlo estableciendo en 1 el bit UE del registro USART_CR1. El bit UE se utiliza para activar el reloj que alimenta el puerto serie. La longitud de los datos enviados o recibidos puede ser de 8 o 9 bits, lo cual se controla mediante el bit M del registro USARTT_CR1.

1) Transmisor

Cuando el bit de habilitación de transmisión (TE) del registro USART_CR1 se establece en 1, se inicia la transmisión de datos y los datos contenidos en el registro de desplazamiento de transmisión se envían al pin TX, comenzando por el bit más bajo y terminando por el bit más alto.

La transmisión de una trama de caracteres requiere tres partes: el bit de inicio, la trama de datos y el bit de parada. El bit de inicio es el nivel bajo de un periodo de bit, y el periodo de bit es el tiempo que ocupa cada bit; la trama de datos son los 8 o 9 bits de datos que queremos enviar, y los datos se transmiten empezando por el bit más bajo; el bit de parada es un periodo de tiempo determinado en el que se mantiene el nivel alto.

La longitud de los bits de parada se puede controlar mediante los bits STOP[1:0] del registro de control 2 del UART (USART_CR2), y se pueden seleccionar opcionalmente 0,5; 1; 1,5 y 2 bits de parada. Por defecto, se utiliza 1 bit de parada. Se pueden utilizar 2 bits de parada en el modo USART normal, el modo de un solo cable y el modo módem. En el modo de tarjeta inteligente se utilizan 0,5 y 1,5 bits de parada.

Cuando el bit de habilitación de transmisión (TE) se establece en 1, el transmisor comienza a enviar una trama de inactividad (un nivel alto que indica la longitud de la trama de datos) y, a continuación, los datos que se van a enviar pueden escribirse en el registro USART_DR. Tras escribir los últimos datos, hay que esperar a que el bit TC del registro de estado del UART (USART_SR) pase a 1, lo que indica que la transferencia de datos ha finalizado. Si el bit TCIE del registro USART_CR1 se establece en 1, se genera una interrupción.

A la hora de enviar datos, hay varios indicadores importantes, que son los siguientes:

TE: Habilitación de transmisión.

TXE: El registro de transmisión está vacío; se utiliza al enviar un solo byte.

TC: Transmisión completada; se utiliza al enviar varios bytes de datos.

TXIE: Habilitación de la interrupción de finalización de transmisión.

2) Receptor

Establece el bit RE del registro CR1 en 1 para habilitar la recepción del USART, lo que hace que el receptor comience a buscar el bit de inicio en la línea RX. Una vez determinado el bit de inicio, los datos se almacenan en el registro de desplazamiento de recepción según el estado del nivel de la línea RX. Una vez completada la recepción, los datos del registro de desplazamiento de recepción se transfieren al PDR y se modifica la posición RXNE del registro USART_SR. Se puede generar una interrupción si se establece en 1 el bit RXNEIE del registro USART_CR2.

Al recibir datos, hay varios indicadores importantes, que son los siguientes:

Asunto: Activación de la recepción.

RXNE: El registro de datos de lectura no está vacío.

RXNEIE: Habilitación de la interrupción de finalización de transmisión.

Registro USART_CR1:

Registro USART_CR2:

Registro USART_CR3:

Palabras clave: módulo de puerto serie

↑