Présentation du Bus CAN 2.0B et de son implémentation avec un Arduino

1) Introduction au bus CAN

Depuis les années 60, le nombre de câbles n’a cessé d’augmenter dans les voitures (2000m en 1995). Pour pallier ce problème, au début des 80, BOSH commença le développement d’une solution de multiplexage des données dans l’automobile. Dès 1983, le bus CAN 1.2 est normalisé, en 2003 et 2004, les versions 2.0A et 2.0B sont normalisées, ils sont tous deux compatibles trame standard et trame étendue (uniquement 2.0B) et ont un débit théorique de 1Mbit/s, contre 125Kbit/s pour la version 1.2.

Le bus CAN est basé sur le principe de diffusion, toutes les stations reçoivent les messages, mais chaque trame envoyée ou reçue à un ID de 11 ou 29 bits, qui permettent de filtrer les messages. Il y a aussi une notion de priorité en fonction de l’ID. L’ID peut aussi servir d’identificateur de l’appareil. Si plusieurs appareils émettent en même temps, c’est celui qui émet un message avec l’ID le plus faible qui gagne le bus.

Le bus CAN exploite les deux premières couches du modèle OSI (Physique et de Liaison) et c’est un bus série bidirectionnel halfduplex..

1.1) Les versions du CAN

 Nom Version Identificateur Autre
CAN 1.2 1.2 11 Bits Version de 1983
CAN 2.0A 2.0A 11 Bits Compatible avec 2B en format standard(11bits) en 2004
CAN 2.0B 2.0B 29 Bits Retro compatible 2A en 2003

2) Les caractéristiques du bus CAN

2.1) Le support et vitesse de connexion

Chaque appareil (ou Device) est connecté au réseau CAN par l’intermédiaire d’une paire de fils torsadés et parfois blindés. Les appareils sont connectés en dérivation aux deux fils CANL et CANH et les deux extrémités du bus doivent être rebouclées avec une résistance de 120 Ohms (Résistance de terminaison de bus) et avec une tolérance entre 108 et 132 Ohms. En fonction de la distance, la connexion CAN baisse en vitesse.

 

Vitesse (kbit/s) Distance (m) Longueur d’un bit
1000 30 1 uS
800 50 1.25 uS
500 100 2 uS
250 250 4 uS
125 500 8 uS
62,5 1000 16 uS
20 2500 50 uS
10 5000 100 uS
En gras, ce sont les mode « HighSpeed », en gris, en mode « Low Speed ».

L’intérêt principale du mode « Low Speed » c’est qu’il est plus tolérant aux pannes, alors qu’en High speed, un court-circuit peut mettre en défaut le bus. Mais en plus de l’avantage d’être plus tolérant aux pannes, il a un mode veille et de réveil, qui permet de faire baisser la consommation (15 uA).

2.2) Les caractéristiques du bus CAN 2.0A et 2.0B

Le protocole CAN (Versions 2003) prévoit deux types de trame, les trames standards supportées par les contrôleurs CAN 2.0A et 2.0B, mais aussi la trame étendue supportée uniquement par les contrôleurs CAN 2.0B

 

 2.3) Composition d’une trame en format « Normal »
Champ de la trame La longueur (bits) Utilité 
Start-Of-Frame(SOF) 1 Le début d’une trame en format normal
ID ou Identifier A 11 Il définit la priorité du message
Remote transmission Request (RTR) 1 Est à 0 (Dominant) quand c’est une trame de données, et à 1 (récessif) quand il y a une demande
Identifier extension bit (IDE) 1 0 c’est un format de trame normale
Bit réservé(r0) 1 Est réservé pour des futurs usages
Data length code (DLC) 4 Définit la taille de la data (0-8 octet)
Data 0-64(0-8 octet) Les données transmises.
CRC 15 La redondance de la data pour détecter les erreurs de transmission
CRC delimiter 1 Est à 1 généralement
ACK slot 1  
ACK delimiter 1 Est à 1 généralement
End-Of-Frame(EOF) 7 Définit la fin de la trame

2.4) Composition d’une trame en format « étendu »

Champ de la trame La longueur (bits) Utilité 
Inter Frame Space(« IFS ») 3 bits ou plus  
Start-Of-Frame(SOF) 1 Le début d’une trame en format normal
ID ou Identifier A 11 Il définit la priorité du message
Substitue Remote Request (SRR) 1 Est généralement à 1
Identifier extension bit (IDE) 1 0 c’est un format de trame normale
Identifier B 18 Il définit la priorité du message en plus du Identifier A
Remote transmission Request (RTR) 1 Est à 0 (Dominant) quand c’est une trame de données, et à 1 (récessif) quand il y a une demande
Bit réservé (r1 et r0) 2 Pour des futurs usages
Data length code (DLC) 4 Définit la taille de la data (0-8 octet)
Data 0-64(0-8 octet) Les données transmises.
CRC 15 La redondance de la data pour détecter les erreurs de transmission dans la data.
CRC delimiter 1 Est à 1 généralement
ACK slot 1 Sert lors d’un envoie pour confirmer la réception du message (un bit récessif est émis en même temps de la part du receveur.
ACK delimiter 1 Est à 1 généralement
End-Of-Frame(EOF) 7 Définit la fin de la trame

 

Dans cette partie nous détaillerons les différentes parties d’une trame CAN.

2.3) IFS

Pour « Inter Frame Space » avec 3 bits récessifs minimums. Cela permet d’indiquer que le bus est disponible.

Il peut être rallongé quand un des devices est trop lent.

Pour « Start Of Frame » comme son nom l’indique, cela permet de connaitre le début d’une trame, il est composé d’un bit dominant « 0 ».

Comme dit précédemment, le champ de commande ou « control » est constitué de 6 bits, les bits de réserve (R0 et R1) mais aussi du DLC (Data Length Code), les deux premiers sont pour des usages ultérieurs, et les 4 du DLC permettent de connaitre la taille des données contenues dans la trame (ou Data) :

Nombre d’octet DLC 3 DLC 2 DLC 1 DLC 0
0 0 0 0 0
1 0 0 0 1
2 0 0 1 0
3 0 0 1 1
4 0 1 0 0
5 0 1 0 1
6 0 1 1 0
7 0 1 1 1
8 1 0 0 0

Le CRC est composé de la séquence de CRC (Cyclic Redundancy Code) et suivi du CRC Delimiter (1 bit récessif).

Le CRC est calculé à partir du SOF, du champ d’arbitration (de ID), du champ de control (R0, R1 et DLC), du champ des données (Data field), Le CRC est un polynôme calculé par le récepteur et l’émetteur de la même manière : X15+X14+X10+X8+X7+X4+X3+1

sites web :

Il permet de vérifier si une trame est intègre lors de sa réception.


3) Le compteur d’erreur

Il existe sur le bus CAN deux compteurs « d’erreur » pour les transmissions et réceptions de trame, il existe 3 modes en fonction du nombre « d’erreur ».

 

 

 

 

 

 

 

Le mode d’erreur Active :

Si le compteur « d’erreurs » est inférieur à 127, alors le Device émet des trames d’erreur active (Active Error Flag).

Le mode d’erreur Passive :

Si le compteur « d’erreur » est supérieur 127 et inférieur à 255 alors le nœud (ou Device) émet des trames d’erreur passive (Active Error Flag)

Le mode Bus Off :

Dans un cas plus extrême ou il y a plus de 255 erreurs, alors le Device est déconnecter du bus (les drivers de lignes sont inactifs) donc il écoute seulement (donc pas de d’acquittement de trame…).

Ce nombre peut baisser, il faut 127 trames de 11 bits récessifs (ou d’inter-trame) pour revenir à l’état d’erreur passive.

Tous ces modes sont régis par ces règles

  • Le compteur de réception est incrémenté de 1 si l’un des récepteurs détecte une erreur. (Cette règle ne s’applique pas s’il reçoit une erreur de « bit Error » durant un « flag » d’erreur active ou un « flag » de surcharge.
  • Le compteur de réception est incrémenté de 8 lorsque :
    • Le récepteur reçoit un bit dominant juste après un « flag » d’erreur.
    • Le récepteur recoit un bit d’erreur alors qu’il recoit aussi un « flag » d’erreur active ou de surcharge.
  • Le compteur d’erreur transmission et de réception s’incrémentent de 8 lorsque tous les Devices reçoivent 7 bits dominants (« 0 ») consécutifs après avoir reçus un « Active Error flag » ou un « Passive Error Flag » ou d’un « Overload Flag ». Après la réception d’un 14 bit dominants consécutifs (Pour l’ « L’active Error Flag ou un « Overload Flag ») ou d’un 8 Eme bit dominants consécutifs suivant un « Passive Error Flag » et après toutes les suites de 8 bits dominants consécutifs.
  • Le compteur de réception est décrémenté de 1 lorsque le récepteur reçoit une trame sans erreur (jusqu’au champ d’Acknowledge Slot) et que la valeur du compteur de réception est comprise entre 1 à 127. S’il est à 0 alors il n’y a aucune décrémentation. S’il est supérieur à 127, il est ramené à entre 119 à 127.
  • Le compteur de transmission est décrémenté de 1 lorsque la transmission d’une trame se déroule sans erreur (jusqu’au champ d’Acknowledge Slot). S’il est à 0 alors il n’y a aucune décrémentation.
  • Le compteur de transmission est décrémenté de 8 lorsque :
    • Un émetteur envoie un « Error Flag », son compteur d’émission s’incrémente de 8 sauf si l’émetteur est en erreur passive (« Passive Error Flag » ) et voit un Acknowledgment (il ne détecte aucun bit dominant sur le champ d’acknowledge ou lors de l’envoie de la trame d’erreur passive) et également si l’émetteur envoie un flag d’erreur lors d’une erreur de Bit-Stuffing durant la période d’arbitrage (détection d’un bit dominant au lieu d’un bit récessif situé après le RTR).
    • Un émetteur voit un Bit Error tandis qu’il émet un flag d’erreur active ou un flag de surcharge.

4) Le bit Stuffing et le NRZ

Le bus CAN utilise un codage avec la méthode NRZ (Non Return to Zero), pendant la durée de la génération du bit, le niveau de tension de la ligne est maintenu et constante.

Lié à cette technique, le CAN en prévoit une sécurité pour palier à la fiabilité du NRZ, le « bit stuffing », lorsqu’il y a 5 bit identiques consécutifs, le « bit stuffing » ajoute automatiquement, un bit inverse après les 5 bits consécutifs.

Paramètres CAN « Low Speed » CAN « High Speed »
Débit théorique Jusqu’à 125 kb/s De 125 kb/s à 1Mb/s
Nombre de nœuds sur le bus 2 à 20 2 à 10000 ?
Courant de sortie (en émission) 1mA sur 2.2Kohm Entre 25 à 50 mA sur 60 KOhms
Niveau dominant CAN H = 4V et CAN L = 1V VCAN H – VCAN L = 2V
Niveau récessif CAN H = 1.75V et CAN L = 3.25V VCAN H = VCAN L = 2.5V
Caractéristique du câble 30pF entre les câbles 2*120Ohms
Tension d’alimentation 5V 5V

 

5) L’architecture CAN

Comme vous pouvez le voir, un réseau multiplexé est plus fiable (moins de connexion) et aussi une maintenance plus simple, son inconvénient est qu’il est possible de saturer le bus de données plus facilement…

 

 


6) Application réel

Nous verrons dans cette partie, l’application réelle du bus CAN, via un Shield Arduino, avec Arduino IDE.

6.1) Matériel nécessaire

Dans cette partie, nous listerons le matériel nécessaire.

  • Deux Arduino Uno ou Mega
  • Deux Shield CAN 2.0B de SeeedStudio
  • Un Pc  et 2 câbles USB Type B (Pour les imprimantes)

6.1) Présentation du  Shield CAN 2.0B

Dans cette présentation nous ferons référence à la Version « CAN BUS Shield V2.0 » d’aout 2017, les autres versions sont partiellement compatibles avec cette présentation.

Caractéristiques CAN Shield V2.0
Contrôleur du BUS CAN MCP2515
Contrôleur de réception MCP2551
Bus CAN 2.0A/2.0B Oui
I2C(Grove) Oui, SDA/SCL
UART Oui
SPI Oui, 10Mb/s
Prise sub-D Oui (OBD-II et CAN)
Lecteur de carte micro SD Oui, uniquement en FAT

 

Le shield CAN 2.0B de SeeedStudio
  1. Interface DB9 pour une connexion ODBII
  2. V_OBD : cela permet d’activer ou non l’interface DB9
  3. Del
    1. PWR : L’alimentation
    2. TX : S’allume quand le Shield envoi des données
    3. RX : S’allume quand le Shield reçoit des données
    4. INT : Quand il y a des données en attentes dans le cache.
  4. L’interface physique du CAN
  5. Les pins d’interface avec l’Arduino.
  6. Le connecteur pour des extensions GROVE
  7. Le connecteur I2c
  8. Connecteurs ICSP
  9. Puce MCP2551 : Interface CAN en « High-speed
  10. Puce MCP2515 : Le contrôleur CAN avec l’interface SPI de l’Arduino.

7) Présentation Extérieur

 

Le connecteur ODBII

7) Le début du programme

Pour la librairie de seeed-studio, nous nous concentrerons principalement sur la partie CAN.

Dans un premier temps nous définissons les librairies et les paramètres avant le début du programme :

#include <SPI.h> Elle permet de contrôler le bus SPI entre l’Arduino et le Shield CAN
#include <mcp_can.h> C’est la librairie pour le Shield CAN
MCP_CAN CAN(9) On définit, le pin du CS
CAN.begin(CAN_500KBPS) Cela définit la vitesse du bus CAN à 500KBPS

 

 

 

 

 

 

La liste des vitesses possibles pour le Shield CAN
CAN_5KBPS CAN_83KBPS
CAN_10KBPS CAN_95KBPS
CAN_20KBPS CAN_100KBPS
CAN_25KBPS CAN_125KBPS
CAN_31KBPS CAN_200KBPS
CAN_33KBPS CAN_250KBPS
CAN_40KBPS CAN_500KBPS
CAN_50KBPS CAN_666KBPS
CAN_80KBPS CAN_1000KBPS
Leurs utilité Les différentes fonctions possibles Explication
Pour envoyer des messages CAN.sendMsgBuf(INT32U id, INT8U ext, INT8U len, INT8U *buf) « Id » est ID de la trame
    « ext » représente le statut de la trame, 0 est une frame standard, 1 est une trame entendue
    « len » la longueur/poids des données dans la trame
    « buf » sont les données en elle-même, (8 octets max), *buf est de type INT8U  char[8]
« MASK » et « Filter » init_Mask( uChar num , uChar ext, uChar ulData) « Num » est le N° de registre, 0/1 pour le masque et 0 à 5 pour le filtre
Init_Filt(uChar num, uChar ext, uChar ulData) « ext » représente le statut de la trame, 0 est une frame standard, 1 est une trame entendue
  « ulData » représente le contenu
  Le masque permet de d’accepter que les trames avec le même registre ?
  Le filtre permet de rejeter trame avec un ID qui de correspondent pas.
Réception des trames CAN_MSGAVAIL == CAN.checkReceive() Renvoie true s’il y a des données recus
Lecture des données reçus CAN.readMsgBuf( uchar &len, uChar[8] buf); « Len » est un char

« Buf » est un char [8]

Après avoir vu les commandes principales, nous verrons un exemple de programme en C sur arduino IDE :

#include <SPI.h>
#include "mcp_can.h"
const int SPI_CS_PIN = 9;
MCP_CAN CAN(SPI_CS_PIN);                                   // ?

void setup()
{
    Serial.begin(115200);                                                      //On démarre la connexion avec la console 

    while (CAN_OK != CAN.begin(CAN_500KBPS))              // initialisation du bus CAN à 500 Kb/s
    {
        Serial.println("CAN BUS Shield init fail");                      // si le bus CAN n’est pas fonctionnel
        Serial.println(" Init CAN BUS Shield again");
        delay(100);
    }
    Serial.println("CAN BUS Shield init ok!");
}

void loop()
{
    unsigned char len = 0;                                      // Initialisation d’un int pour le nombre de caractère(s)
    unsigned char buf[8];                                        // Initialisation d’une chaine de caractère(8)

    if(CAN_MSGAVAIL == CAN.checkReceive())            // Vérifie si il y a des données reçus. 
    {
        CAN.readMsgBuf(&len, buf);    // read data,  len: data length, buf: data buf

        unsigned int canId = CAN.getCanId();                  //on récupère l’ID de la trame 
        
        Serial.println("-----------------------------");
        Serial.print("Get data from ID: ");
        Serial.println(canId, HEX);

        for(int i = 0; i<len; i++)    // Affiche les données reçu
        {
            Serial.print(buf[i], HEX);
            Serial.print("\t");
        }
        Serial.println();
    }
}
Exemple de programme sur arduino en C

 


8) Lexique

 

Mot(s) français Mot(s) Anglais Définissions
Multiplexage Multiplexing Réseaux sur une voie unique
  S.O.F Pour « Start Of Trame
  R.T.R Remote Transmission Request.
  I.D. E Identifier Extension Bit
  D.L.C Data Length Code
  C.R.C Pour « Cyclic Redundacy Code », Ces bits sont recalculés à la réception et comparés aux bit reçus, s’il y a une différence, une erreur CRC est déclarée.
  E.O.F Pour « End Of Frame » Ces bits permettent d’identifier la fin de la trame.
Acquittement ACK Acknowledge
     
Bidirectionnel

Half-duplex

  Communication dans les deux sens chacun son tour.
Bidirectionnel

Full-duplex

  Communication dans les deux sens et en même temps
Unidirectionnel

Simplex

  Communication dans un seul sens
Dominant   Est un bit à 0
Récessif   Est un bit à 1

Lien
1 http://edelaunay.chez-alice.fr/buscan.htm
2 http://www.technologuepro.com/cours-systemes-embarques/cours-systemes-embarques-Bus-CAN.htm
2bis http://www.educauto.org/sites/www.educauto.org/files/file_fields/2013/11/18/mux4.pdf
3 http://wiki.seeed.cc/CAN-BUS_Shield_V2.0/
4 http://nicolas.navet.eu/cours/Cours2010/intro-CAN-color.pdf
5 https://www.arduino.cc/en/Main/Software
6 https://github.com/Seeed-Studio/CAN_BUS_Shield
7 http://www.oberle.org/can-can.html
8 https://homepages.laas.fr/fcaignet/Cours/presentation_bus_CAN.pdf
9 http://eduscol.education.fr/sti/sites/eduscol.education.fr.sti/files/ressources/pedagogiques/494/494-1-buscan-trame.pdf
10 https://kadionik.vvv.enseirb-matmeca.fr/enseirb/old/RE304/canbus_enseirb.pdf
11 https://en.wikipedia.org/wiki/CAN_bus
12 http://sylvain-kuczek.fr/bus-can-communication-donnees/

 

Document Word de ce tuto

Benoit de Marion

BTS Systèmes Numériques option Informatique et Réseaux (1ère année)
Saint-Nazaire (2017-2018)

https://www.linkedin.com/in/benoit-de-marion