UART
Comunicación serial Introducción La electrónica integrada se trata de
interconectar circuitos (procesadores u otros circuitos integrados) para crear un
sistema simbiótico. Para que esos circuitos individuales intercambien su
información, deben compartir un protocolo de comunicación común. Se han
definido cientos de protocolos de comunicación para lograr este intercambio de
datos y, en general, cada uno se puede separar en una de dos categorías: paralelo
o en serie. Paralelo frente a serie Las interfaces paralelas transfieren varios bits al
mismo tiempo. Por lo general, requieren buses de datos. transmitiendo a través de
ocho, dieciséis o más cables. Los datos se transfieren en oleadas enormes y
estrepitosas de 1 y 0's.
Un bus de datos de 8 bits, controlado por un reloj, que transmite un byte por cada pulso de reloj.
Se utilizan 9 cables.
Las interfaces seriales transmiten sus datos, un solo bit a la vez. Estas interfaces pueden operar en
tan solo
un cable, por lo general nunca más de cuatro.
Ejemplo de una interfaz en serie, que transmite un bit por cada pulso de reloj. ¡Solo se requieren 2
cables!
Piense en las dos interfaces como un flujo de automóviles: una interfaz paralela sería la
megacarretera de más de 8 carriles,
mientras que una interfaz en serie se parece más a una carretera rural de dos carriles. Durante un
período de tiempo determinado, la megacarretera potencialmente lleva a más personas a sus
destinos, pero esa vía rural de dos carriles cumple su propósito.
y cuesta una fracción de los fondos para construir.
La comunicación paralela ciertamente tiene sus beneficios. Es rápido, sencillo y relativamente fácil
de
implementar. Pero requiere muchas más líneas de entrada / salida (E / S). Si alguna vez ha tenido
que mover un proyecto
desde un Arduino Uno básico hasta un Mega, sabes que las líneas de E / S en un microprocesador
pueden ser preciosas
y pocos. Por lo tanto, a menudo optamos por la comunicación en serie, sacrificando la velocidad
potencial por el espacio de los pines.
Serie asincrónica
A lo largo de los años, se han elaborado decenas de protocolos en serie para satisfacer las
necesidades particulares de
sistemas. USB (bus serie universal) y Ethernet son algunos de los sistemas informáticos más
conocidos
interfaces seriales. Otras interfaces seriales muy comunes incluyen SPI, I2C y el estándar serial que
estamos
aquí para hablar de hoy. Cada una de estas interfaces seriales se puede clasificar en uno de dos
grupos:
sincrónico o asincrónico.
Una interfaz serial síncrona siempre empareja su (s) línea (s) de datos con una señal de reloj, por lo
que todos los dispositivos en un
El bus serie síncrono comparte un reloj común. Esto hace que sea más sencillo, a menudo más
rápido
transferencia en serie, pero también requiere al menos un cable adicional entre los dispositivos de
comunicación. Ejemplos de
las interfaces síncronas incluyen SPI e I2C.
Asíncrono significa que los datos se transfieren sin el apoyo de una señal de reloj externa. Esta
El método de transmisión es perfecto para minimizar los cables requeridos y los pines de E / S,
pero significa que
Necesito hacer un esfuerzo adicional para transferir y recibir datos de manera confiable. El
protocolo serial que seremos
discutiendo en este tutorial es la forma más común de transferencias asincrónicas. Es tan común,
de hecho,
que cuando la mayoría de la gente dice "serial", están hablando de este protocolo (algo que
probablemente notará
a lo largo de este tutorial).
El protocolo serial sin reloj que discutiremos en este tutorial se usa ampliamente en sistemas
integrados
electrónica. Si está buscando agregar un módulo GPS, Bluetooth, XBee, pantallas LCD en serie o
muchos otros
dispositivos externos a su proyecto, probablemente necesitará sacar algo de serial-fu.
Lectura sugerida
Este tutorial se basa en algunos conceptos de electrónica de nivel inferior, que incluyen:
• Cómo leer un esquema
• Analógico frente a digital
• Niveles lógicos
• Binario
• Hexadecimal
• ASCII
Si no está muy familiarizado con ninguno de esos conceptos, considere revisar esos enlaces.
Ahora bien, emprendamos un viaje en serie ...
Reglas de serial
El protocolo serial asincrónico tiene una serie de reglas integradas, mecanismos que ayudan a
garantizar
y transferencias de datos sin errores. Estos mecanismos, que obtenemos para evitar la señal de
reloj externo,
están:
• Bits de datos,
• Bits de sincronización,
• Bits de paridad,
• y velocidad en baudios.
A través de la variedad de estos mecanismos de señalización, encontrará que no existe una única
forma de enviar datos
en serie. El protocolo es altamente configurable. La parte fundamental es asegurarse de que
ambos dispositivos en un
El bus serie está configurado para utilizar exactamente los mismos protocolos.
Tasa de baudios
La velocidad en baudios especifica qué tan rápido se envían los datos a través de una línea serial.
Por lo general, se expresa en unidades de bits por segundo (bps). Si invierte la velocidad en
baudios, puede averiguar cuánto tiempo se tarda en transmitir un solo
poco. Este valor determina cuánto tiempo el transmisor mantiene una línea serial alta / baja o en
qué período
dispositivo receptor muestrea su línea.
Las velocidades en baudios pueden tener casi cualquier valor dentro de lo razonable. El único
requisito es que ambos dispositivos funcionen
a la misma velocidad. Una de las velocidades en baudios más comunes, especialmente para cosas
simples donde la velocidad no es
crítico, es 9600 bps. Otros baudios "estándar" son 1200, 2400, 4800, 19200, 38400, 57600 y
115200.
Cuanto más alta es la velocidad en baudios, más rápido se envían / reciben los datos, pero existen
límites en cuanto a la velocidad a la que se pueden enviar los datos.
transferido. Por lo general, no verá velocidades superiores a 115200; eso es rápido para la mayoría
de los microcontroladores. Obtener
demasiado alto, y comenzará a ver errores en el extremo receptor, ya que los relojes y los
períodos de muestreo simplemente no pueden
Mantenga.
Enmarcando los datos
Cada bloque (generalmente un byte) de datos transmitidos se envía en realidad en un paquete o
trama de bits. Los marcos son
creado agregando sincronización y bits de paridad a nuestros datos.
Un marco en serie. Algunos símbolos de la trama tienen tamaños de bits configurables.
Entremos en los detalles de cada una de estas piezas del marco.
Fragmento de datos
La verdadera esencia de cada paquete en serie son los datos que transporta. Llamamos
ambiguamente a este bloque de datos un
chunk, porque su tamaño no se indica específicamente. La cantidad de datos en cada paquete se
puede establecer en
cualquier cosa de 5 a 9 bits. Ciertamente, el tamaño de datos estándar es su byte básico de 8 bits,
pero otros tamaños tienen
sus usos. Un fragmento de datos de 7 bits puede ser más eficiente que el de 8, especialmente si
solo está transfiriendo datos de 7 bits
Caracteres ASCII.
Después de acordar la longitud de un carácter, ambos dispositivos seriales también tienen que
estar de acuerdo con el endianness de su
datos. ¿Se envían los datos del bit más significativo (msb) al mínimo, o viceversa? Si no se indica lo
contrario, puede
Por lo general, se asume que los datos se transfieren primero con el bit menos significativo (lsb).
Bits de sincronización
Los bits de sincronización son dos o tres bits especiales transferidos con cada fragmento de datos.
Ellos son las
bit de inicio y bit (s) de parada. Fieles a su nombre, estos bits marcan el comienzo y el final de un
paquete.
Siempre hay un solo bit de inicio, pero el número de bits de parada se puede configurar en uno o
dos
(aunque normalmente se deja en uno).
El bit de inicio siempre se indica mediante una línea de datos inactiva que va de 1 a 0, mientras
que los bits de parada
transición de nuevo al estado inactivo manteniendo la línea en 1.
Bits de paridad
La paridad es una forma de verificación de errores de bajo nivel muy simple. Viene en dos sabores:
par o impar. Para
producir el bit de paridad, los 5-9 bits del byte de datos se suman y la uniformidad de la suma
decide
si el bit está establecido o no. Por ejemplo, suponiendo que la paridad se establece en par y se
agrega a un dato
byte como 0b01011101, que tiene un número impar de unos (5), el bit de paridad se establecería
en 1.
Por el contrario, si el modo de paridad se establece en impar, el bit de paridad sería 0.
La paridad es opcional y no se utiliza mucho. Puede ser útil para transmitir a través de medios
ruidosos,
pero también ralentizará un poco la transferencia de datos y requiere que tanto el remitente
como el receptor implementen
manejo de errores (por lo general, los datos recibidos que fallan deben reenviarse).
9600 8N1 (un ejemplo)
9600 8N1: 9600 baudios, 8 bits de datos, sin paridad y 1 bit de parada: es uno de los sistemas
seriales más utilizados.
protocolos. Entonces, ¿cómo se verían uno o dos paquetes de datos 9600 8N1? ¡Pongamos un
ejemplo!
Un dispositivo que transmite los caracteres ASCII "O" y "K" tendría que crear dos paquetes de
datos. los
El valor ASCII de O (en mayúsculas) es 79, que se descompone en un valor binario de 8 bits de
01001111, mientras que el valor binario de K es 01001011. Todo lo que queda es agregar bits de
sincronización.
No se indica específicamente, pero se supone que los datos se transfieren primero con el bit
menos significativo. Date cuenta cómo
cada uno de los dos bytes se envía a medida que se lee de derecha a izquierda.
Dado que estamos transfiriendo a 9600 bps, el tiempo invertido en mantener cada uno de esos
bits alto o bajo es 1 / (9600
bps) o 104 µs por bit.
Por cada byte de datos transmitidos, en realidad se envían 10 bits: un bit de inicio, 8 bits de datos
y un
detener un poco. Entonces, a 9600 bps, en realidad estamos enviando 9600 bits por segundo o
960 (9600/10) bytes por
segundo.
Ahora que sabe cómo construir paquetes seriales, podemos pasar a la sección de hardware. Allí
¡Veremos cómo esos 1 y 0 y la velocidad en baudios se implementan en un nivel de señal!
Cableado y hardware
Un bus serie consta de solo dos cables: uno para enviar datos y otro para recibir. Como tal, serial
los dispositivos deben tener dos pines seriales: el receptor, RX, y el transmisor, TX.
Es importante tener en cuenta que esas etiquetas RX y TX son con respecto al dispositivo en sí.
Entonces el RX de
un dispositivo debe ir a la TX del otro y viceversa. Es extraño si estás acostumbrado a ligar
VCC a VCC, GND a GND, MOSI a MOSI, etc., pero tiene sentido si lo piensa bien. los
El transmisor debe estar hablando con el receptor, no con otro transmisor.
Una interfaz en serie donde ambos dispositivos pueden enviar y recibir datos es full-duplex o half-
duplex.
Full-duplex significa que ambos dispositivos pueden enviar y recibir simultáneamente.
Comunicación semidúplex
significa que los dispositivos seriales deben turnarse para enviar y recibir.
Algunos buses seriales pueden salirse con la suya con una sola conexión entre un envío y una
recepción.
dispositivo. Por ejemplo, nuestras pantallas LCD habilitadas en serie son todo oídos y realmente no
tienen ningún dato para retransmitir
al dispositivo de control. Esto es lo que se conoce como comunicación serial simplex. Todo lo que
necesitas es un
un solo cable desde la transmisión del dispositivo maestro hasta la línea RX del oyente.
Implementación de hardware
Hemos cubierto la serie asincrónica desde un punto de vista conceptual. Sabemos qué cables
necesitamos. Pero como esta
comunicación serial realmente implementada a nivel de señal? En realidad, de diversas formas.
Hay todos
tipos de estándares para la señalización en serie. Veamos algunos de los hardware más populares
implementaciones de serie: nivel lógico (TTL) y RS-232.
Cuando los microcontroladores y otros circuitos integrados de bajo nivel se comunican en serie,
generalmente lo hacen en un TTL
(transistor-transistor lógica) nivel. Existen señales en serie TTL entre el suministro de voltaje de un
microcontrolador
rango - generalmente 0V a 3.3V o 5V. Una señal en el nivel VCC (3.3V, 5V, etc.) indica una línea
inactiva,
un bit de valor 1, o un bit de parada. Una señal de 0V (GND) representa un bit de inicio o un bit de
datos de valor 0.
RS-232, que se puede encontrar en algunas de las computadoras y periféricos más antiguos, es
como serie TTL
volteado sobre su cabeza. Las señales RS-232 generalmente oscilan entre -13V y 13V, aunque la
especificación permite
cualquier cosa desde +/- 3V a +/- 25V. En estas señales, un voltaje bajo (-5V, -13V, etc.) indica que
línea inactiva, un bit de parada o un bit de datos de valor 1. Una señal RS-232 alta significa un bit
de inicio o un valor 0
bit de datos. Eso es lo opuesto a la serie TTL.
Entre los dos estándares de señales en serie, TTL es mucho más fácil de implementar en circuitos
integrados.
Sin embargo, los niveles de voltaje bajo son más susceptibles a pérdidas a través de líneas de
transmisión largas. RS-232,
o estándares más complejos como RS-485, se adaptan mejor a transmisiones en serie de largo
alcance.
Cuando conecta dos dispositivos en serie juntos, es importante asegurarse de que sus voltajes de
señal
emparejar. No puede conectar directamente un dispositivo serie TTL con un bus RS-232. Tendrás
que cambiar
esas señales!
Continuando, exploraremos la herramienta que utilizan los microcontroladores para convertir sus
datos en un bus paralelo ay
desde una interfaz en serie. UARTs!
UART
La última pieza de este rompecabezas en serie es encontrar algo para crear los paquetes en serie y
controlar
esas líneas de hardware físico. Ingrese a la UART.
Un receptor / transmisor asíncrono universal (UART) es un bloque de circuitos responsable de
implementación de comunicación serial. Esencialmente, el UART actúa como intermediario entre
paralelo
e interfaces seriales. En un extremo de la UART hay un bus de unas ocho líneas de datos (más algo
de control
pines), en el otro están los dos cables seriales: RX y TX.
Interfaz UART súper simplificada. Paralelo en un extremo, serial en el otro.
Los UART existen como circuitos integrados independientes, pero se encuentran más
comúnmente dentro de microcontroladores. Vas a
tiene que revisar la hoja de datos de su microcontrolador para ver si tiene UART. Algunos no
tienen ninguno, algunos tienen
uno, algunos tienen muchos. Por ejemplo, el Arduino Uno, basado en el "viejo fiel" ATmega328,
tiene
solo un único UART, mientras que el Arduino Mega, construido sobre un ATmega2560, tiene la
friolera de cuatro UART.
Como dictan la R y la T en el acrónimo, los UART son responsables tanto del envío como de la
recepción en serie
datos. En el lado de la transmisión, un UART debe crear el paquete de datos, agregando bits de
sincronización y paridad, y
envíe ese paquete por la línea TX con una sincronización precisa (de acuerdo con la velocidad en
baudios establecida). En la recepción
Al final, el UART tiene que muestrear la línea RX a velocidades de acuerdo con la velocidad en
baudios esperada, seleccione la sincronización
bits y escupir los datos.
Diagrama de bloques UART interno (cortesía de la hoja de datos Exar ST16C550)
Los UART más avanzados pueden arrojar sus datos recibidos a un búfer, donde pueden
permanecer hasta que
microcontrolador viene a buscarlo. Los UART generalmente publicarán sus datos almacenados en
búfer en un primer en entrar, primero en salir
(FIFO) base. Los búferes pueden ser tan pequeños como unos pocos bits o tan grandes como miles
de bytes.
UART de software
Si un microcontrolador no tiene un UART (o no tiene suficiente), la interfaz serial puede ser
bitbanged, controlada directamente por el procesador. Este es el enfoque de las bibliotecas de
Arduino
Software Toma de serie. El bit-banging requiere un uso intensivo del procesador y, por lo general,
no es tan preciso como un UART, pero
funciona en caso de apuro!
Errores comunes
Eso es todo lo que hay en la comunicación en serie. Me gustaría dejarles algunos errores comunes.
que son fáciles de realizar para un ingeniero de cualquier nivel de experiencia:
RX a TX, TX a RX
Parece bastante simple, pero es un error que sé que he cometido más de un par de veces. Tanto
como quieras
sus etiquetas coincidan, asegúrese siempre de cruzar las líneas RX y TX entre los dispositivos
seriales.
FTDI Programación básica de un Pro Mini. ¡Tenga en cuenta que RX y TX están cruzados!
Al contrario de lo que advertiría el estimado Dr. Egon Spengler, cruce los arroyos.
Discrepancia en la tasa de baudios
Las velocidades en baudios son como los lenguajes de la comunicación en serie. Si dos dispositivos
no hablan al mismo tiempo
velocidad, los datos pueden malinterpretarse o perderse por completo. Si todo el dispositivo
receptor ve en su
la línea de recepción es basura, verifique que las velocidades en baudios coincidan
Datos transmitidos a 9600 bps, pero recibidos a 19200 bps. Discrepancia en baudios = basura.
Contención de autobuses
La comunicación en serie está diseñada para permitir que solo dos dispositivos se comuniquen a
través de un bus en serie. Si
más de un dispositivo está tratando de transmitir en la misma línea serial, podría encontrarse con
una contención de bus.
Dun dun dun….
Por ejemplo, si está conectando un módulo GPS a su Arduino, puede simplemente conectar el
módulo
TX alinea la línea RX de Arduino. Pero ese pin Arduino RX ya está conectado al pin TX del
Convertidor de USB a serie, que se utiliza siempre que programa el Arduino o utiliza el Monitor
serie.
Esto configura la situación potencial en la que tanto el módulo GPS como el chip FTDI están
tratando de transmitir en
la misma línea al mismo tiempo.
Dos transmisores que envían a un solo receptor establecen la posibilidad de contención de bus.
¡Dos dispositivos que intentan transmitir datos al mismo tiempo, en la misma línea, es malo! En el
"mejor", ninguno de los
los dispositivos podrán enviar sus datos. En el peor de los casos, las líneas de transmisión de
ambos dispositivos fallan (aunque es raro,
y generalmente protegido contra).
Puede ser seguro conectar varios dispositivos de recepción a un solo dispositivo de transmisión.
Realmente no está a la altura
especificación y probablemente mal visto por un ingeniero empedernido, pero funcionará. Por
ejemplo, si estás
conectando una pantalla LCD en serie a un Arduino, el enfoque más fácil puede ser conectar el
módulo LCD
Línea RX a la línea TX de Arduino. El TX de Arduino ya está conectado al programador USB
Línea RX, pero eso todavía deja solo un dispositivo en control de la línea de transmisión.
La distribución de una línea TX como esta puede ser peligrosa desde la perspectiva del firmware,
porque no se puede
Elija y elija qué dispositivo escucha qué transmisión. La pantalla LCD terminará recibiendo datos no
deseados.
para él, lo que podría ordenarle que entre en un estado desconocido.
En general, ¡un bus en serie, dos dispositivos en serie!