Aller au contenu

Bus CAN

Le bus CAN (Controller Area Network) est un bus dit “bus de terrain” inventé par Bosch en 1983. A la base, il a été conçu pour simplifier le câblage électrique dans les véhicules automobiles, mais il est maintenant utilisé dans de nombreux autres domaines.

Le bus CAN est un bus série asynchrone qui permet de connecter plusieurs périphériques sur une même ligne de communication.

Bus CAN

Couche physique

Pour la couche physique, il y a deux standards :

  • ISO 11898-2: Aussi appelé high speed CAN, il utilise une paire de fils pour les communications jusqu’à 1 Mbit/s.
  • ISO 11898-3: Aussi appelé low speed CAN, avec une communication jusqu’à 125 kbit/s, mais offrant une meilleure de tolérance aux erreurs.

La figure ci-dessous illustre les niveaux logiques du bus CAN.

Couche Physique

Pour transmettre un 0, le fil CAN Hi est à 3.5V et le fil CAN Lo est à 1.5V. Pour transmettre un 1, les deux fils sont à 2.5V. Le signal logique est calculé par rapport à la différence de potentiel entre les deux fils. Si la différence est en dessous de 0.5V, le signal est dit “ressessif” et sa valeur est 1. Si la différence est au-dessus de 0.5C, le signal est dit “dominant” et sa valeur est 0.

Cette utilisation de la différence de potentiel permet de réduire les interférences électromagnétiques. En effet, si un bruit électromagnétique est capté par les deux fils, il sera capté de la même manière et donc ne changera pas la différence de potentiel. Cette propriété permet au bus CAN d’être très robuste.

Trame CAN

Une trame CAN est composée des champs suivants :

  • Start of Frame (SOF): 1 bit pour indiquer le début de la trame.
  • Arbitration Field: 11 ou 29 bits pour l’identifiant de la trame.
  • Control Field: contient 6 bits, dont 4 (DLC) pour indiquer la taille des données.
  • Data Field: 0 à 64 bits pour les données.
  • CRC: 15 bits pour la détection d’erreur.
  • ACK: 2 bits pour l’acquittement.
  • End of Frame: 7 bits pour indiquer la fin de la trame.
  • Inter-Frame Spacing: 3 bits pour indiquer le temps entre deux trames.

Trame CAN

Utilisation

Le bus CAN ne peut transmettre que de petits paquets de données (maximum 8 bytes), mais il est très rapide et robuste. Il peut, par exemple, envoyer des informations sur la vitesse des roues, la température du moteur, la position de la pédale d’accélérateur, etc. Dans une voiture moderne, il y a souvent plusieurs bus CAN pour gérer les différents systèmes de la voiture. Un bus CAN peut avoir jusqu’à 127 périphériques connectés, et chaque périphérique peut envoyer des trames à tout moment.

Protocoles sur les couches supérieures

Le standard ISO 11898-1 ne spécifie que la couche physique et la couche liaison de données du modèle OSI. Pour beaucoup d’applications, ces couches suffisent pour transmettre des données. Cependant, pour des applications plus complexes, il est possible d’utiliser des protocoles sur les couches supérieures, comme le protocole CANopen utilisé principalement pour les systèmes industriels.

CANopen OSI Model

Un autre protocole sur les couches supérieures est le protocole J1939, utilisé dans l’industrie automobile et les véhicules lourds (camions, bus, etc.)

Utilisation avec STM32Cube et ESP-IDF

La bibliothèque STM32Cube offre les fonctions nécessaires pour utiliser le bus CAN. Étudiez le chapitre 9 (HAL CAN Generic Driver / page 87) du manuel UM1725 : “Description of STM32F4 HAL and low-layer drivers” pour plus d’informations.

Avec les microcontrôleurs ESP32, la bibliothèque ESP-IDF offre également les fonctions nécessaires pour utiliser le bus CAN. Le protocole utilisé par ESP-IDF est nommé Two-Wire Automotive Interface (TWAI) et est compatible avec le bus CAN.

Liens utiles