Regreso a lo básico: El receptor/transmisor asíncrono universal (UART)
Este resumen técnico explica algunos detalles de bajo nivel de la extendida -incluso podría decirse que omnipresente- interfaz de comunicación UART.
Información relacionada
- Transmisión de datos conveniente y robusta con RS-422 y RS-485
Probablemente haya pocos entre los ingenieros eléctricos y entusiastas de la electrónica del mundo que no hayan interactuado de alguna manera con una interfaz de receptor/transmisor asíncrono universal (UART). En un mundo en el que la tecnología puede quedarse obsoleta muy rápidamente, hay que reconocer el mérito de quien creó este sencillo esquema de comunicación digital, que existe desde hace décadas y sigue gozando de una inmensa popularidad.
Nota: el término «UART» es bastante vago. Varios aspectos de la interfaz -número de bits de datos, número de bits de parada, niveles lógicos, paridad- pueden adaptarse a las necesidades del sistema. En este artículo, me centraré en las implementaciones de UART que se encuentran comúnmente en las aplicaciones de microcontroladores modernos.
Capacidades y características
Como probablemente sepa, un sistema UART básico proporciona una comunicación robusta, de velocidad moderada y dúplex completo con sólo tres señales: Tx (datos seriales transmitidos), Rx (datos seriales recibidos) y tierra. A diferencia de otros protocolos como SPI e I2C, no se requiere ninguna señal de reloj porque el usuario proporciona al hardware de la UART la información de sincronización necesaria.
En realidad, hay una señal de reloj, pero no se transmite de un dispositivo de comunicación al otro; más bien, tanto el receptor como el transmisor tienen señales de reloj internas que gobiernan cómo se generan los niveles lógicos cambiantes (en el lado de Tx) y se interpretan (en el lado de Rx). Como es lógico, la comunicación UART no funciona si el transmisor y el receptor han sido configurados para frecuencias de transmisión de datos diferentes. Además, las señales de reloj internas deben ser 1) suficientemente precisas en relación con la frecuencia esperada y 2) suficientemente estables a lo largo del tiempo y la temperatura.
Términos clave
Repasemos algunos términos y, de paso, cubriremos más características de la UART:
- Bit de inicio: El primer bit de una transmisión UART de un byte. Indica que la línea de datos está saliendo de su estado de reposo. El estado de reposo es típicamente lógico alto, por lo que el bit de inicio es lógico bajo.
- El bit de inicio es un bit de sobrecarga; esto significa que facilita la comunicación entre el receptor y el transmisor, pero no transfiere datos significativos.
- Bit de parada: El último bit de una transmisión UART de un byte. Su nivel lógico es el mismo que el estado de reposo de la señal, es decir, lógico alto. Se trata de otro bit de sobrecarga.
- Velocidad en baudios: La velocidad aproximada (en bits por segundo, o bps) a la que se pueden transferir los datos. Una definición más precisa es la frecuencia (en bps) correspondiente al tiempo (en segundos) necesario para transmitir un bit de datos digitales. Por ejemplo, con un sistema de 9600 baudios, un bit requiere 1/(9600 bps) ≈ 104,2 µs. El sistema no puede transferir realmente 9600 bits de datos significativos por segundo porque se necesita tiempo adicional para los bits de sobrecarga y quizás para los retrasos entre las transmisiones de un byte.
- Bit de paridad: Un bit de detección de errores que se añade al final del byte. Hay dos tipos: «paridad impar» significa que el bit de paridad será lógicamente alto si el byte de datos contiene un número par de bits lógicamente altos, y «paridad par» significa que el bit de paridad será lógicamente alto si el byte de datos contiene un número impar de bits lógicamente altos. Esto puede parecer contradictorio, pero la idea es que el bit de paridad asegure que el número de bits lógicamente altos sea siempre par (para la paridad par) o impar (para la paridad impar). Así, si se utiliza paridad par y el byte tiene tres bits lógicos altos, el bit de paridad será lógico alto, de modo que el número total de bits lógicos altos en los datos transmitidos (es decir El número total de bits lógicos altos en los datos transmitidos (es decir, el propio byte más el bit de paridad) es par.
- Al forzar que el número de bits lógicos altos sea siempre par (para la paridad par) o impar (para la paridad impar), el bit de paridad proporciona un mecanismo crudo de detección de errores: si un bit se invierte en alguna parte del proceso de transmisión, el número de bits lógicos altos no coincidirá con el modo de paridad elegido. Por supuesto, la estrategia se rompe si se invierten dos bits, por lo que el bit de paridad está lejos de ser a prueba de balas. Si tiene una necesidad seria de comunicación sin errores, le recomiendo un CRC.
Sincronización y muestreo
Los datos digitales estándar no tienen sentido sin un mecanismo de sincronización de algún tipo. El siguiente diagrama muestra por qué:
Una señal de datos típica es simplemente un voltaje que transita entre un estado lógico bajo y un estado lógico alto. El receptor puede convertir correctamente estos estados lógicos en datos digitales sólo si sabe cuándo muestrear la señal. Esto puede lograrse fácilmente utilizando una señal de reloj separada; por ejemplo, el transmisor actualiza la señal de datos en cada flanco ascendente del reloj y, a continuación, el receptor muestrea los datos en cada flanco descendente.
Sin embargo, como implica el nombre «receptor/transmisor asíncrono universal», la interfaz UART no utiliza una señal de reloj para sincronizar los dispositivos Tx y Rx. Entonces, ¿cómo sabe el receptor cuándo debe muestrear la señal de datos del transmisor?
El transmisor genera un flujo de bits basado en su señal de reloj, y luego el objetivo del receptor es utilizar su señal de reloj interna para muestrear los datos entrantes en la mitad de cada período de bits. El muestreo en la mitad del período de bits no es esencial, pero es óptimo, porque el muestreo más cercano al principio o al final del período de bits hace que el sistema sea menos robusto frente a las diferencias de frecuencia de reloj entre el receptor y el transmisor.
La secuencia del receptor comienza con el flanco descendente del bit de inicio. Es entonces cuando se produce el proceso crítico de sincronización. El reloj interno del receptor es completamente independiente del reloj interno del transmisor; en otras palabras, este primer flanco descendente puede corresponder a cualquier punto del ciclo de reloj del receptor:
Para garantizar que un flanco activo del reloj del receptor pueda producirse cerca de la mitad del período de bits, la frecuencia del reloj de la tasa de baudios enviada al módulo receptor es mucho mayor (por un factor de 8 o 16 o incluso 32) que la tasa de baudios real.
Digamos que un período de bits corresponde a 16 ciclos de reloj del receptor. En este caso, la sincronización y el muestreo pueden proceder de la siguiente manera:
- El proceso de recepción se inicia con el flanco descendente del bit de inicio.
- El receptor espera 8 ciclos de reloj, para establecer un punto de muestreo que esté cerca de la mitad del período de bits.
- El receptor espera entonces 16 ciclos de reloj, lo que le lleva a la mitad del primer período de bits de datos.
- El primer bit de datos se muestrea y se almacena en el registro de recepción, y luego el módulo espera otros 16 ciclos de reloj antes de muestrear el segundo bit de datos.
- Este proceso se repite hasta que se han muestreado y almacenado todos los bits de datos, y luego el flanco ascendente del bit de parada devuelve la interfaz UART a su estado de reposo.
Conclusión
Este artículo ha cubierto algunos detalles sobre un protocolo de comunicación que quizás hayas utilizado con éxito muchas veces. Es bastante posible implementar una interfaz UART sabiendo muy poco sobre el comportamiento real de las señales y el hardware, pero un poco de conocimiento extra -aparte de la edificación general que tal conocimiento proporciona- puede ser útil cuando su comunicación UART no está funcionando como se esperaba.