Le bus CAN est-il difficile? Il est impossible de ne pas comprendre le bus CAN!

CAN (Controller Area Network) est un réseau de zone de contrôleur, qui est un réseau de communication série qui peut réaliser un contrôle distribué en temps réel.

Quand on pense à CAN, il faut penser à la société allemande Bosch, car CAN est développé par cette société (et Intel). CAN possède de nombreuses excellentes fonctionnalités qui le rendent largement utilisé. Par exemple: la vitesse de transmission est jusqu'à 1 Mbps, la distance de communication est jusqu'à 10 km, mécanisme d'arbitrage de bits sans perte, structure multi-maître.

Ces dernières années, les prix des contrôleurs CAN sont devenus de plus en plus bas, et de nombreux MCU ont également intégré des contrôleurs CAN. Désormais, chaque voiture est équipée d'un bus CAN.

Un scénario d'application CAN typique:

Norme de bus CAN

La norme de bus CAN spécifie uniquement la couche physique et la couche liaison de données, et la couche application définie par l'utilisateur est requise. Les différentes normes CAN ne diffèrent que par la couche physique.

L'émetteur-récepteur CAN est responsable de la conversion entre les niveaux logiques et les signaux physiques.

Convertissez un signal logique en signal physique (niveau différentiel) ou convertissez un signal physique en un niveau logique.

Il existe deux normes CAN, à savoir IOS11898 et IOS11519, qui ont des caractéristiques de niveau différentiel différentes.

L'amplitude des niveaux haut et bas est faible et la vitesse de transmission correspondante est rapide;

* Le mode commun paire torsadée élimine les interférences car le niveau change en même temps et la différence de tension reste inchangée.

Couche physique

CAN a trois périphériques d'interface

Lorsque plusieurs nœuds sont connectés, tant que l'un d'entre eux est au niveau bas, le bus est au niveau bas, et seulement lorsque tous les nœuds sortent au niveau haut, il est au niveau haut. La soi-disant «ligne et».

Une fois que le bus CAN a 5 bits identiques consécutifs, insérez un bit opposé pour générer un front de transition pour la synchronisation. Élimine ainsi les erreurs accumulées.

Comme 485 et 232, la vitesse de transmission du CAN est inversement proportionnelle à la distance.

Bus CAN, connexion par résistance terminale:

Pourquoi est-ce 120Ω, car l'impédance caractéristique du câble est 120Ω, afin de simuler une ligne de transmission infinie

couche de liaison de données

La transmission du bus CAN est une trame CAN, la trame de communication CAN est divisée en cinq types, à savoir la trame de données, la trame distante, la trame d'erreur, la trame de surcharge et l'intervalle de trame.

Les trames de données sont utilisées pour envoyer et recevoir des données entre les nœuds, et sont le type de trame le plus utilisé; les trames distantes sont utilisées pour recevoir des données d'un noeud récepteur vers un noeud émetteur; les trames d'erreur sont des trames utilisées pour notifier d'autres noeuds lorsqu'un noeud trouve un erreur de trame; les trames de surcharge sont une trame utilisée par le nœud de réception pour informer le nœud d'envoi de sa capacité de réception; une trame utilisée pour isoler les trames de données et les trames distantes des trames précédentes.

La trame de données est divisée en trame standard (2.0A) et trame étendue (2.0B) en fonction de la longueur de la section d'arbitrage

Début du cadre


Le début de la trame est composé d'un bit dominant (niveau bas), le nœud émetteur envoie le début de la trame et les autres nœuds sont synchronisés avec le début de la trame;

La fin de la trame est constituée de 7 bits invisibles (haut niveau).

Section d'arbitrage

Comment le bus CAN résout-il le problème de la concurrence multipoint?

La réponse est donnée par la section d'arbitrage.

Le contrôleur de bus CAN surveille le niveau du bus lors de l'envoi des données. Si les niveaux sont différents, il arrête l'envoi et effectue d'autres traitements. Si le bit est dans la section d'arbitrage, il sortira de la compétition de bus; s'il se trouve dans d'autres sections, un événement d'erreur sera généré.

Plus l'ID de trame est petit, plus la priorité est élevée. Puisque le bit RTR de la trame de données est au niveau dominant et que la trame distante est au niveau récessif, si le format de la trame et l'ID de trame sont identiques, la trame de données a la priorité sur la trame distante; puisque le bit IDE du la trame standard est au niveau dominant, Le bit IDE de la trame étendue est invisible. Pour les trames standard et les trames étendues avec le même ID dans les 11 premiers bits, la priorité de la trame standard est supérieure à celle de la trame étendue.

Section de contrôle

Il y a 6 bits au total. La section de contrôle de la trame standard est composée du bit d'indicateur de trame étendu IDE, du bit réservé r0 et du code de longueur de données DLC; la section de contrôle de trame étendue est composée de l'IDE, r1, r0 et DLC.

Segment de données

0-8 octets, structure de trame courte, bonnes performances en temps réel, adaptées aux domaines de contrôle automobile et industriel;

Stade CRC

Le segment de contrôle CRC est composé d'une valeur CRC de 15 bits et d'un délimiteur CRC.

Étape ACK

Lorsqu'il n'y a pas d'erreur du début de la trame reçue par le nœud récepteur vers le segment CRC, il enverra un niveau dominant dans le segment ACK, le nœud émetteur enverra un niveau récessif, et la ligne et le résultat seront dominants niveau.

Cadre à distance

La trame distante est divisée en 6 segments, qui sont également divisés en trames standard et trames étendues, et le bit RTR est 1 (niveau récessif)

CAN est un bus très fiable, mais il comporte également cinq erreurs.

Erreur CRC: cette erreur se produit lorsque les valeurs CRC envoyées et reçues sont différentes;

Erreur de format: l'erreur se produit lorsque le format de trame est illégal;

Erreur de réponse: cette erreur se produit lorsque le nœud d'envoi ne reçoit pas le message de réponse dans la phase ACK;

Erreur d'envoi de bits: le nœud d'envoi constate que le niveau de bus ne correspond pas au niveau d'envoi lors de l'envoi d'informations, et cette erreur se produit;

Erreur de bourrage de bits: cette erreur se produit lorsque les règles de communication sont violées sur le câble de communication.

Lorsque l'une de ces cinq erreurs se produit, le nœud d'envoi ou le nœud de réception enverra une trame d'erreur

Afin d'éviter que certains nœuds ne commettent des erreurs et envoient des trames d'erreur tout le temps, interférant avec la communication d'autres nœuds, le protocole CAN stipule 3 états et comportements des nœuds

Cadre de surcharge

Lorsqu'un nœud n'est pas prêt à recevoir, il enverra une trame de surcharge pour notifier le nœud d'envoi.

Intervalle d'images

Il est utilisé pour isoler les trames de données, les trames distantes et les trames avant eux, et aucun intervalle de trame n'est ajouté avant les trames d'erreur et les trames de surcharge.

Construire un nœud CAN

Construisez un nœud pour réaliser le contrôle correspondant. Il est divisé en quatre parties de bas en haut: circuit de nœud CAN, pilote de contrôleur CAN, protocole de couche d'application CAN, programme d'application de nœud CAN.

Bien que les fonctions exécutées par différents nœuds soient différentes, elles ont toutes la même structure matérielle et logicielle.

 

L'émetteur-récepteur CAN et le contrôleur correspondent respectivement à la couche physique et à la couche liaison de données du CAN pour compléter l'envoi et la réception des messages CAN; le circuit fonctionnel remplit des fonctions spécifiques, telles que l'acquisition de signaux ou les périphériques de contrôle; le contrôleur principal et le logiciel d'application suivent Le format de message analyse le message et termine le contrôle correspondant.

Le pilote matériel CAN est un programme exécuté sur le contrôleur principal (tel que P89V51). Il accomplit principalement les tâches suivantes: opérations basées sur les registres, initialisation du contrôleur CAN, envoi de messages CAN et réception de messages CAN;

Si vous utilisez directement le pilote matériel CAN, vous devez modifier le programme d'application supérieur lorsque vous changez de contrôleur, ce qui est de mauvaise portabilité. L'ajout d'une couche de lecteur virtuel à la couche application et à la couche de lecteur matériel peut protéger les différences entre les différents contrôleurs CAN.

En plus de compléter la fonction de communication, un nœud CAN comprend également certains circuits de fonctions matérielles spécifiques. Les fonctions spécifiques incluent l'acquisition de signaux, l'affichage homme-machine, etc.

L'émetteur-récepteur CAN consiste à réaliser l'échange du niveau logique du contrôleur CAN et du niveau différentiel sur le bus CAN. Il existe deux schémas de mise en œuvre des émetteurs-récepteurs CAN, l'un consiste à utiliser un émetteur-récepteur CAN IC (besoin d'ajouter une isolation d'alimentation et une isolation électrique), et l'autre consiste à utiliser un module d'émetteur-récepteur d'isolation CAN. Le deuxième type est recommandé.

Le contrôleur CAN est le composant central du CAN, il implémente toutes les fonctions de la couche liaison de données dans le protocole CAN et peut compléter automatiquement l'analyse du protocole CAN. Il existe généralement deux types de contrôleurs CAN, l'un est le contrôleur IC (SJA1000) et l'autre est le MCU (LPC11C00) intégré au contrôleur CAN.

Le MCU est responsable du contrôle du circuit fonctionnel et du contrôleur CAN: lorsque le nœud est démarré, il initialise les paramètres du contrôleur CAN; lit et envoie des trames CAN via le contrôleur CAN; lorsque le contrôleur CAN est interrompu, gère l'exception d'interruption du contrôleur CAN; Sortie des signaux de commande en fonction des données reçues;

 

Logique de gestion d'interface: interpréter les instructions MCU, adresser les unités de registre de chaque module fonctionnel dans le contrôleur CAN et fournir des informations d'interruption et des informations d'état au contrôleur principal.

Le tampon d'émission et le tampon de réception peuvent stocker les informations complètes sur le réseau de bus CAN.

Le filtrage d'acceptation consiste à comparer le code de vérification stocké avec le code d'identification de message CAN, et seule la trame CAN qui correspond au code de vérification sera stockée dans le tampon de réception.

Le cœur CAN implémente tous les protocoles de la liaison de données.

Vue d'ensemble de la couche d'application du protocole CAN

Le bus CAN ne fournit que des services de transmission fiables. Ainsi, lorsqu'un nœud reçoit un message, il doit utiliser le protocole de la couche application pour déterminer qui a envoyé les données et ce que la signification des données représente. Les protocoles courants de la couche application CAN sont: CANOpen, DeviceNet, J1939, iCAN, etc.

Le pilote de protocole de la couche application CAN est un programme exécuté sur le contrôleur principal (tel que P89V51). Il définit le message CAN selon le protocole de la couche application et complète l'analyse et l'assemblage du message CAN. Par exemple, nous utilisons l'ID de trame pour indiquer l'adresse de nœud. Lorsque l'ID de trame reçue ne transmet pas le propre ID de nœud, il est directement ignoré, sinon il est transmis à la couche supérieure pour traitement; lors de l'envoi, l'ID de trame est défini sur l'adresse du nœud de réception.

Émetteur-récepteur CAN

Il existe de nombreux modes de sortie du SJA1000, le plus utilisé est le mode de sortie normal, le mode d'entrée ne sélectionne généralement pas le mode comparateur, ce qui peut augmenter la distance de communication et réduire le courant en veille.

Selon la vitesse de communication, l'émetteur-récepteur est divisé en émetteur-récepteur CAN haute vitesse et émetteur-récepteur CAN à tolérance de panne.

Le même émetteur-récepteur CAN doit être utilisé dans le même réseau.

Il y aura de nombreux signaux d'interférence sur la ligne de connexion CAN, et il est nécessaire d'ajouter des filtres et des circuits anti-interférences au matériel

 

Un émetteur-récepteur d'isolement CAN (filtre intégré et circuit anti-interférence) peut également être utilisé.

Mode de connexion du contrôleur CAN et MCU


Le SJA1000 peut être considéré comme une RAM externe, la largeur d'adresse est de 8 bits et il prend en charge jusqu'à 256 registres

#define REG_BASE_ADDR 0xA000 // 寄存器基址
unsigned char *SJA_CS_Point = (unsigned char *) REG_BASE_ADDR ;

// 写SJA1000寄存器
void WriteSJAReg(unsigned char RegAddr, unsigned char Value) {
*(SJA_CS_Point + RegAddr) = Value;
return;
}

// 读SJA1000寄存器
unsigned char ReadSJAReg(unsigned char RegAddr) {
 return (*(SJA_CS_Point + RegAddr));
}

 

 

 

Ecrire les données dans le tampon dans le registre en continu

…… for (i=0;i<len;i++) { WriteSJAReg(RegAdr+i,ValueBuf[i]);  }……

Lire en continu plusieurs registres dans le tampon

……for (i=0;i<len;i++) {  ReadSJAReg(RegAdr+i,ValueBuf[i]);   }……

 

 

Le fichier d'en-tête contient le schéma:

  1. Chaque programme contient les fichiers d'en-tête utilisés

  2. Chaque programme contient un fichier d'en-tête commun, qui comprend tous les autres fichiers d'en-tête

#ifndef __CONFIG_H__ // 防止头文件被重复包含
#define __CONFIG_H__
#include <8051.h>         // 包含80C51寄存器定义头文件
#include "SJA1000REG.h"         // 包含SJA1000寄存器定义头文件

// 定义取字节运算
#define LOW_BYTE(x)  (unsigned char)(x)
#define HIGH_BYTE(x)  (unsigned char)((unsigned int)(x) >> 8)

// 定义振荡器时钟和处理器时钟频率(用户可以根据实际情况作出调整)
#define OSCCLK 11059200UL
// 宏定义MCU的时钟频率
#define CPUCLK (OSCCLK / 12)
#endif // __CONFIG_H__

Le SJA1000 est en état de réinitialisation après la mise sous tension et doit être initialisé avant de pouvoir fonctionner.

(1) Réglez le bit 0 du registre de mode pour entrer dans le mode de réinitialisation;

(2) Réglez le registre de division de fréquence d'horloge pour sélectionner la fréquence d'horloge et le mode CAN;

(3) Définir le filtre d'acceptation, définir le code de vérification et le code de blindage;

(4) Réglez les registres de minuterie de bus 0 et 1 pour régler la vitesse de transmission CAN;

(5) Réglez le mode de sortie;

(6) Effacer Bit0 du registre de mode pour quitter le mode de réinitialisation;

Registre de mode


 

Mode détection uniquement: SJA1000 ne vérifie pas le bit de réponse lors de l'envoi de trames CAN;

Mode écoute seule: dans ce mode, le SJA1000 n'enverra pas de trames d'erreur pour la détection automatique du débit en bauds; le SJA1000 reçoit les trames CAN à des débits en bauds différents. Lorsque les trames CAN sont reçues, il indique le même débit en bauds et le débit en bauds du bus.

Réglage de la vitesse de transmission

Le bus CAN n'a pas d'horloge et utilise une transmission série asynchrone, le débit en bauds correspond aux bits de données envoyés en 1 seconde;

 

Transmission de trame CAN:

Étapes pour envoyer une trame CAN: 1. Vérifiez le registre d'état et attendez que le tampon d'envoi soit disponible;

2. Remplissez le message dans le tampon d'envoi;

3. Commencez à envoyer.

 

SJA1000 a un tampon de 12 octets, le message à envoyer peut être écrit via le registre 16-28, ou écrit ou lu via le registre 96-108

 

 

 

Définir le mode d'envoi

char SetSJASendCmd(unsigned char cmd) {
unsigned char ret;
switch (cmd) {
default:
case 0:
        ret = SetBitMask(REG_CAN_CMR, TR_BIT); //正常发送
break;
case 1:
        ret = SetBitMask(REG_CAN_CMR, TR_BIT|AT_BIT); //单次发送
break;
case 2:
        ret = SetBitMask(REG_CAN_CMR, TR_BIT|SRR_BIT);//自收自发
break;
case 0xff:
        ret = SetBitMask(REG_CAN_CMR, AT_BIT);//终止发送
break;
    }
return ret;
}

 Fonction d'envoi

unsigned char SJA_CAN_Filter[8] = {    // 定义验收滤波器的参数,接收所有帧       
0x00, 0x00, 0x00, 0x00,                                                
// ACR0~ACR3       
0xff, 0xff, 0xff, 0xff                                                         
// AMR0~AMR3
};
unsigned char STD_SEND_BUFFER[11] = {   // CAN 发送报文缓冲区       
0x08,   // 帧信息,标准数据帧,数据长度 = 8       
0xEA, 0x60, // 帧ID = 0x753
0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa  // 帧数据
};
void main(void) // 主函数,程序入口{       
    timerInit();// 初始化
    D1 = 0;       
    SJA1000_RST = 1; // 硬件复位SJA1000       
    timerDelay(50); // 延时500ms       
    SJA1000_RST = 0;       
    SJA1000_Init(0x00, 0x14, SJA_CAN_Filter);   // 初始化SJA1000,设置波特率为1Mbps       
    // 无限循环,main()函数不允许返回      
    for(;;) {           
        SJASendData(STD_SEND_BUFFER, 0x0);           
        timerDelay(100);         // 延时1000ms      
    }    
}

Pourquoi l'ID de trame est 0x753? Ceci est lié au format de stockage de la trame CAN dans le tampon.

 

 

La résistance terminale est très importante: lorsque la vitesse de transmission est élevée et que la résistance terminale n'est pas ajoutée, le dépassement du signal est très grave.

 

Le SJA1000 dispose d'un tampon de réception de 64 octets (FIFO), ce qui peut réduire les exigences du MCU. MCU peut confirmer que SJA1000 lit le message après avoir reçu le message par requête ou interruption.

1. Les alternatives fabriquées au niveau national sont-elles intangibles? Revenez à la Zhaoyi Innovation Live Class!

2. Le RISC-V open source peut-il devenir l'antidote à la «pénurie de noyau» en Chine?

3. Raspberry Pi Pico: MCU pour seulement 4 $

4. Il y a de nombreuses raisons pour lesquelles MCU prend en charge la fonction AI ~

5. En 2020, j'ai appris 20 principes de génie logiciel ~

6. L'application des idées de machine d'état dans le développement intégré ~

Avertissement: cet article est reproduit en ligne et le droit d'auteur appartient à l'auteur original. Si vous êtes impliqué dans des problèmes de droits d'auteur, veuillez nous contacter, nous confirmerons le droit d'auteur sur la base des documents de certification des droits d'auteur que vous fournissez et paierons la rémunération de l'auteur ou supprimerons le contenu.

Je suppose que tu aimes

Origine blog.csdn.net/DP29syM41zyGndVF/article/details/113749928
conseillé
Classement