El CAN (Controlled Area Network) es un protocolo de comunicaciones asíncrono, con detección de colisión, basado en topología bus y con prioridades en la transmisión.
Se creó como protocolo de comunicaciones para los coches, ya que se puede distinguir entre comunicaciones importantes y secundarias. Por ejemplo, si queremos encender las luces y pulsamos el botón de volumen del volante, primero encenderá las luces y segundo subirá el volumen. Esto tiene cierta lógica.
A parte, la transmisión es en diferencial, con lo que es un sistema muy seguro frente a ruidos externos.
Al ser un protocolo multicast (recepción por difusión), todo el mundo es emisor y receptor de los paquetes, pero gracias al ID único de cada dispositivo sabe cuál es suyo y cuál no.
El protocolo garantiza los tiempos de latencia, comprueba errores y si detecta alguno, retransmite el mensaje automáticamente. Y comprueba que los errores sean temporales o permanentes en un nodo, desactivando éste en ese caso.
Envía los mensajes codificados por medio de codificación NRZ, para evitar problemas el bit stuffing, que inserta de un bit complementario tras 5 bits con el mismo valor.
Y la última característica importante es que es un bus muy flexible a la configuración.
Este bus tiene una longitud máxima de 1000m a 40 Kbps, con una velocidad máxima de 1Mbps a 40 metros.
Algo muy importante, es que la resistencia total del bus tiene que ser de unos 60Ω. Para lograrlo, se suele poner una resistencia de 120Ω en el primer punto y otra en el último punto.
imagen obtenida en www.motorpasionfuturo.com
Capas del CAN
Capa física
La capa física define la parte mecánica y eléctrica del bus.
Gracias a ella, sabemos que los módulos conectados al bus interpretan dos niveles lógicos:
- Dominante: la tensión diferencial (CAN_H - CAN_L) es del orden de 2'0 V con CAN_H = 3'5 V y CAN_L = 1'5V(nominales).
- Recesivo: la tensión diferencial (CAN_H - CAN_L) es del orden de 0V con CAN_H = CAN_L = 2'5V (nominales).
También sabemos las velocidades con respecto a la distancia:
Velocidad (Bit/seg)
|
Tiempo de bit (microseg)
|
Longitud máxima (metros)
|
1 Mbps
|
1 microseg
|
30 m
|
800 Kbps
|
1,25 microseg
|
50 m
|
500 Kbps
|
2 microseg
|
100 m
|
250 Kbps
|
4 microseg
|
250 m
|
125 Kbps
|
8 microseg
|
500 m
|
50 Kbps
|
20 microseg
|
1000 m
|
20 Kbps
|
50 microseg
|
2500 m
|
10 Kbps
|
100 microseg
|
5000 m
|
Capa de Enlace
Control de enlace lógico (LLC)
- Se encarga de los filtros de los mensajes
- Proporciona servicios durante la transferencia de datos y durante la petición de datos remotos
- Decide que mensajes recibidos de MAC se aceptan
- Proporciona medios para el restablecimiento y para notificar la sobrecarga del bus
Control de acceso al medio (MAC)
- Representa el núcleo del protocolo CAN
- Presenta los mensajes recibidos a la subcapa LLC y acepta los mensajes para ser transmitidos a dicha subcapa
- Es responsable de la trama de mensajes, arbitraje, reconocimiento, detección de error y señalización
- En esta subcapa se decide si el bus está libre para comenzar una nueva transmisión o si la recepción acaba de comenzar
En esta capa se define la trama o frame:
Hay que distinguir entre la trama del CAN normal y del CAN extendido. La diferencia radica en el ID, el del CAN normal es de 11bits y el del extendido es de 29bits.
En la wikipedia americana tienen la trama mejor explicada:
Formato básico
Nombre del campo
|
Longitud (bits)
|
Propósito
|
---|---|---|
Start-of-frame
|
1 |
Indica el inicio de la transmisión
|
Identifier (green)
|
11
|
Identificador único que también representa la prioridad
|
Remote transmission request (RTR)
|
1
|
Dominante (0)
|
Identifier extension bit (IDE)
|
1
|
Declara si el CAN es extendido o normal.
|
Reserved bit (r0)
|
1
|
Reservado
|
Data length code (DLC) (yellow)
|
4
|
Número de bytes de datos (0–8 bytes)
|
Data field (red)
|
0–64 (0-8 bytes)
|
Datos que se transmiten (la longitud la determina el campo DLC)
|
CRC
|
15
|
comprobación de errores
|
CRC delimiter
|
1
|
Debe ser un "1" (recesivo)
|
ACK slot
|
1
|
El emisor manda un "1" (recesivo) y el receptor acepta con un "0" (dominante)
|
ACK delimiter
|
1
|
Debe ser un "1" (recesivo)
|
End-of-frame (EOF)
|
7
|
Debe ser un "1" (recesivo)
|
Formato extendido
Nombre del campo
|
Longitud (bits)
|
Propósito
|
---|---|---|
Start-of-frame
|
1
|
Indica el inicio de la transmisión
|
Identifier A
|
11
|
Primera parte del Identificador único que también representa la prioridad
|
Substitute remote request (SRR)
|
1
|
Debe ser un "1" (recesivo). Opcional
|
Identifier extension bit (IDE)
|
1
|
Debe ser un "1" (recesivo).Opcional
|
Identifier B
|
18
|
Segunda parte del Identificador único que también representa la prioridad
|
Remote transmission request (RTR)
|
1
|
Dominante (0)
|
Reserved bits (r0, r1)
|
2
|
Reservado
|
Data length code (DLC)
|
4
|
Número de bytes de datos (0–8 bytes)
|
Data field
|
0–64 (0-8 bytes)
|
El emisor manda un "1" (recesivo) y el receptor acepta con un "0" (dominante)
|
CRC
|
15
|
comprobación de errores
|
CRC delimiter
|
1
|
Debe ser un "1" (recesivo)
|
ACK slot
|
1
|
Transmitter sends recessive (1) and any receiver can assert a dominant (0)
|
ACK delimiter
|
1
|
Debe ser un "1" (recesivo)
|
End-of-frame (EOF)
|
7
|
Debe ser un "1" (recesivo)
|
Transmisión de datos
Prioridad
Lo primero que haces el emisor es comprobar que el bus esté libre, si lo está envía el paquete.
Por el contrario, si no lo está, comprueba la prioridad. Si su paquete es más prioritario (dominante, RTR="0"), lo envía. Sino (recesivo, RTR="1"), se espera a que el bus esté libre.
Esto, realmente, se realiza por medio de configuraciones open-collector y puertas lógicas. Así, cuando el prioritario manda un paquete, pone un "0" en el bus, con una puerta AND cancela toda transmisión existente.
Toda transmisión se hace punto a punto, para ello, cada dispositivo tiene que tener su propio ID y así no puede haber conflictos.
Normalmente, los recesivos son sensores.
Filtros y máscaras
Para rechazar paquetes, el CAN tiene los filtros y las máscaras que, dependiendo de su configuración admitiremos más paquetes o menos.
Por ejemplo: mi dispositivo tiene el ID 165h y yo configuro el filtro en 165h y la máscara 1FFFFFFFh, con esto sólo pasarán los paquetes con ID165h.
Si cambio la máscara a 1FFFFFF0h, pasarán los paquetes con ID del 160h al 16Fh.
Si pongo una máscara del 1FFFFFF5h, pasarán todos con ID comprendidas entre 160h a 164h.
Y si quiero que pase todo, lo que debo poner es un 0 tanto en el filtro como en la máscara.
Reloj del Bus
Por las señales del bus no se envía ningún reloj, por ello es una transmisión asíncrona.
La sincronización se realiza dividiendo cada frame en un número determinado de segmentos: sincronización, propagación, fase 1 y fase 2.
Las longitudes de las fases se ajustan en cada transmisión.
En el segmento de la sincronización, espera el flanco de inicio de transmisión y después mete un retardo de propagación para compensar el desfase que pueda haber.
Tipos de Tramas
Trama de error
Se usan para señalarle al resto de módulos la detección de cualquier error, impidiendo normalmente el mensaje erróneo.
Consiste en dos campos distintos:
- El primer campo es de los Flags de Error (6/12 bits dominante/recesivo). Formado por las distintas estaciones.
- El segundo es el Error de Delimitación (8bits recesivos).
Hay dos tipos de Flags de error:
- Flag de error activo: 6 bits dominantes, lo genera el nodo cuando detecta una transmisión errónea en el EOF
- Flag de error pasivo: 6 bits recesivos, lo genera el nodo cuando detecta un ACK erróneo.
Trama de sobrecarga
Permite que un módulo fuerce a los demás a alargar el tiempo entre transmisión de tramas sucesivas. Lo hace el dispositivo con independencia del software.
Espacio Inter-Tramas
Las tramas de datos y las remotas se separan un periodo de tiempo.
Cálculo de los tiempos de transferencia
En la web de intrepidcs.com podéis descargar una aplicación para calcular los valores de los registros del CAN, el baudrate.
Otra herramienta similar es la que ofrece kvaser.com.
La más completa la encontraréis en bittiming.can-wiki.info. En ella podréis usar una calculadora para diversos chips.
Para el uso de las herramientas anteriores, es recomendable buscar el 75% del SamplePoint (SP) y el Syncro Jump Width (SJW) más alto posible para evitar latencias en el bus.
En el primer caso tendremos que introducir los valores que queremos del oscilador y la tasa de transferencia y haremos click a la flecha de la derecha; acto seguido podremos ver una tabla con los valores recomendados. Volveremos a hacer click a la flecha.
Ahora estamos en el apartado de selección, en el desplegable elegiremos una valor intermedio, para evitar latencias y después ajustar el Propagation Delay hasta que llegemos al 75%, el Phase Segment 2 hasta que en el recuadro de debajo nos ponga que cumple los requerimientos y, por último, el SJW al mismo valor que Phase Segment 2.
Al darle a Generate Report, nos abrirá una página web con los datos seleccionados.
En el segundo enlace, introduciremos los valores y buscaremos en la tabla la opción que queremos.
En el tercer caso elegimos el fabricante, ponemos la frecuencia del clock del bus_CAN y buscamos en la tabla la velocidad deseada, vamos a la última columna y tenemos el valor del registro.
Aunque BitTiming no esté pensada para el STM8S, se puede utilizar los valores del registro CAN_BTR que genera como valores de los registros CAN_BTR1 y CAN_BTR2 (mirad datasheets).
Ejemplos
En el artículo sobre la placa de control de un TCS3414, hay un ejemplo de uso del CAN en un STM8.
En este enlace encontrarás un programa para PIC18f del uso del Can 2.0 B o ECAN.
Otro ejemplo para el STM32F103 STM32 y el CAN. Hay que prestar especial atención en la configuración de los filtros.