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:

  1. Flag de error activo: 6 bits dominantes, lo genera el nodo cuando detecta una transmisión errónea en el EOF
  2. 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.