Módulo de comunicación
Un microcontrolador solo sirve para poco: casi siempre tiene que hablar con un sensor, con una pantalla, con otro micro o con una computadora. Todo eso se resuelve con dos o tres cables y un periférico que se configura en cinco líneas.
01Por qué serie y no paralelo
Mandar un byte por ocho cables a la vez parece más rápido, y lo es a distancias cortas. Pero en cuanto hay que salir de la plaqueta, la comunicación serie gana por goleada.
| Paralelo | Serie | |
|---|---|---|
| Cables | 8, 16 o más, con su masa | 1 a 4 |
| Costo del conector y del cable | Alto | Bajo |
| Patas del micro | Un puerto entero | Dos o tres |
| Distancia | Centímetros | Metros, o kilómetros con RS485 |
| Problema propio | Skew: los bits no llegan todos juntos | Hay que ponerse de acuerdo en la velocidad |
- Sincrónico: hay un cable de reloj. El que manda dice, además de los datos, cuándo hay que leerlos. Es SPI, es I²C, y es la USART en modo síncrono. Rápido y sin errores de velocidad, a costa de un cable más.
- Asincrónico: no hay reloj. Los dos extremos tienen que estar configurados a la misma velocidad de antemano, y la trama lleva marcas de comienzo y de fin para sincronizarse en cada byte. Es el puerto serie de toda la vida.
02La USART asincrónica: la trama
La línea en reposo está en alto. Para mandar un byte se la lleva a cero durante un tiempo de bit —el bit de arranque—, y eso le avisa al receptor que empiece a contar. Después vienen los ocho bits de datos, el menos significativo primero, opcionalmente un bit de paridad, y por lo menos un bit de parada en alto.
| Elemento | Qué es |
|---|---|
| Baudaje | Bits por segundo de la línea. Los valores clásicos: 9600, 19200, 38400, 57600, 115200. |
| 8N1 | La configuración habitual: 8 bits de datos, Ninguna paridad, 1 bit de parada. Los dos extremos tienen que coincidir en las tres cosas. |
| Paridad | Un bit que hace par o impar la cantidad de unos. Detecta un error de un bit, no lo corrige, y no ve los errores dobles. Hoy casi no se usa: se prefiere un checksum sobre el mensaje completo. |
| Bits de parada | Uno o dos. Garantizan que la línea vuelva a reposo para poder detectar el próximo arranque. |
En 8N1, cada byte ocupa en realidad 10 bits: arranque + 8 datos + parada.
- A 9600 baudios: 1/9600 = 104 µs por bit → 1,04 ms por byte → unos 960 bytes por segundo.
- A 115 200: 8,68 µs por bit → 86,8 µs por byte → unos 11 500 bytes por segundo.
- Mandar una pantalla de 20 × 4 caracteres (80 bytes) a 9600 tarda 83 ms: se nota a simple vista. Ese cálculo decide muchas veces la velocidad del proyecto.
03Configurar el baudaje: la cuenta que hay que saber hacer
El módulo genera su tiempo de bit dividiendo el reloj del sistema. Se le carga un número entero en un registro (SPBRG en PIC, UBRR en AVR) y de ahí sale la velocidad real, que casi nunca es exactamente la pedida.
Caso que funciona. Cristal de 16 MHz, 9600 baudios:
- UBRR = 16 000 000 / (16 × 9600) − 1 = 104,17 − 1 = 103,17 → se carga 103
- Velocidad real = 16 000 000 / (16 × 104) = 9615 baudios
- Error = (9615 − 9600)/9600 = +0,16 %. Perfecto.
Caso que no funciona. Cristal de 8 MHz, 115 200 baudios:
- UBRR = 8 000 000 / (16 × 115 200) − 1 = 4,34 − 1 = 3,34 → se carga 3
- Velocidad real = 8 000 000 / (16 × 4) = 125 000 baudios
- Error = +8,5 %. La recepción falla: llegan caracteres cambiados o basura.
La regla práctica: el error total entre los dos extremos no debe pasar del 2 %. Por eso existen los cristales de aspecto raro —7,3728 MHz, 11,0592 MHz, 14,7456 MHz—: son múltiplos exactos de los baudajes estándar. Con 7,3728 MHz y 9600 baudios, UBRR = 47 y el error es cero.
Los osciladores RC internos tienen una tolerancia del 1 al 10 % según el chip y la temperatura, sin calibrar. Sumado al error de división, el presupuesto de error se agota. Para comunicación serie confiable: cristal externo, o autocalibración del oscilador interno contra una referencia. Es exactamente lo que se vio en osciladores sobre estabilidad.
- TXIF / UDRE: el transmisor está libre. Hay que esperarla antes de cargar el próximo byte.
- RCIF / RXC: llegó un byte. Se lee del registro de recepción y la bandera se limpia sola.
- OERR / DOR — overrun: llegó un byte nuevo antes de que se leyera el anterior. Es la falla típica de un programa que hace otra cosa mientras recibe. En PIC hay que limpiarla a mano apagando y encendiendo el receptor, o el módulo queda mudo.
- FERR / FE — framing error: no apareció el bit de parada donde correspondía. Casi siempre es baudaje equivocado o ruido.
// Transmisión y recepción mínimas, sin bibliotecas (AVR)
void serie_init(uint16_t ubrr) {
UBRR0H = (uint8_t)(ubrr >> 8);
UBRR0L = (uint8_t) ubrr;
UCSR0B = (1 << TXEN0) | (1 << RXEN0); // habilita Tx y Rx
UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); // 8 bits de datos
}
void serie_enviar(uint8_t dato) {
while (!(UCSR0A & (1 << UDRE0))); // espera que el buffer se libere
UDR0 = dato;
}
uint8_t serie_recibir(void) {
while (!(UCSR0A & (1 << RXC0))); // espera a que llegue algo
return UDR0;
}
Los dos while son bloqueantes: el programa no hace nada más
mientras espera. En cuanto el proyecto tenga que atender otra cosa, esto se reemplaza por
interrupciones y un buffer circular, que es tema de 7° año.
04SPI: el bus sincrónico rápido
Cuatro cables, un maestro y todos los esclavos que hagan falta. El maestro genera el reloj y siempre hay intercambio: por cada bit que sale por MOSI, entra uno por MISO.
- SCK — reloj, lo genera el maestro.
- MOSI — del maestro al esclavo.
- MISO — del esclavo al maestro.
- SS̄ / CS̄ — selección, activa en bajo. Una por esclavo: ahí está el costo de agregar dispositivos.
Se combinan dos bits: CPOL (si el reloj reposa en alto o en bajo) y CPHA (si el dato se muestrea en el primer flanco o en el segundo). De ahí salen los modos 0 a 3.
Cada chip especifica el suyo en la hoja de datos. Si no coincide, se lee basura o los datos aparecen corridos un bit: es lo primero que hay que revisar cuando un dispositivo SPI «no responde».
Memorias Flash y EEPROM serie, tarjetas SD, pantallas gráficas y OLED, conversores A/D externos de varios bits, sensores rápidos, módulos de radio (nRF24, LoRa), registros de desplazamiento 74HC595 para expandir salidas. Cuando hace falta velocidad —decenas de megahertz— SPI es la respuesta.
05I²C: dos cables para todos
Dos líneas —SDA (datos) y SCL (reloj)— compartidas por todos los dispositivos, cada uno con su dirección. Las salidas son de colector abierto: cualquiera puede llevar la línea a cero, y son las resistencias de pull-up las que la devuelven a uno.
| Detalle | Valor | Por qué importa |
|---|---|---|
| Pull-ups | 4,7 kΩ típico (1,5 a 10 k) | Sin ellas el bus no funciona. Van una vez en todo el bus, no una por dispositivo. |
| Velocidad | 100 kHz estándar · 400 kHz rápido · 1 MHz | Mucho más lento que SPI, y suficiente para sensores. |
| Direcciones | 7 bits → 112 útiles | Dos dispositivos con la misma dirección se pisan. Muchos módulos traen puentes para cambiarla. |
| ACK | Un bit por byte | El que recibe confirma. Si nadie contesta, el maestro sabe que la dirección no existe: es la base del «escáner de I²C». |
| Capacidad del bus | 400 pF máximo | Limita la longitud a unas decenas de centímetros. Para más distancia hay repetidores o se cambia de bus. |
Un programa de veinte líneas que recorre las 112 direcciones y anota cuáles responden con ACK. Antes de pelear con un sensor que «no anda», el escáner dice en dos segundos si el dispositivo está vivo, si su dirección es la que dice el manual y si el cableado sirve. Si no aparece nada, el 90 % de las veces faltan las resistencias de pull-up o están invertidas SDA y SCL.
| UART | SPI | I²C | |
|---|---|---|---|
| Cables | 2 (+ masa) | 3 + 1 por esclavo | 2 (+ masa) |
| Reloj | No | Sí | Sí |
| Velocidad típica | 9,6 a 115,2 kbps | 1 a 50 Mbps | 100 a 400 kbps |
| Cuántos dispositivos | 2 (o red con RS485) | Muchos, con una selección cada uno | Hasta 112, sin cables extra |
| Confirma recepción | No | No | Sí (ACK) |
| Se usa para | PC, GPS, módulos, depuración | Pantallas, memorias, SD, radio | Sensores, RTC, EEPROM, expansores |
06Niveles eléctricos: lo que no se ve en el programa
Un micro de 3,3 V conectado a una salida de 5 V recibe tensión por encima de su máximo y se daña, a veces despacio. Las soluciones habituales: un divisor resistivo si la señal es lenta y de un solo sentido, un conversor de nivel con MOSFET para I²C (que es bidireccional), o un integrado traductor. Verificar siempre la tensión de trabajo de cada módulo antes de cablear.
El puerto serie del micro trabaja con 0 y 5 V (o 3,3). Un puerto RS232 de PC usa ±12 V invertidos. Entre los dos va un MAX232 o un cable USB-serie, nunca una conexión directa: se destruye la pata del micro.
Dos equipos que se comunican en serie necesitan compartir la masa. Es el olvido más frecuente cuando cada uno tiene su fuente, y produce comunicaciones intermitentes que parecen un problema de software. Si las masas no pueden unirse, hay que aislar con optoacopladores o pasar a RS485.
07En el laboratorio
Configurar la USART a 9600 8N1 y mandar un texto por segundo a la computadora con un adaptador USB-serie. Verificar en el osciloscopio que el tiempo de bit sea de 104 µs y leer la trama a ojo: identificar arranque, los ocho bits —el menos significativo primero— y la parada. Comparar el byte leído en pantalla con el carácter enviado.
Con el emisor a 9600 y el receptor a 19 200, observar qué llega. Después probar diferencias chicas: 9600 contra 9800 (2 %) y contra 10 400 (8 %). Anotar a partir de qué error empieza a fallar. Es la comprobación experimental de la regla del 2 %.
Manejar ocho LED con un registro de desplazamiento usando SPI por hardware. Medir con el osciloscopio de dos canales SCK y MOSI, y verificar en qué flanco cambia el dato. Después cambiar el modo SPI del micro y comprobar que deja de funcionar: es la mejor manera de entender CPOL y CPHA.
Con un sensor o un módulo RTC en el bus, correr el escáner y anotar la dirección encontrada. Después sacar las resistencias de pull-up y volver a correrlo: no aparece nada. Ver en el osciloscopio la diferencia entre una línea con pull-up y una flotante.
Conectar TX de uno con RX del otro y viceversa, con las masas unidas, y armar un protocolo mínimo: un byte de comando y un byte de respuesta. Después desconectar la masa común y observar el resultado. Por último, agregar un checksum y provocar errores tocando el cable.
08Errores frecuentes
| Síntoma | Causa habitual |
|---|---|
| Llegan caracteres raros pero constantes | Baudaje distinto entre los dos extremos, o error de división mayor al 2 %. |
| Llega el primer byte y después nada | Overrun: no se leyó el registro de recepción a tiempo. En PIC hay que limpiar OERR a mano. |
| Funciona con el cable corto y falla con el largo | Niveles TTL a demasiada distancia. Pasar a RS485 o bajar la velocidad. |
| Comunicación intermitente entre dos equipos | Falta la masa común, o hay diferencia de potencial entre masas. |
| El dispositivo SPI no responde | Modo (CPOL/CPHA) equivocado, SS̄ que no baja, o MISO y MOSI invertidos. |
| El bus I²C está siempre en cero | Faltan pull-ups, o un dispositivo quedó trabado sosteniendo SDA. Se destraba pulsando el reloj a mano nueve veces. |
| Dos dispositivos I²C y sólo aparece uno | Comparten dirección. Cambiarla con los puentes del módulo o usar dos buses. |
| Un módulo de 3,3 V dejó de funcionar | Se lo conectó a señales de 5 V. Hace falta traductor de niveles. |
| Se pierden bytes cuando el programa hace otras cosas | Recepción por sondeo. Hay que pasar a interrupción con buffer circular. |
09Autoevaluación
¿Cuántos bits ocupa realmente un byte en 8N1 y cuánto tarda a 19 200 baudios?
10 bits: arranque, ocho datos y parada. A 19 200, cada bit dura 52,1 µs → 521 µs por byte, unos 1920 bytes por segundo.
Cristal de 16 MHz y 19 200 baudios: ¿qué valor va en UBRR y qué error queda?
UBRR = 16 000 000/(16 × 19 200) − 1 = 52,08 − 1 = 51,08 → se carga 51. Velocidad real = 16 000 000/(16 × 52) = 19 231 baudios: error +0,16 %.
¿Por qué existen cristales de 7,3728 MHz?
Porque son múltiplos exactos de los baudajes estándar: 7 372 800/(16 × 9600) = 48 justo, así que el error de baudaje es cero. Con cristales «redondos» siempre queda un resto.
¿Qué es un overrun y cómo se evita?
Llegó un byte nuevo antes de que el programa leyera el anterior, y se perdió. Se evita atendiendo la recepción por interrupción y guardando los datos en un buffer circular, en vez de esperar por sondeo.
En SPI, ¿qué pasa con MISO mientras el maestro manda por MOSI?
El intercambio es simultáneo: por cada pulso de reloj sale un bit por MOSI y entra uno por MISO. Al cabo de ocho pulsos, los dos registros de desplazamiento intercambiaron su contenido.
¿Para qué sirven CPOL y CPHA?
Definen el modo SPI: en qué nivel reposa el reloj (CPOL) y en cuál de los dos flancos se muestrea el dato (CPHA). Si el modo del maestro no coincide con el del esclavo, los datos salen corridos o directamente sin sentido.
¿Por qué I²C necesita resistencias de pull-up?
Porque las salidas son de colector abierto: sólo pueden llevar la línea a cero. El uno lógico lo produce la resistencia. Sin pull-ups, las líneas quedan flotando y el bus no funciona.
¿Cuántos dispositivos entran en un bus I²C y qué los limita?
Hasta 112 por las direcciones de 7 bits, pero en la práctica manda la capacidad total del bus: 400 pF como máximo, lo que limita la cantidad de módulos y la longitud del cableado a unas decenas de centímetros.
¿Cuándo conviene SPI y cuándo I²C?
SPI cuando importa la velocidad —pantallas, memorias, tarjetas SD— y sobran patas. I²C cuando hay muchos dispositivos lentos y hay que ahorrar cables: sensores, reloj de tiempo real, expansores de puertos.
Dos equipos conectados por TX/RX no se entienden aunque el baudaje coincide. ¿Qué revisar primero?
La masa común y el cruce de las líneas: TX de uno debe ir a RX del otro. Después, los niveles: si uno es TTL y el otro RS232, hace falta un adaptador.