Mise en oeuvre du bus CAN

 

      1. Présentation

L'idée de vous présenter le bus CAN vient d'un projet personnel que je réalise. Il s'agit d'un système domotique composé de cartes à microcontroleur reliées entres-elles par l'intermédiaire d'un bus : le bus CAN. Les différentes cartes peuvent-êtres de nature diverses : Toutes ces cartes étant interconnectées par le bus CAN, elles pourront fonctionner en mode décentralisé avec un minimum de fonctionnalitées et le mode centralisé nécessitant une centrale de gestion permettra d'ajouter les fonctionnalités plus complexes. L'idée étant d'assurer un minimum de fonctionnalités lorsque la centrale de gestion est déconnectée, défaillante, ou en cours de mise à jour.Ce système domotique devra gérer les fonctions suivantes, d'autres fonctions viendrons par la suite.

La connection au bus CAN est réalisée à l'aide d'un transceiver CAN et d'un controller CAN, le controleur pouvant etre intégré dans un microcontroleur.

Comme transceiver, je peux vous donner comme exemple le MCP2551 de chez Microchip et le PCA82C250 de chez Philips.

Le bus CAN étant un bus complexe, il est difficile de le mettre en oeuvre de manière totalement software. Les controleurs CAN permettent de gérer le bus de manière hardware ils intègrent les couc, avec les transceivers, les couches 1 (physique) et 2 (liaison) du modèle OSI.

On distingue deux types de Controleurs :

Ceux externes au Microcontroleurs reliés à ce dernier par une liaison de type SPI , comme le MCP2515.

Les Controleurs intégrés aux microcontroleurs qui disposent donc d'un module CAN avec les lignes TXCAN et RXCAN reportés sur les pins et destinés à êtres reliés au transceiver CAN.

Il en existe plusieurs, les premiers étants les suivants :

PIC18F248, PIC18F258, PIC18F448, PIC18F458

Ceux-ci ont quelques bugs qui font qu'ils ont un fonctionnement erratique si on ne les utilise pas d'une manière particulière(gestion de banques de mémoire, des interruptions,...). Les "Erratas" sont disponibles sur le site de Microchip.

J'utilise depuis peu les suivants :

PIC18F2680 et PIC18F4680

Ils sont récents, ne comportent plus les bugs précédents, disposent de plus de mémoire et , d'un module CAN plus évolué mais compatible avec ceux des anciennes générations. De plus, ils sont disponibles en boitier DIP28broches et 40 broches ainsi qu'en CMS SOIC28 pour le 2680, ce qui permet de le souder convenablement à la main.

 

 

Vous avez deux méthodes de programmer les PIC pour gérer le bus CAN :

En Assembleur, c'est ainsi que j'ai commencé, grace aux cours de bigonoff auquels je vous renvoie si vous voulez programmer ainsi.

En C, il existe plusieurs compilateurs C, et certaines directives changent, je ne parlerai que du C18 de Microchip que vous trouverez gratuit à l'essai.

Microchip fournit dans une de ses Application Notes (AN738) une librairie en C pour utiliser facilement le module CAN des PIC 18Fxx8 . Les nouveaux modules CAN (appelés ECAN) sont code compatibles avec les anciens mais possèdent deux modes de fonctionnement (mode 1 et 2) qui ne seront donc pas utilisés car la librairie n'a pas été écrite pour. Cepandant, l'ancien mode de fonctionnement (mode 0) est plus facile à maitriser et on pourra facilement un jour, migrer.

On utilisera le mode de fonctionnement "mode 0 - Legacy mode" (voir datasheet section 23.4).

En plus du mode de fonctionnement (Functionnal Mode), il faut distinguer le mode d'opération (Opération Mode). Attention de ne pas les confondre.

On distingue 5 modes de fonctionnement :

La réception

La réception est plus complexe que l'émission, on dispose de deux buffers de réceptions ainsi que des filtres et masques pour chaque buffer. La configuration des filtres et masques va vous permettre de rediriger le type de trame selon son identifiant vers le buffer 1 ou le buffer 2. Le masque vous permet de sélectionner ce que vous voulez filtrer dans l'id. Bit à bit cela donne : Si le masque est à 0, on accepte quelque soit la valeur du filtre.Si le masque est à 1, on accepte que si le bit du filtre est identique au bit de la trame reçue.Voir AN738 page 10 et 11 pour les méthodes permettant de définir filtres et masques.

Le masque 1 et les filtres 1 et 2 correspondent au buffer 1. Le masque 2 et les filtres 3,4,5 et 6 correspondent au buffer 2.

La fonction CANReceiveMessage vous permet de récupérer le message CAN recu ainsi que de savoir par quel filtre il est passé, vous pourrez alors savoir de quel buffer il provient.

Il y a une erreur en haut de la page 14, la fonction ne retourne pas rien "void" mais retourne un booléen "BOOL" qui vaudra false s'il n'y a pas de nouveaux messages.

Noter la présence d'une fonction CANIsRxReady() qui permet de savoir si au moins une trame a été reçu.

 

 

La gestion des erreurs

La gestion des erreurs est un des points les plus complexes du bus CAN. Plusieurs types d'erreurs peuvent avoir lieu. Les controleurs CAN disposent de deux compteurs d'erreurs : Un pour les erreurs d'émission, et un pour les erreurs de réception. Ces compteurs ne sont pas de simples compteurs d'erreurs, ils vont s'incrémenter et de décrémenter automatiquement lors de l'émission/réception.

A partir de ces compteurs, le controleur CAN va passer dans différents modes de fonctionnement.actif, passif, et Off. Lorsqu'un noeud CAN a eu plus de 255 erreurs d'émission, il va passer en mode Bus Off, c'est à dire qu'il ne tentera plus d'émettre.

De 0 à 127 : Etat "error active". Le noeud CAN en question continuera d'émettre et de reçevoir normalement mais il indiquera son status d'"error active" aux autres noeuds si une autre erreur est détectée.

De 128 à 255 : Etat de "error passive". Le noeud CAN continuera d'émettre et de reçevoir mais il indiquera son status d'error passive à chaque trame d'erreur.

Plus de 255 : Etat de "Bus Off". Lassé de ne pouvoir émettre ou reçevoir, il va se mettre à bouder dans un coin afin de ne pas perturber le bon fonctionnement du bus.

Vous avez trois méthodes pour vérifier si le bus est off ou en état d'erreur passive :

CANIsBusTxPassive(), CANIsBusRxPassive(), et CANIsBusOff().

Comme vous pouvez le constater, la gestion des erreurs est très complexe! Il ne s'agit que d'une infime partie. Je ne connais d'ailleurs pas tout.

L'intéret de ce bus est que tout ce mécanisme de traitement des erreurs est géré automatiquement de manière hardware. On a donc juste à surveiller les erreurs dans le programme histoire de gérer les défauts comme mettre le système en sécurité.

 

La gestion des réceptions

Il existe deux méthodes pour gérer les réceptions de trames CAN, soit en testant en permanence l'état des buffers de réception par la commande CANIsRxReady() par exemple, soit en utilisant les interruptions.

L'avantage des interruptions de traiter très rapidement les trames recues avant l'arrivée d'une nouvelle. On peut par exemple se contenter dans la routine de réception de stocker les trames reçues dans un buffer puis de traiter ces trames dans le programme principal.

 

Les liens

 

< Retour au SOMMAIRE
Me contacter