5. Bus CAN y Comunicación con Motores
Capítulo 5 del Curso de Introducción a la IA Física de Seeed: conceptos básicos del bus CAN, tramas de datos estándar frente a extendidas, la capa de enlace de datos CAN y SocketCAN.
Después de completar esta sección, deberías ser capaz de comprender las siguientes cuestiones:
- Cómo se envía un dato en el bus CAN;
- De qué partes se compone una trama de datos CAN;
- Qué representan respectivamente CAN ID, DLC y Data;
- Cuál es la diferencia entre tramas estándar y tramas extendidas;
- Cuáles son las funciones de campos como CRC y ACK.
Para el desarrollo práctico, no es necesario memorizar desde el principio cada bit de una trama CAN.
Lo más importante en la etapa inicial es entender primero: ID, DLC, Data.
5.1 Principios Básicos de CAN
5.1 Principios Básicos de CAN
CAN es la abreviatura de Controller Area Network y es un protocolo de comunicación serie estandarizado internacionalmente por ISO. La estructura de red del bus CAN tiene dos formas: lazo cerrado y lazo abierto.
Generalmente, la estructura de red de bus CAN utilizada por brazos robóticos o robots emplea un bus CAN de lazo cerrado, es decir, se conecta una resistencia de 120 ohmios en cada extremo del bus y las dos líneas de señal forman un bucle. Este bus CAN está definido por la norma ISO 11898 y es una red CAN de alta velocidad y corta distancia con una tasa de comunicación de 125 kbit/s a 1 Mbit/s. A una tasa de comunicación de 1 Mbit/s, la longitud máxima del bus es de 40 m.

El bus consta de dos líneas de señal, CAN_L y CAN_H. CAN transmite señales diferenciales, representando el nivel del bus mediante la diferencia de voltaje entre las dos líneas de señal, es decir, CAN_H - CAN_L. Al nivel correspondiente al 1 lógico se le llama nivel recesivo, y al correspondiente al 0 lógico se le llama nivel dominante. En ISO 11898, el nivel recesivo está cerca de una diferencia de voltaje de 0, y el nivel dominante está principalmente cerca de una diferencia de voltaje de 2 V.
5.2 Protocolo CAN
5.2 Protocolo CAN
| Tipo de trama | Propósito de la trama |
|---|---|
| Trama de datos | Envía datos |
| Trama remota | Solicita datos |
| Trama de error | Informa errores del bus |
| Trama de sobrecarga | Solicita retraso |
| Espacio entre tramas | Separa tramas consecutivas |
Dado que los motores DM usan tramas de datos estándar CAN 2.0 y los motores RS usan el formato de trama de datos extendida CAN 2.0, a continuación solo se presentan estos dos formatos de trama de datos. Se recomienda leer la siguiente introducción junto con la sección de protocolo en la hoja de datos del motor.
5.2.1 Trama de Datos Estándar reBot DM (11 bytes en total)
| Byte | Campo | Asignación de bits |
|---|---|---|
| Byte 1 | Información de trama | Bit 7: FF, Bit 6: RTR, Bit 5: X, Bit 4: X, Bits 3–0: DLC |
| Byte 2 | ID de trama 1 | Bits 7–0: ID10–ID3 |
| Byte 3 | ID de trama 2 | Bits 7–5: ID2–ID0, Bits 4–0: X |
| Byte 4 | Dato 1 | DATA1 |
| Byte 5 | Dato 2 | DATA2 |
| Byte 6 | Dato 3 | DATA3 |
| Byte 7 | Dato 4 | DATA4 |
| Byte 8 | Dato 5 | DATA5 |
| Byte 9 | Dato 6 | DATA6 |
| Byte 10 | Dato 7 | DATA7 |
| Byte 11 | Dato 8 | DATA8 |
Parte de descripción de la trama (primeros 3 bytes):
- El Byte 1 es la información de la trama. El bit 7 (FF) indica el formato de la trama. En una trama estándar, FF es 0. El bit 6 (RTR) indica el tipo de trama. RTR=0 indica una trama de datos y RTR=1 indica una trama remota. DLC indica la longitud real de los datos cuando se trata de una trama de datos.
- Los Bytes 2 a 5 son el ID de la trama. El ID de una trama de datos estándar tiene 11 bits. Se envía secuencialmente desde ID10 hasta ID0, pudiendo existir 211 tipos de mensajes. El rango de ID de trama es: 000-7FF.
Está prohibido que los 7 bits superiores sean todos recesivos (ajuste prohibido: ID=1111111XXXX).
Parte de datos de la trama (últimos 8 bytes):
- Los Bytes 4~11 son los datos reales de la trama de datos.
5.2.2 Trama de Datos Extendida reBot RS (13 bytes)
| Byte | Campo | Asignación de bits |
|---|---|---|
| Byte 1 | Información de trama | Bit 7: FF, Bit 6: RTR, Bit 5: X, Bit 4: X, Bits 3–0: DLC |
| Byte 2 | ID de trama 1 | Bits 7–0: ID28–ID21 |
| Byte 3 | ID de trama 2 | Bits 7–0: ID20–ID13 |
| Byte 4 | ID de trama 3 | Bits 7–0: ID12–ID5 |
| Byte 5 | ID de trama 4 | Bits 7–3: ID4–ID0, Bits 2–0: X |
| Byte 6 | Dato 1 | DATA1 |
| Byte 7 | Dato 2 | DATA2 |
| Byte 8 | Dato 3 | DATA3 |
| Byte 9 | Dato 4 | DATA4 |
| Byte 10 | Dato 5 | DATA5 |
| Byte 11 | Dato 6 | DATA6 |
| Byte 12 | Dato 7 | DATA7 |
| Byte 13 | Dato 8 | DATA8 |
Parte de descripción de la trama (primeros 5 bytes):
- El Byte 1 es la información de la trama. El bit 7 (FF) indica el formato de la trama. En una trama extendida, FF es 1. El bit 6 (RTR) indica el tipo de trama. RTR=0 indica una trama de datos y RTR=1 indica una trama remota. DLC indica la longitud real de los datos cuando se trata de una trama de datos.
- Los Bytes 2 a 5 son el ID de la trama. El ID en formato extendido tiene 29 bits. El ID básico va de ID28 a ID18, y el ID extendido está representado por ID17 a ID0. El ID básico es el mismo que el ID en formato estándar. Pueden existir 229 tipos de mensajes y hay huecos en el enlace de datos (transparentes para el operador). El rango de ID de trama es 0000 0000-1FFF FFFF.
Está prohibido que los 7 bits superiores sean todos recesivos (ajuste prohibido: ID básico=1111111XXXX).
Parte de datos de la trama (últimos 8 bytes):
- Los Bytes 6~13 son los datos reales de la trama de datos.
5.2.3 Capa de Enlace de Datos CAN
El bus CAN puede entenderse como un "chat grupal". Muchos dispositivos están conectados al bus, por ejemplo:
- Controlador principal;
- Motores;
- Sensores;
- Sistema de gestión de baterías;
- Otros módulos de control.
Todos los dispositivos comparten el mismo bus CAN. Cuando un dispositivo quiere enviar datos, no puede simplemente enviarlos arbitrariamente; en su lugar, debe empaquetar los datos en una trama de datos CAN completa de acuerdo con el formato especificado por el protocolo CAN.
Una trama CAN puede entenderse de forma sencilla como:
Inicio de envío → Número de mensaje → Longitud de datos → Datos reales → Comprobación de datos → Confirmación de recepción → Fin de envío
La estructura de trama CAN correspondiente puede simplificarse como:
SOF → ID → Campo de control → DLC → Data → CRC → ACK → EOF

Consulta la siguiente tabla para una explicación detallada:
| Nombre | Función |
|---|---|
| Segmento inactivo (bus inactivo) | El bus está en nivel recesivo 1 y ningún nodo opera el bus. Cuando ningún dispositivo está enviando datos, el bus CAN está en estado inactivo. Actualmente ningún dispositivo está hablando y todos están esperando. |
| Inicio de trama (SOF) | SOF está fijado como un bit dominante 0. Dado que el bus CAN está en 1 cuando está inactivo, cuando aparece de repente un 0 en el bus, los demás dispositivos saben que un dispositivo ha comenzado a enviar datos. Por lo tanto, SOF puede entenderse como: "Estoy empezando a enviar." |
| Segmento de arbitraje (ID de trama, RTR o SRR) | ID: puede entenderse como el número de este mensaje. Por ejemplo, en el control de motores, se puede usar 0x01: comando de control del motor 1; 0x02: comando de control del motor 2, etc. El ID representa con mayor precisión "la identidad o el tipo del mensaje". Cuanto menor es el valor de ID, mayor es la prioridad. RTR: se utiliza principalmente para distinguir: trama de datos ordinaria RTR=0 y trama de solicitud remota RTR=1. Al enviar datos CAN ordinarios a diario, RTR suele ser 0. SRR: un bit de arbitraje dedicado a tramas extendidas, fijado en 1. Se utiliza principalmente para garantizar que, con el mismo ID básico, las tramas estándar tengan prioridad sobre las tramas extendidas. |
| Segmento de control (IDE, bits reservados, DLC) | El bit IDE se utiliza para distinguir tramas estándar de tramas extendidas. IDE = 1 trama extendida, ID de 29 bits. IDE = 0 trama estándar, ID de 11 bits. La trama extendida tiene un rango de ID mayor y puede proporcionar más números de mensaje. DLC: indica al receptor cuántos datos hay. Por ejemplo: DLC = 1, indica 1 Byte de datos (8 bits); DLC = 4, indica 4 Bytes de datos (32 bits); DLC = 8, indica 8 Bytes de datos (64 bits). |
| Campo de datos | Este es el contenido de datos real, con una longitud correspondiente al DLC. Por ejemplo, el controlador principal necesita enviar al motor: posición objetivo; velocidad objetivo; par objetivo. Consulta el protocolo de comunicación CAN proporcionado por el fabricante del dispositivo para confirmar qué representa cada byte. |
| Segmento CRC | El "código de comprobación" de los datos CAN. Realiza el cálculo CRC sobre todos los bits de datos, incluido el inicio de trama, el segmento de arbitraje, el segmento de control y el segmento de datos. Comprueba si se producen errores durante la transmisión de datos CAN. El delimitador CRC debe estar en nivel recesivo. |
| Segmento ACK | ACK: le indica al emisor "Lo he recibido". Después de que el emisor termina de enviar, libera el bus al nivel recesivo 1. Si el receptor recibe correctamente, debe responder con nivel dominante 0 en este bit. En este momento, el emisor lee la ranura ACK como 0, lo que indica que se recibió el ACK. El delimitador ACK es cuando el receptor libera el nivel, que es recesivo. |
| Fin de trama (EOF, End Of Frame) | Finaliza la transmisión de datos CAN actual. 7 unos recesivos. |

5.3 SocketCAN
5.3 SocketCAN
SocketCAN es una implementación principal del protocolo CAN en sistemas Linux. SocketCAN utiliza la API de sockets y la tecnología de la pila de red de Linux para implementar los controladores de dispositivos CAN como interfaces de red, lo que lo hace fácil de usar y altamente compatible.
Documentación de referencia para un uso detallado: https://docs.linuxkernel.org.cn/networking/can.html