¿Qué podría salir mal? Edición en serie asincrónica

Blog

HogarHogar / Blog / ¿Qué podría salir mal? Edición en serie asincrónica

Jan 22, 2024

¿Qué podría salir mal? Edición en serie asincrónica

Es lo más fácil del mundo: datos en serie simples y directos. Es el protocolo de comunicación alternativo para casi todos los sistemas integrados que existen, por lo que es uno que realmente desea utilizar.

Es lo más fácil del mundo: datos en serie simples y directos. Es el protocolo de comunicación alternativo para casi todos los sistemas integrados que existen, por lo que es uno en el que realmente desea trabajar cuando las cosas no funcionan. ¡Y todavía! Cuando más lo necesite, puede descubrir que incluso el serial asincrónico puede costarle algunas horas de depuración y agregar algunas canas a su cuero cabelludo.

En este artículo, cubriré la mayoría (¿todas?) de las cosas que pueden salir mal con los protocolos serie asíncronos y cómo diagnosticar y depurar este método de transferencia de datos, el más útil. El objetivo es hacerle consciente de lo que puede salir mal para que, cuando suceda, pueda solucionarlo sistemáticamente en unos minutos en lugar de perder unas horas.

Imagine que tiene ocho bits de datos que desea enviarme electrónicamente. Si tenemos ocho cables (más tierra) entre nosotros, simplemente puede activar los ocho interruptores y poner voltajes altos o bajos en cada cable. Si estoy en el otro extremo con algunos LED, simplemente leeré cuáles se encienden y listo. Pero ocho cables es mucho cobre. Entonces, decide enviar un bit a la vez, usando solo un cable (más tierra). Esa es la esencia de la comunicación en serie: los bits se envían en serie variando el voltaje en un cable con precisión a lo largo del tiempo.

Suena fácil, pero ahora tenemos que tomar algunas decisiones. ¿Qué tan rápido envías cada bit? ¿Un LED encendido representa un 1 o un 0? ¿Cómo sabré cuándo comienza o termina su mensaje? Y finalmente, si ambos vamos a enviarnos datos entre nosotros, necesitaremos dos cables. ¿Cómo sabemos cuál estoy enviando y cuál estás enviando tú? Cada una de estas opciones es un lugar para hacer las cosas mal y para que aparezcan errores.

Ese último punto, qué cables transmiten datos en qué dirección, es sorprendentemente una fuente común de confusión, por lo que es un buen lugar para comenzar a depurar.

"RX" y "TX" significan "recibir" y "transmitir" respectivamente. La mayoría de los sistemas de comunicaciones en serie tendrán uno de cada uno. A menudo, la configuración es algo como esto: te encontrarás conectando "GND" en un dispositivo a "GND" del otro. Tal vez también compartan un riel eléctrico, por lo que conectarás el "VCC" de uno al "VCC" del otro. Y luego, sucesivamente, conectará "RX" en un dispositivo hasta "RX" en el otro.

Y ese es el error número uno. Ambos dispositivos esperan recibir datos en su línea "RX", por lo que ambos simplemente se quedan sentados esperando mientras las dos líneas "TX" terminan hablando entre sí. No, la forma “correcta” de hacerlo es conectar el puerto “RX” de un dispositivo al puerto “TX” del otro y viceversa. Eso es simplemente lógico, ¿verdad? Para ayudarle a recordar esto, a veces "TX" estará etiquetado como "TXD", donde la "D" significa "dispositivo" y se supone que eso le recuerda que está mirando las cosas desde la perspectiva de este dispositivo.

Como quiera que lo llames, conectar un puerto llamado "TX" a un puerto llamado "RX" causa problemas en los programas CAD modernos, donde nombras la red en lugar de los puertos individuales. ¿Cómo se llama un cable que conecta los pines “GND” de ambos dispositivos? "GND" es un buen nombre. ¿Cómo se llama el cable que conecta “TX” con “RX”? ¿Qué tal el que conecta “RX” con “TX”? Reina la confusión.

(Tenga en cuenta que SPI, que tiene sus propios problemas que abordaremos la próxima vez, llama a estas líneas “entrada maestra, salida esclava” y “salida maestra, entrada esclava”. Los nombres de las líneas son consistentes, y si sabe qué dispositivo estás mirando, sabes instantáneamente en qué dirección fluyen los datos. Eso es mucho mejor).

Entonces, la primera pregunta de depuración que debe hacerse es si ha cruzado correctamente las líneas de señal. E incluso si es así, intente intercambiarlos de todos modos porque incluso si no está confundido, no puede estar seguro de que el ingeniero que está delante de usted no lo esté. (Lo hemos visto suceder).

Tenemos el cableado correcto, entonces, ¿qué tal la velocidad a la que envía (y recibe) datos? Esto es importante, porque si ve un voltaje alto en su cable durante un tiempo, necesita saber cuántos bits se supone que representa ese "tiempo". Si te envío cuatro ceros, verás un voltaje constante durante el doble de tiempo que si te envío dos, pero tenemos que acordar una base de tiempo para que puedas estar seguro de que no solo envié dos ceros u ocho. .

La cantidad de señales de bits enviadas por segundo se llama velocidad en baudios y es algo en lo que tenemos que estar de acuerdo. Esto significa que tanto el remitente como el receptor deben tener relojes bastante precisos a bordo para que puedan mantener la misma hora.

Esté atento a velocidades en baudios como 2400, 9600, 38400 y 115200. Si no conoce la velocidad en baudios de su dispositivo objetivo, no está de más probarlas todas.

Hay un truco inteligente que usted o su dispositivo pueden utilizar si no conocen la velocidad en baudios de antemano. Si recibe algunos bytes de datos, puede realizar un seguimiento del período de tiempo que el voltaje es constante en la línea y encontrar el mínimo común denominador. Por ejemplo, si ve un voltaje alto durante 208 μs, luego un bajo durante 104 μs y finalmente un alto durante 312 μs, es una buena apuesta que un período de bit tenga una duración de 104 μs, y eso corresponde a 9600 baudios. Si es más como 8 μs, son 115.200 baudios. Resuelto.

Tiene las líneas "RX" y "TX" rectas y ha calculado la velocidad en baudios, por lo que está en el camino correcto para recibir y transmitir datos. La cuestión ahora es cómo interpretarlo. Dicho de otra manera, ¿un alto voltaje es un 1 o un alto voltaje es un 0?

No pensarías que esto sería confuso, pero, por desgracia, la historia conspira contra nosotros. RS-232, el estándar serial más popular de la antigüedad, usaba voltajes positivos y negativos (de 3 V a 15 V y de -3 V a -15 V) para señalar 0 y 1 respectivamente. Sí, eso es correcto. Se envía un 1 con un voltaje negativo y el voltaje más alto corresponde a un 0.

Vayamos al presente, donde la señalización unilateral es más común. Hoy en día, el voltaje más alto (3,3 o 5 V) se toma como 1 y el voltaje bajo (0 V) se toma como cero. Entonces la respuesta a la pregunta de cómo interpretar los voltajes como números es: depende. La señalización moderna, pero aún de estilo RS-232, utilizará 0 V y 5 V como 1 y 0, mientras que la serie TTL hará todo lo contrario.

La buena noticia es que es posible distinguir estos dos casos con un LED (o un multímetro si lo prefiere). Tanto el sistema RS-232 como el TTL comienzan con el puerto "TX" de un dispositivo enviando un nivel 1 de forma predeterminada. Si la línea "TX" está inactiva en alto, estás viendo un sistema TTL. Si el ralentí es bajo, lo más probable es que esté utilizando la polaridad RS-232.

Si tienes un cable FTDI USB a serie, o uno de los dispositivos clonados como el CP2102 o el..., estás 100% en el mundo serie TTL. Buenas noticias. Sin embargo, si necesita interactuar con otro dispositivo que utilice niveles RS-232, tiene un poco de trabajo por hacer.

Aquí hay un circuito convertidor de RS-232 a TTL que funciona para velocidades de baudios modestas e incluso se encarga del cambio de nivel de voltaje por usted. Por lo tanto, puede conectar sus circuitos ESP8266 sensibles a 3,3 V a una antigua impresora de línea de -15 V a 15 V y todo funcionará bien. Este es uno para tu cinturón de herramientas. No cumple estrictamente con las normas, porque no oscila a -12 V (o lo que sea), pero tiene la polaridad correcta y funcionará con la mayoría de los dispositivos.

Si necesita algo para interactuar con equipos RS-232 antiguos, puede elegir un chip (MAX-232 o equivalente) que cree voltajes más altos para usted. De hecho, si abres un convertidor RS-232, a veces verás un chip serie USB-TTL emparejado con un MAX-232. (Los baratos simplemente invierten la señal y no son mejores que el circuito de dos transistores anterior. Estás advertido).

No se pueden simplemente enviar voltajes por el cable. Hay que saber cuándo comienza y termina la señal, y qué datos buscar. En conjunto, esto se llama encuadre. La mayoría de los sistemas en serie utilizan los mismos marcos “8N1”, pero cuando no lo hacen, vale la pena conocerlos. Estos tres caracteres corresponden al número de bits enviados a la vez, el bit de paridad y el número de bits de parada, respectivamente. Desarmemos eso.

La cantidad de bits de datos enviados por paquete se explica por sí misma y la mayoría de los protocolos en serie envían datos un byte a la vez, por lo que esto no suele ser un problema. Pero en equipos realmente antiguos, a veces verás siete bits; después de todo, ASCII solo usa siete bits. De todos modos, el número de bits por paquete es el “8” en “8N1”.

Ahora pensemos en los bits de “inicio” y “detención”. Debido a que el puerto “TX” del dispositivo emisor (y el puerto “RX” del receptor) está inactivo alto (para TTL), no puede comenzar la transmisión de datos con un 1. ¿Cómo sabría si se envió? Entonces, un bit de inicio, siempre bajo, inicia el paquete de datos.

Si envía un byte, termina con la línea alta durante mucho tiempo y es bastante fácil saber dónde termina. Si envía dos bytes y el segundo comienza con un bit de inicio bajo, debe enviar al menos un bit de parada alto al final del primer paquete. (Cuando envía un byte, el bit de parada se mezcla con el estado alto de fondo de la línea TX). Si está contando, son un mínimo de diez señales para enviar ocho bits: un bit de inicio y al menos un bit de parada. . Pero algunos sistemas envían dos bits de parada, por lo que nuevamente debes especificar. El número de bits de parada es el “1” en “8N1”.

Aquí está el mensaje “*\n” – Estrella y avance de línea (ASCII 10) – que se envía con uno y dos bits de parada respectivamente. En binario, eso es 00101010 00001010. Los bits de parada (uno y dos respectivamente) aparecen entre estos dos bytes, y también hay un único bit de inicio antes de cada uno. A ver si puedes descifrar eso.

Y esto nos lleva al "bit de paridad" en el medio, que es alto o bajo dependiendo de si el número de unos en los datos es par o impar. Y la elección de codificar par como 1 o impar como 1 es arbitraria. Para aprovechar el bit de paridad como mecanismo de detección de errores, necesita saber cuál es cuál, por lo que se especifica como "N" para ausencia de paridad, o "E" u "O" para paridad par e impar, respectivamente. Cuando hay un bit de paridad, se agrega después de los datos, justo antes de los bits de parada. El bit de paridad hace que el número de unos en el byte sea par o impar, respectivamente, que es el esquema de detección de errores. Si está utilizando paridad par y ve tres unos, incluido el bit de paridad, sabrá que hubo un error de transmisión.

Hay una última confusión que afortunadamente casi nunca verás: la cuestión de la endianidad. Los datos numéricos en serie podrían enviarse con el bit menos significativo primero en el tiempo o con el más significativo. La buena noticia es que los datos en serie TTL y RS-232 casi siempre son el bit menos significativo primero (o "little-endian"), pero algunos otros protocolos en serie, como los protocolos de Internet, envían sus datos en serie primero. La mala noticia es que los osciloscopios muestran los datos de izquierda a derecha a medida que llegan, y escribimos los números con el bit más significativo primero, por lo que tendrás que invertir los patrones de bits en tu cabeza al leer las tomas del osciloscopio. (Esos cuatro ceros en el carácter de avance de línea deberían ayudarle a orientarse).

A estas alturas ya tienes todas las señales aclaradas. Uno pensaría que no hay nada más que pueda salir mal. ¡Pero espera! Debido a que las comunicaciones en serie han evolucionado con el tiempo, existen dos (tal vez tres) formas posibles de señalar el final de una línea de datos. El problema de los finales de línea le resulta familiar si ha copiado archivos de texto en máquinas Unix, Windows y MacOS más antiguas. Cada uno (naturalmente) utiliza un estándar diferente. La confusión entre estas tres tradiciones también ha invadido el mundo de los dispositivos integrados. Si el programa receptor está esperando uno de estos y usted está enviando el otro, no sabrá cuándo ha terminado y simplemente se quedará ahí.

La versión corta es que es posible que necesite enviar un avance de línea (LF, ASCII 10) o un retorno de carro (CR, ASCII 13) o ambos (CR+LF) antes de que responda el otro extremo. La mayoría de los programas de terminal le permitirán configurar esto sobre la marcha, tanto para enviar como para recibir, por lo que no es gran cosa solucionar el problema manualmente. Pero si ya no está seguro de lo que está haciendo el código de su microcontrolador y no puede ver nada de esto para modificar, es posible que no se le ocurra que tiene un problema de final de línea. Y, por supuesto, nada impide que nadie utilice su propio carácter de fin de línea específico en su protocolo. Suspiro.

Con esto concluye nuestra guía para solucionar problemas de líneas seriales, y he cubierto prácticamente todas las variables posibles: obtener las líneas correctas, seleccionar la velocidad en baudios adecuada, determinar la polaridad de la línea (estilo TTL o RS-232), datos longitud, bits de parada, paridad y final de línea. Son muchas cosas que pueden salir mal al mismo tiempo si simplemente intentas obtener algunos datos de un sistema de microcontrolador opaco. Sin embargo, conocer todos los factores posibles le dará un punto de apoyo: una lista de verificación que puede utilizar para asegurarse de que todo funcione como cree que debería ser.

La mayoría de las veces no es tan malo. Te encontrarás con 8N1 a una de las velocidades de baudios estándar. Asegúrese de que los cables estén cruzados y pruebe los voltajes en las líneas de transmisión para establecer la paridad. Luego, puedes jugar con diferentes velocidades en baudios. Si esto no te salva, prueba con los finales de línea. Y si todavía estás atascado, saca el alcance y profundiza en las señales.

Espero que esto ayude y ¡feliz depuración! A continuación, nos ocuparemos de SPI.