Bus CAN et systèmes PSOC5 publié le 10/02/2013 - mis à jour le 17/10/2019
1. Présentation
1.1 Généralités
Le Bus CAN (Control Area Network) est largement employé pour véhiculer des informations dans les systèmes embarqués. Sa robustesse en fait un bus de choix dans les domaines de l’automobile la marine et l’aviation.
Le bus CAN HS (High Speed) est un bus multi-maître qui permet la liaison entre un ensemble de nœuds (ECU : Electronic Control Unit). Le débit d’information peut atteindre 1Mbit/s.
Les ECU sont réalisés à l’aide d’unités de traitements (microcontrôleurs, DSP ou ordinateurs) reliés à des ensembles "controller + transceiver". Le transceiver (coupleur différentiel) permet l’adaptation des niveaux électriques des tensions circulant sur le bus. Le contrôleur, quant à lui, a pour fonction de gérer les échanges de données sur le bus (priorité, erreur de données...).
Comme nous allons le voir dans la suite de l’article, le PSOC5 intègre la partie contrôleur.
Il suffira juste de lui adjoindre un transceiver afin de faire communiquer ce microcontrôleur avec un autre environnement (l’exemple que je décris ci-après concerne la communication entre deux kits PSOC5).
1.2 Niveaux de tension, informations binaires et transceiver
La méthode de codage des bits composant la trame est de type « NRZ ». A chaque bit généré correspond un niveau de tension.
Les transceivers assurent la création des états Récessifs (1 logique) ou Dominants (0 logique) en appliquant sur le bus les niveaux de tension décrits ci-après. C’est la valeur de la tension différentielle appliquée sur le bus qui représente l’état souhaité .
1.3 Trame CAN
Le bus CAN est capable de véhiculer quatre types de trames :
- Trame de données (voir description ci-dessous)
- Trame de questionnement (remote frame)
- Trame d’erreur (error frame)
- Trame de surcharge (overload frame)
L’idée n’étant pas de commenter complètement le bus CAN j’arrête là la description du bus pour passer à son exploitation.
2. Exploitation du bus CAN avec le microcontrôleur PSOC5
2.1 Module transceiver
Afin d’interfacer correctement le contrôleur CAN présent dans le microcontrôleur, un module transceiver est nécessaire. Il est bien sur possible de le câbler directement sur la carte LAB du kit. J’ai préféré une réalisation offrant plus de modularité.
Le transceiver employé (TJA1050) a été implanté sur un circuit imprimé sur lequel existe la possibilité de placer les résistances de terminaison du bus (2 x 60 Ohms). Les documents nécessaires à la réalisation de cette interface sont accessibles :
L’exploitation proposée consiste à réaliser un émetteur ainsi qu’un récepteur. Toutes les déclinaisons/exploitations sont ensuite possibles.
2.2 L’émetteur, construction du projet
Le top design (PSOC Creator 1.0)
Il faut ajouter au top design le composant contrôleur CAN (renommé ici CAN_TX).
Il faut ensuite le configurer.
Arbitrairement le choix a été fixé à une vitesse de transmission de 500kb/s et 1 octet de champ de donnée.
1. Imposer le nom du contrôleur CAN
2. ôter l’option du signal de validation du transceiver (on ne se servira que des broches RX et TX))
3. Sélectionner l’option Automatic
1. Choisir la vitesse de transmission
2. Sélectionner le timing désiré (double clic). Les champs de la ligne "3" seront complétés automatiquement.
Pas de manipulation ici, sauf si des besoins d’interruptions supplémentaires sont nécessaires.
1. Modification de DLC = 1 (longueur de donnée à transmettre ici, 1 octet)
2. Changement du nom de la case "mailbox" (champ de données) à transmettre.
3. Identification du noeud emetteur (codé sur 11bits _Full_ en mode IDE il est possible de coder l’identifiant sur 29 bits), choisi arbitrairement à 0x005.
Chaque "MailBox" peut contenir jusqu’à 8 octets à transmettre. Les variables permettant de compléter ces "mailboxes" sont identifiées ainsi dans la fonction CAN_TX_TX_RX_func.c (voir après) :
Pour la "mailbox0" (ici renommée TX_Message), la variable "container" est :
CAN_TX_TX_DATA_BYTE1(0).
Elle contient le premier octet à transmettre. Cela nous suffit puisque DLC=1. Si on avait désiré transmettre plus d’octets (DLC = 2 par exemple), il aurait fallu employer deux variables CAN_TX_TX_DATA_BYTE1(0) et CAN_TX_TX_DATA_BYTE2(0).
A ce stade il convient d’assigner les broches de l’afficheur ainsi que du contrôleur.
Il faut à présent construire le projet "Shift F6" et compléter le programme principal ainsi que la fonction CAN_TX_TX_RX_func.c qui a été générée
2.3 Programmation de l’émetteur
Le projet complet du transmetteur.
2.3.1 main.c
2.3.2 Modification de la fonction CAN_TX_TX_RX_func.c
A ce stade il reste à programmer le composant. C’est terminé pour la partie émetteur.
2.4 Le récepteur, construction du projet
Le top design (PSOC Creator 1.0)
Il faut ajouter au top design le composant contrôleur CAN (renommé ici CAN_RX).
Il faut ensuite le configurer afin qu’il puisse communiquer avec le module émetteur déjà mis au point.
(vitesse de transmission de 500kb/s et 1 octet de champ de donnée)
Les trois premières parties de la configuration du contrôleur sont identiques à celles de l’émetteur (General, Timing, Interrupt). Seule la partie "Receive Buffer" est à modifier .
1. L’identifiant choisi est celui de l’émetteur dont on souhaite recevoir les données...donc 0x005.
2. Le nom "0" du champ "mailbox" est changé pour RX_Message. Cela permettra de créer une fonction de traitement de réception facilement identifiable.
Cette fonction sera nommée (on le verra après) "CAN_RX_ReceivedMsgRX_Message()" et sera exécuté dès que l’interruption IRQ aura lieu (réception d’un octet).
C’est dans la variable CAN_RX_RX_DATA_BYTE1(0), correspondante à la "mailbox0" que se retrouvera la donnée reçue.
A ce stade il convient d’assigner les broches de l’afficheur ainsi que du contrôleur.
Il faut à présent construire le projet "Shift F6" et compléter le programme principal ainsi que la fonction CAN_RX_TX_RX_func.c qui a été générée.
2.5 Programmation du récepteur
Le projet complet du récepteur.
2.5.1 main.c
2.5.2 Modification de la fonction CAN_RX_TX_RX_func.c
3. Au Final
Connecter les transceivers sur les deux kits ainsi qu’un câble CAN (ce qui n’est pas le cas sur la photo...). Tout devrait fonctionner parfaitement.
Nota : Comme les deux noeuds (émetteur et récepteur) terminent le bus, j’ai activé les résistances de terminaison (120 Ohms) des modules transceivers.
Quelques photographies...
Laurent Proust 2013