Buses de comunicación serie
La USART comunica dos equipos. Para que un microcontrolador converse con veinte integrados dentro de la misma placa, o con nodos repartidos por una planta, existen buses: unos pocos hilos compartidos, con reglas claras sobre quién habla y cuándo.
La transmisión serie asincrónica, la USART, la velocidad en baudios y el encuadre de cada carácter se desarrollan en módulo de comunicación serie. Acá se agregan los buses sincrónicos y multipunto, que son los que aparecen en cuanto hay más de dos integrados.
01Los buses, comparados
| Bus | Hilos | Velocidad | Alcance | Dónde se usa |
|---|---|---|---|---|
| I²C | 2 | 100 k a 1 M | < 1 m | Sensores, memorias, relojes y expansores dentro de una placa. |
| SPI | 4 (+1 por esclavo) | 1 a 50 M | < 30 cm | Tarjetas de memoria, pantallas, conversores rápidos. |
| 1-Wire | 1 (+ tierra) | 15 k | decenas de m | Sensores de temperatura y llaves de identificación. |
| RS-485 | 2 (par trenzado) | hasta 10 M | 1200 m | Instrumentos y variadores en planta. Es el medio físico de Modbus. |
| CAN | 2 (par trenzado) | hasta 1 M | 40 a 1000 m | Automotor y maquinaria: pensado para ambientes eléctricamente hostiles. |
| USB | 4 | 12 M a 5 G | 5 m | Conexión con la computadora, alimentación incluida. |
| Ethernet | 4 u 8 | 10 M a 1 G | 100 m | Redes de planta y equipos con servidor web propio. |
I²C y SPI están pensados para viajar centímetros sobre una plaqueta. Sacarlos por un cable de dos metros funciona a veces, y falla de manera intermitente el resto del tiempo. Apenas la señal tiene que salir del gabinete, corresponde un bus diferencial: RS-485 o CAN. Ese es el error de diseño más habitual y el más difícil de diagnosticar después.
02I²C: dos hilos y muchos integrados
- SDA lleva los datos y SCL el reloj. Ambas son de colector abierto: los integrados sólo pueden llevar la línea a cero, y unas resistencias de pull-up la suben.
- Cada dispositivo tiene una dirección de 7 bits. El maestro la envía y sólo responde el que coincide.
- Después de cada byte, el receptor pone la línea en cero un ciclo: es el ACK. Si no aparece, el dispositivo no está o no entendió.
- Un esclavo lento puede estirar el reloj manteniendo SCL en cero: clock stretching.
- Faltan las resistencias de pull-up, o hay una por cada módulo y quedan demasiado bajas en paralelo. Valor típico: 4,7 kΩ, uno solo por bus.
- Direcciones repetidas: dos sensores iguales sin cambiar su dirección por puentes.
- Cable largo: la capacidad redondea los flancos y el bus deja de responder.
- Un esclavo colgado deja SDA en cero y bloquea el bus entero.
/* Lectura de dos bytes de un sensor en la direccion 0x48, registro 0x00 */ i2c_start(); i2c_write(0x48 << 1); /* direccion + bit 0 = escritura */ i2c_write(0x00); /* apunta al registro que se quiere leer */ i2c_start(); /* arranque repetido, sin soltar el bus */ i2c_write((0x48 << 1) | 1); /* direccion + bit 1 = lectura */ alto = i2c_read(ACK); /* ACK: quiero otro byte */ bajo = i2c_read(NACK); /* NACK: es el ultimo */ i2c_stop();
El detalle del arranque repetido —sin soltar el bus entre la escritura del puntero y la lectura— es lo que evita que otro maestro se meta en el medio. Es la secuencia que aparece en casi todas las hojas de datos.
03SPI: rápido y sin protocolo
- SCLK: reloj, siempre generado por el maestro.
- MOSI: datos del maestro al esclavo.
- MISO: datos del esclavo al maestro.
- CS o SS: selección, una línea por esclavo. Es el precio de la velocidad.
No hay direcciones, ni reconocimiento, ni detección de error: SPI es un registro de desplazamiento entre dos chips. Por eso es tan rápido y tan simple.
Se definen con dos bits: CPOL, el estado del reloj en reposo, y CPHA, si el dato se muestrea en el primer flanco o en el segundo.
| Modo | CPOL | CPHA |
|---|---|---|
| 0 | 0 | 0 |
| 1 | 0 | 1 |
| 2 | 1 | 0 |
| 3 | 1 | 1 |
El modo equivocado es la causa número uno de «leo siempre ceros» o «los bits salen corridos». Está en la hoja de datos del esclavo.
04Buses para salir del gabinete
| Aspecto | RS-485 | CAN |
|---|---|---|
| Quién habla | Un maestro pregunta y los esclavos responden por turno. Nadie transmite sin ser consultado. | Cualquier nodo transmite cuando quiere; si dos coinciden, gana el mensaje de mayor prioridad sin perder nada. |
| Direccionamiento | Por dirección de nodo, en el protocolo de arriba (típicamente Modbus). | Por identificador del mensaje: no se direcciona al nodo sino al contenido. |
| Detección de error | La aporta el protocolo superior, con su verificación de redundancia. | Integrada en el propio bus: CRC, reconocimiento y retransmisión automática. |
| Terminación | 120 Ω en los dos extremos del par, y sólo ahí. | 120 Ω en los dos extremos, igual. |
| Topología | Cadena lineal. Las derivaciones largas producen reflexiones. | Cadena lineal, con derivaciones cortas. |
Entre dos extremos de una planta puede haber varios volts de diferencia entre tierras, y por el blindaje pueden circular corrientes importantes. Por eso los transceptores industriales suelen ser aislados galvánicamente, el blindaje se conecta a tierra en un solo extremo, y el bus se tiende separado de los cables de potencia. Ignorar esto produce fallas intermitentes que aparecen justo cuando arranca un motor.
05Cómo se elige el bus
| Situación | Bus adecuado |
|---|---|
| Varios sensores lentos en la misma placa | I²C: dos hilos y hasta 127 direcciones. |
| Pantalla gráfica o tarjeta de memoria | SPI: hace falta caudal, no direcciones. |
| Un termómetro a diez metros | 1-Wire: un solo hilo y tolera cables largos. |
| Instrumentos repartidos en una planta | RS-485 con Modbus: 1200 m y hasta 32 nodos por segmento. |
| Vehículo o maquinaria móvil | CAN: prioridades, detección de error y tolerancia al ruido. |
| Conexión con una PC | USB, o un conversor USB a serie si alcanza. |
| Equipo que debe verse desde la red | Ethernet, con servidor web embebido. |
06En el laboratorio
Escribir un programa que recorra las 127 direcciones y liste las que responden con ACK. Conectar varios módulos y verificar que aparezcan. Después quitar las resistencias de pull-up y observar en el osciloscopio cómo se redondean los flancos hasta que el bus deja de funcionar.
Conectar una memoria o una pantalla por SPI y capturar las cuatro líneas con un analizador lógico. Decodificar la trama y compararla con la hoja de datos. Cambiar a propósito el modo de reloj y ver cómo se corrompen los datos.
Armar un enlace RS-485 entre dos microcontroladores con transceptores, empezando con un metro de cable y llegando a la mayor distancia disponible en la escuela. Medir la tasa de errores con y sin resistencias de terminación, y con el cable pasando junto a un motor en marcha.
Implementar un esclavo Modbus RTU sencillo que exponga la lectura de un sensor en un registro, y leerlo desde una PC con un programa maestro. Es exactamente lo que hace un instrumento industrial, y deja la puerta abierta al eje de comunicaciones industriales.
07Errores frecuentes
| Síntoma | Causa habitual |
|---|---|
| El bus I²C no responde a nada | Faltan las resistencias de pull-up, o un esclavo colgado mantiene SDA en cero. |
| Dos sensores iguales y sólo funciona uno | Comparten dirección: hay que cambiarla por puentes o usar un multiplexor de bus. |
| SPI devuelve siempre ceros o datos corridos | Modo de reloj equivocado, o la línea de selección no se activa antes de la transferencia. |
| I²C sacado por un cable largo | La capacidad del cable arruina los flancos. Para salir del gabinete corresponde RS-485 o CAN. |
| RS-485 sin terminación | Reflexiones en los extremos y errores esporádicos que crecen con la velocidad. |
| Terminación en todos los nodos | Carga excesiva: la señal queda demasiado chica. Van sólo dos, una en cada punta. |
| Blindaje a tierra en los dos extremos | Circula corriente por el blindaje y se inyecta ruido en lugar de quitarlo. |
| Fallas que aparecen al arrancar un motor | Falta aislación galvánica o el bus va junto a los cables de potencia. |
08Autoevaluación
¿Por qué I²C necesita resistencias de pull-up?
Porque sus salidas son de colector abierto: los dispositivos sólo pueden llevar la línea a cero. El nivel alto lo provee la resistencia. Valor típico: 4,7 kΩ, una sola por línea y por bus.
¿Qué es el ACK en I²C y para qué sirve?
Un bit en cero que el receptor pone después de cada byte. Sirve para saber que el dispositivo existe y recibió: si no aparece, la dirección está mal o el chip no está conectado.
¿Cuántos hilos usa SPI y por qué crece con la cantidad de esclavos?
Cuatro básicos —reloj, dos de datos y selección—, más una línea de selección adicional por cada esclavo. No hay direcciones: se elige por hardware.
¿Qué definen CPOL y CPHA?
CPOL, el estado del reloj en reposo; CPHA, si el dato se muestrea en el primer o en el segundo flanco. Su combinación da los cuatro modos de SPI, y el modo equivocado corrompe todos los datos.
¿Por qué un par diferencial resiste mejor el ruido?
Porque el ruido se induce prácticamente igual en los dos hilos y el receptor mira sólo la diferencia entre ellos: lo que es común a ambos se cancela.
¿Dónde van las resistencias de terminación en RS-485?
120 Ω en los dos extremos del par, y sólo ahí. Ponerlas en cada nodo carga el bus y achica la señal.
¿Qué diferencia esencial hay entre CAN y RS-485?
CAN es un protocolo completo: los nodos transmiten cuando quieren, resuelven colisiones por prioridad sin perder mensajes e incluyen CRC y retransmisión. RS-485 es sólo el medio físico; el protocolo se agrega arriba.
¿Qué bus corresponde para un sensor a diez metros del microcontrolador?
1-Wire si es un termómetro lento, o RS-485 si hace falta velocidad y robustez. I²C a esa distancia no es confiable.
¿Por qué el blindaje se conecta a tierra en un solo extremo?
Para que no circule corriente por él por diferencia de potencial entre tierras. Con los dos extremos conectados, el blindaje inyecta ruido en lugar de quitarlo.
¿Cuál es la herramienta más útil para diagnosticar un bus serie?
El analizador lógico con decodificador de protocolo: muestra los bytes reales que circulan, que casi nunca son los que uno cree estar mandando.