Catto / Mapa de Temas · Electrónica Digital III 6° año
Electrónica Digital III · 144 h · Eje 2 de 7

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.

Microcontroladores USART SPI I²C Baudios

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.

ParaleloSerie
Cables8, 16 o más, con su masa1 a 4
Costo del conector y del cableAltoBajo
Patas del microUn puerto enteroDos o tres
DistanciaCentímetrosMetros, o kilómetros con RS485
Problema propioSkew: los bits no llegan todos juntosHay que ponerse de acuerdo en la velocidad
Sincrónico y asincrónico
  • 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.

reposo arranque b0 1 b1 0 b2 0 b3 0 b4 0 b5 0 b6 1 b7 0 parada reposo byte armado: 00000001 byte armado: 00000001 byte armado: 00000001 byte armado: 00000001 byte armado: 00000001 byte armado: 00000001 byte armado: 01000001 byte armado: 01000001 El bit menos significativo viaja primero: 0100 0001 es 0x41, la letra «A». La línea reposa en alto · el flanco de bajada del arranque sincroniza al receptor se muestrea en el centro de cada bit
Figura 1. Trama de 8N1, animada. El receptor detecta el flanco de bajada del bit de arranque, espera medio tiempo de bit y a partir de ahí muestrea en el centro de cada bit. Por eso una diferencia de velocidad de más del 2 % arruina la recepción.
ElementoQué es
BaudajeBits por segundo de la línea. Los valores clásicos: 9600, 19200, 38400, 57600, 115200.
8N1La configuración habitual: 8 bits de datos, Ninguna paridad, 1 bit de parada. Los dos extremos tienen que coincidir en las tres cosas.
ParidadUn 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 paradaUno o dos. Garantizan que la línea vuelva a reposo para poder detectar el próximo arranque.
Ejemplo · Cuánto tarda un byte

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.

UBRR=fosc16·baudios1baudios=fosc16·(UBRR+1) Fórmula del modo asincrónico normal. El registro sólo admite enteros: ahí aparece el error.
Ejemplo resuelto · El error de baudaje, con números

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.

El oscilador interno no alcanza para 115 200

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.

Las banderas que hay que mirar
  • 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 / DORoverrun: 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 / FEframing 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.

SS el maestro elige al esclavo SCK MOSI 1 0 1 1 0 0 1 0 0xB2 MISO 0 1 0 0 1 1 0 1 0x4D 1 2 3 4 5 6 7 8 pulso Ocho pulsos de reloj: en cada uno sale un bit por MOSI y entra uno por MISO Al terminar, los dos registros de desplazamiento intercambiaron su contenido
Figura 2. Transferencia SPI, animada. El maestro baja SS̄ para elegir el esclavo, genera ocho pulsos de reloj y en cada uno se desplaza un bit en cada sentido. Al terminar, los dos registros intercambiaron su contenido.
Las cuatro líneas
  • 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.
Los cuatro modos

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».

Dónde aparece SPI

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.

DetalleValorPor qué importa
Pull-ups4,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.
Velocidad100 kHz estándar · 400 kHz rápido · 1 MHzMucho más lento que SPI, y suficiente para sensores.
Direcciones7 bits → 112 útilesDos dispositivos con la misma dirección se pisan. Muchos módulos traen puentes para cambiarla.
ACKUn bit por byteEl 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 bus400 pF máximoLimita la longitud a unas decenas de centímetros. Para más distancia hay repetidores o se cambia de bus.
El escáner: la primera herramienta de diagnóstico

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.

UARTSPII²C
Cables2 (+ masa)3 + 1 por esclavo2 (+ masa)
RelojNo
Velocidad típica9,6 a 115,2 kbps1 a 50 Mbps100 a 400 kbps
Cuántos dispositivos2 (o red con RS485)Muchos, con una selección cada unoHasta 112, sin cables extra
Confirma recepciónNoNoSí (ACK)
Se usa paraPC, GPS, módulos, depuraciónPantallas, memorias, SD, radioSensores, RTC, EEPROM, expansores

06Niveles eléctricos: lo que no se ve en el programa

3,3 V y 5 V no se conectan directo

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.

TTL contra RS232

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.

Masa común

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

Práctica 1 · Hola mundo serie

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.

Práctica 2 · Provocar el error de baudaje

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 %.

Práctica 3 · SPI con un 74HC595

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.

Práctica 4 · Escáner de I²C

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.

Práctica 5 · Dos micros conversando

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íntomaCausa habitual
Llegan caracteres raros pero constantesBaudaje distinto entre los dos extremos, o error de división mayor al 2 %.
Llega el primer byte y después nadaOverrun: 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 largoNiveles TTL a demasiada distancia. Pasar a RS485 o bajar la velocidad.
Comunicación intermitente entre dos equiposFalta la masa común, o hay diferencia de potencial entre masas.
El dispositivo SPI no respondeModo (CPOL/CPHA) equivocado, SS̄ que no baja, o MISO y MOSI invertidos.
El bus I²C está siempre en ceroFaltan 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 unoComparten dirección. Cambiarla con los puentes del módulo o usar dos buses.
Un módulo de 3,3 V dejó de funcionarSe lo conectó a señales de 5 V. Hace falta traductor de niveles.
Se pierden bytes cuando el programa hace otras cosasRecepció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.

Desarrollo del eje «Módulo de comunicación» de Electrónica Digital III (6° año), según la «Propuesta Curricular – Segundo Ciclo de la Modalidad Técnico Profesional, Educación Secundaria – Electrónica», Ministerio de Educación de la Provincia de Córdoba, DGETyFP. Volver al Mapa de Temas · catto.ar