3.25. Conceptos básicos del bus CAN¶
CAN (Controller Area Network) fue diseñado originalmente por Bosch en la década de 1980 para conectar todas las unidades de control electrónico de un automóvil a un único bus compartido y corto. Sigue dominando el cableado de los automóviles, pero su misma robustez, comportamiento en tiempo real y diseño multimaestro lo convierten en el bus de campo predeterminado en la automatización, la robótica y los equipos agrícolas e industriales de todo tipo.
CAN no tiene un único «controlador» y un conjunto de «periféricos» como ocurre con SPI e I2C. Cada nodo del bus es un par, y cualquier nodo puede transmitir siempre que el bus esté inactivo. Lo que permite que esto escale es el diseño de difusión con arbitraje del bus.
3.25.1. Difusión con arbitraje por prioridad¶
Cada mensaje de un bus CAN lleva un identificador: 11 bits para la trama estándar clásica y 29 bits para la variante extendida. El identificador no es una dirección; etiqueta de qué trata el mensaje (RPM del motor, posición del pedal de freno, voltaje de la batería, etc.). Cuando un nodo quiere enviar un valor, lo difunde etiquetado con el identificador apropiado, y todos los nodos del bus ven la difusión. Cada receptor filtra el bus por hardware para seleccionar únicamente los ID que le interesan.
Si dos nodos intentan transmitir al mismo tiempo, el diseño eléctrico del bus permite que gane el mensaje con el identificador numérico menor sin perder ningún bit.
El truco está en los dos estados eléctricos del bus: dominante (lógicamente 0) y recesivo (lógicamente 1). Los cables CAN se mantienen en alto (recesivo) mediante resistencias de terminación cuando ningún nodo está hablando; cualquier nodo puede tirar de los cables hacia abajo (dominante) haciendo circular corriente a través de su transceptor. El resultado es un AND cableado: si un solo nodo lleva el bus a dominante, la línea se lee como dominante, y se lee como recesiva solo cuando todos los nodos la han liberado. El dominante siempre gana. (Algunas referencias llaman a esta misma disposición un OR cableado, tratando «dominante» como la señal afirmada en lugar del AND de los bits recesivos; el comportamiento físico es idéntico de cualquier manera.)
El AND cableado en forma conceptual. El CAN real ejecuta la misma lógica sobre un par diferencial (CAN_H / CAN_L) con los transceptores y las resistencias de terminación repartidos entre ambos cables, pero la regla en el bus es la misma: cualquier nodo puede tirar a dominante, y solo cuando todos los nodos lo han liberado se lee como recesivo.¶
El arbitraje utiliza esta asimetría directamente. Cada nodo transmisor envía su ID un bit a la vez, primero el MSB, y observa el bus mientras transmite. Un nodo que coloca un bit recesivo en el cable pero lee de vuelta un dominante sabe que otro nodo con un ID menor está transmitiendo en ese mismo momento y ha ganado esa posición de bit. Deja de impulsar el bus de inmediato y se pone a escuchar. El nodo ganador, mientras tanto, ve salir sus propios bits sin alterar: desde su punto de vista no ha ocurrido nada inusual. El ID de número menor gana porque sus bits dominantes anulan los bits recesivos que los ID de número mayor habrían enviado de otro modo en esas mismas posiciones.
El perdedor espera entonces a que el bus quede inactivo y reintenta automáticamente. No hay colisiones, ni mensajes perdidos: solo un ordenamiento de prioridad determinista.
Este es el estilo publicación/suscripción que hace que CAN funcione a escala: cualquiera puede hablar, cualquiera puede escuchar, y los ID hacen que el despacho sea implícito.
3.25.2. El bus físico¶
El controlador CAN del MCU no impulsa el bus directamente. Solo expone dos pines CMOS de 3,3 V: TX (el bit que quiere enviar) y RX (el bit que ve en el bus), y esos pines van a un chip aparte llamado transceptor o PHY CAN. El transceptor se sitúa entre el controlador y los cables CAN reales; es lo que sabe cómo comunicarse con el bus.
El bus en sí es un par diferencial de 5 V:
CAN_H: el cable «alto» del par.
CAN_L: el cable «bajo».
En el estado recesivo, ambos cables se sitúan en aproximadamente 2,5 V (el punto medio de la alimentación de 5 V del bus). En el estado dominante, el transceptor sube CAN_H hasta unos 3,5 V y baja CAN_L hasta unos 1,5 V, produciendo un diferencial de alrededor de 2 V a través del par. Los receptores muestrean la diferencia entre los dos cables, lo que hace que la señal sea inmune al ruido de modo común captado a lo largo de tendidos de cable largos.
El trabajo bidireccional del transceptor:
En el lado TX, lee el pin TX de extremo único de 3,3 V del controlador y, o bien separa CAN_H y CAN_L para el dominante, o bien libera ambos para el recesivo.
En el lado RX, lee el par diferencial CAN_H / CAN_L e informa de un nivel de extremo único de 3,3 V en su pin RX de vuelta al controlador.
Dos resistencias de terminación de 120 ohmios, una en cada extremo físico del cable, mantienen el bus en el punto medio recesivo cuando ningún nodo está impulsando y amortiguan las reflexiones que de otro modo corromperían la señal diferencial en tendidos largos.
3.25.3. La trama de datos¶
Una trama de datos CAN estándar se ve así en el cable:
Una trama de datos CAN estándar: campos SOF, ID, RTR, control, datos, CRC, ACK y EOF.¶
Cada campo tiene una función específica:
SOF (start of frame, inicio de trama). Un bit dominante que indica que una nueva trama está comenzando y sincroniza el reloj de bits de cada nodo.
ID (identificador). El identificador de 11 bits sobre el que arbitra el bus. Número menor = mayor prioridad.
RTR (remote transmission request, solicitud de transmisión remota). Se activa en una solicitud de datos en lugar de una entrega de datos; los receptores con un ID coincidente responden enviando los datos ellos mismos.
Control. Un campo de 6 bits que codifica la longitud de los datos (
DLC) y unos pocos bits de gestión.Datos. De 0 a 8 bytes de carga útil (CAN Classic; CAN FD lo amplía a 64 bytes).
CRC. 16 bits en total: un CRC de 15 bits sobre los campos anteriores más un delimitador de CRC de 1 bit.
ACK. 2 bits en total. En el primer bit, la ranura de ACK, el transmisor libera la línea y cualquier nodo que haya recibido la trama correctamente la tira hacia abajo; el segundo bit es un delimitador recesivo. La ausencia de un ACK le indica al transmisor que ningún nodo escuchó la trama y que debe intentarlo de nuevo.
EOF (end of frame, fin de trama). Siete bits recesivos que cierran la trama.
Todo eso lo genera y lo decodifica el controlador CAN por hardware; el software solo ve el ID, los datos y unas pocas banderas.
3.25.4. Dónde encaja CAN¶
Las decisiones de diseño de CAN definen su nicho:
Robusto. La señalización diferencial sobre un par trenzado, la detección de errores incorporada, el arbitraje de prioridad determinista y los reintentos automáticos hacen que CAN sobreviva en entornos eléctricamente ruidosos donde UART y SPI corromperían los datos.
Multimaestro. Cualquier nodo puede hablar en cualquier momento. No se requiere un controlador central y ningún nodo es un único punto de fallo.
Ancho de banda limitado. El CAN clásico llega como máximo a unos
1 Mbit/s; CAN FD lo amplía. CAN es la respuesta correcta cuando el enlace está entre placas o módulos, a menudo a lo largo de metros de cable, con la fiabilidad como prioridad.Protocolos de capa superior. El bus CAN desnudo no dice qué significa un ID ni cómo dividir un mensaje largo en fragmentos. Los protocolos de capa de aplicación (CANopen, J1939, ISO-TP/UDS, NMEA 2000) superponen esas reglas. Un elemento aparte que conviene conocer es el archivo DBC: un formato de texto específico de cada fabricante que registra qué ID transportan qué señales a nivel de bit en un vehículo o sistema concreto. Los archivos DBC son un formato de metadatos que describe la disposición de mensajes de un bus, no un protocolo propio.
El controlador en El bus CAN en código maneja la trama CAN a nivel de cable; mapear los ID a significados es tarea de la aplicación.