CANバスは難しいですか?CANバスを理解できないことは不可能です!

CAN(コントローラーエリアネットワーク)は、分散型リアルタイム制御を実現できるシリアル通信ネットワークであるコントローラーエリアネットワークです。

CANについて考えるとき、CANはこの会社(およびIntel)によって開発されているため、ドイツの会社Boschを考える必要があります。CANには、広く使用されるようにする多くの優れた機能があります。例:伝送速度は最大1Mbps、通信距離は最大10km、ロスレスビットアービトレーションメカニズム、マルチマスター構造。

近年、CANコントローラーの価格はどんどん低くなっており、多くのMCUにもCANコントローラーが組み込まれています。現在、すべての車にCANバスが装備されています。

典型的なCANアプリケーションのシナリオ:

CANバス規格

CANバス規格では、物理層とデータリンク層のみが指定されており、ユーザー定義のアプリケーション層が必要です。異なるCAN規格は、物理層のみが異なります。

CANトランシーバーは、論理レベルと物理信号間の変換を担当します。

論理信号を物理信号(差動レベル)に変換するか、物理信号を論理レベルに変換します。

2つのCAN規格、つまりIOS11898とIOS11519があり、これらは異なる差動レベル特性を持っています。

高レベルと低レベルの振幅は低く、対応する伝送速度は高速です。

*ツイストペアコモンモードでは、レベルが同時に変化し、電圧差が変化しないため、干渉が排除されます。

物理層

CANには3つのインターフェースデバイスがあります

複数のノードが接続されている場合、そのうちの1つがローである限り、バスはローであり、すべてのノードがハイを出力する場合にのみバスはハイになります。いわゆる「ラインと」。

CANバスに5つの連続した同一ビットができたら、反対のビットを挿入して同期用の遷移エッジを生成します。これにより、蓄積されたエラーを排除します。

485や232と同様に、CANの伝送速度は距離に反比例します。

CANバス、端子抵抗接続:

無限の伝送線路をシミュレートするために、ケーブルの特性インピーダンスが120Ωであるため、なぜ120Ωなのですか。

データリンク層

CANバス伝送はCANフレームであり、CAN通信フレームはデータフレーム、リモートフレーム、エラーフレーム、オーバーロードフレーム、フレーム間隔の5種類に分けられます。

データフレームは、ノード間でデータを送受信するために使用され、最も使用されるフレームタイプです。リモートフレームは、受信ノードから送信ノードにデータを受信するために使用されます。エラーフレームは、ノードがフレームエラー。過負荷フレームは、受信ノードが受信機能を送信ノードに通知するために使用するフレームです。データフレームとリモートフレームを前のフレームから分離するために使用されるフレームです。

データフレームは、アービトレーションセクションの長さに応じて、標準フレーム(2.0A)と拡張フレーム(2.0B)に分けられます。

フレームの開始


フレーム開始はドミナントビット(ローレベル)で構成され、送信ノードはフレーム開始を送信し、他のノードはフレーム開始と同期されます。

フレームの終わりは、7つの非表示ビット(高レベル)で構成されます。

仲裁セクション

CANバスはマルチポイント競争の問題をどのように解決しますか?

答えは仲裁セクションによって与えられます。

CANバスコントローラーは、データの送信中にバスレベルを監視し、レベルが異なる場合は送信を停止し、その他の処理を実行します。ビットがアービトレーションセクションにある場合、バスコンペティションを終了します。他のセクションにある場合、エラーイベントが生成されます。

フレームIDが小さいほど、優先度が高くなります。データフレームのRTRビットはドミナントレベルであり、リモートフレームはリセッシブレベルであるため、フレームフォーマットとフレームIDが同じである場合、データフレームはリモートフレームよりも優先されます。標準フレームがドミナントレベルであり、拡張フレームのIDEビットは表示されません。標準フレームと最初の11ビットで同じIDを持つ拡張フレームの場合、標準フレームの優先度は拡張フレームの優先度よりも高くなります。

コントロールセクション

標準フレームの制御部は拡張フレームフラグビットIDE、予約ビットr0、データ長コードDLCで構成され、拡張フレーム制御部はIDE、r1、r0、DLCで構成されています。

データセグメント

0〜8バイト、短いフレーム構造、優れたリアルタイムパフォーマンス、自動車および産業用制御分野に適しています。

CRC段

CRCチェックセグメントは、15ビットのCRC値とCRC区切り文字で構成されています。

ACK段

受信ノードが受信したフレームの先頭からCRCセグメントにエラーがない場合、ACKセグメントでドミナントレベルを送信し、送信ノードはリセッシブレベルを送信し、回線と結果がドミナントになります。レベル。

リモートフレーム

リモートフレームは6つのセグメントに分割され、これらも標準フレームと拡張フレームに分割され、RTRビットは1(劣性レベル)です。

CANは非常に信頼性の高いバスですが、5つのエラーもあります。

CRCエラー:このエラーは、送信されたCRC値と受信されたCRC値が異なる場合に発生します。

フォーマットエラー:フレームフォーマットが不正な場合にエラーが発生します。

応答エラー:このエラーは、送信ノードがACKフェーズで応答メッセージを受信しない場合に発生します。

ビット送信エラー:送信ノードは、情報を送信するときにバスレベルが送信レベルと一致しないことを検出し、このエラーが発生します。

ビットスタッフィングエラー:このエラーは、通信ケーブルの通信ルールに違反した場合に発生します。

これらの5つのエラーのいずれかが発生すると、送信ノードまたは受信ノードはエラーフレームを送信します

CANプロトコルは、一部のノードが常にミスを犯してエラーフレームを送信し、他のノードの通信を妨害することを防ぐために、ノードの3つの状態と動作を規定しています。

フレームの過負荷

ノードが受信する準備ができていない場合、ノードは過負荷フレームを送信して送信ノードに通知します。

フレーム間隔

これは、データフレーム、リモートフレーム、およびそれらの前のフレームを分離するために使用され、エラーフレームとオーバーロードフレームの前にフレーム間隔は追加されません。

CANノードを構築する

対応する制御を実現するノードを構築します。下から上に、CANノード回路、CANコントローラードライバー、CANアプリケーション層プロトコル、CANノードアプリケーションプログラムの4つの部分に分かれています。

異なるノードによって実行される機能は異なりますが、それらはすべて同じハードウェアおよびソフトウェア構造を持っています。

 

CANトランシーバーとコントローラーはそれぞれCANの物理層とデータリンク層に対応し、CANメッセージの送信と受信を完了します。機能回路は信号取得や制御周辺機器などの特定の機能を完了します。メインコントローラーとアプリケーションソフトウェアは次のようになります。メッセージフォーマットはメッセージを解析し、対応する制御を完了します。

CANハードウェアドライバーは、メインコントローラー(P89V51など)で実行されるプログラムです。主に次のタスクを実行します。レジスタベースの操作、CANコントローラーの初期化、CANメッセージの送信、CANメッセージの受信。

CANハードウェアドライバを直接使用する場合は、コントローラを変更する際に上位のアプリケーションプログラムを変更する必要があり、移植性に劣ります。仮想ドライブ層をアプリケーション層とハードウェアドライブ層に追加すると、異なるCANコントローラー間の違いを防ぐことができます。

CANノードには、通信機能の完了に加えて、特定のハードウェア機能回路も含まれています。機能回路は、下向きの直接制御機能回路を駆動し、上向きは、アプリケーション層の制御機能回路機能インターフェイスを提供します。特定の機能には、信号取得、マンマシンディスプレイなどが含まれます。

CANトランシーバーは、CANバス上でCANコントローラーのロジックレベルと差動レベルの交換を実現するためのものです。CANトランシーバーの実装には2つのスキームがあります。1つはCANトランシーバーICを使用する方法(電源分離と電気的分離を追加する必要があります)、もう1つはCAN分離トランシーバーモジュールを使用する方法です。2番目のタイプをお勧めします。

CANコントローラーはCANのコアコンポーネントであり、CANプロトコルのデータリンク層のすべての機能を実装し、CANプロトコルの分析を自動的に完了することができます。CANコントローラーには一般的に2種類あります。1つはコントローラーIC(SJA1000)で、もう1つはCANコントローラーと統合されたMCU(LPC11C00)です。

MCUは、機能回路とCANコントローラーの制御を担当します。ノードが起動すると、CANコントローラーパラメーターが初期化され、CANコントローラーを介してCANフレームが読み取られて送信されます。CANコントローラーが中断されると、割り込み例外が処理されます。 CANコントローラーの;受信データに応じて制御信号を出力します。

 

インターフェイス管理ロジック:MCU命令を解釈し、CANコントローラの各機能モジュールのレジスタユニットをアドレス指定し、メインコントローラに割り込み情報とステータス情報を提供します。

送信バッファと受信バッファは、CANバスネットワーク上の完全な情報を保存できます。

アクセプタンスフィルタリングは、保存されている検証コードをCANメッセージ識別コードと比較することであり、検証コードに一致するCANフレームのみが受信バッファに保存されます。

CANコアは、データリンクのすべてのプロトコルを実装します。

CANプロトコルアプリケーション層の概要

CANバスは信頼性の高い伝送サービスのみを提供するため、ノードがメッセージを受信すると、アプリケーション層プロトコルを使用して、データの送信者とデータの意味を判別する必要があります。一般的なCANアプリケーション層プロトコルは、CANO​​pen、DeviceNet、J1939、iCANなどです。

CANアプリケーション層プロトコルドライバは、メインコントローラ(P89V51など)で実行されるプログラムです。アプリケーション層プロトコルに従ってCANメッセージを定義し、CANメッセージの分析と組み立てを完了します。たとえば、フレームIDを使用してノードアドレスを示します。受信したフレームIDが自身のノードIDを渡さない場合、直接破棄されます。それ以外の場合は、処理のために上位層に渡されます。送信する場合、フレームIDは受信ノードのアドレスに設定します。

CANトランシーバー

SJA1000には多くの出力モードがあり、最もよく使用されるのは通常の出力モードです。入力モードは通常、コンパレータモードを選択しないため、通信距離が長くなり、スリープ時の電流が減少する可能性があります。

通信速度に応じて、トランシーバーは高速CANトランシーバーとフォールトトレラントCANトランシーバーに分けられます。

同じCANトランシーバーを同じネットワークで使用する必要があります。

CAN接続ラインには多くの干渉信号があり、ハードウェアにフィルターと干渉防止回路を追加する必要があります

 

CANアイソレーショントランシーバー(統合フィルターと干渉防止回路)も使用できます。

CANコントローラーとMCUの接続モード


SJA1000は外部RAMと見なすことができ、アドレス幅は8ビットで、最大256個のレジスタをサポートします。

#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));
}

 

 

 

バッファ内のデータをレジスタに継続的に書き込みます

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

複数のレジスタを継続的にバッファに読み込みます

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

 

 

ヘッダーファイルには、次のスキームが含まれています。

  1. 各プログラムには、使用されるヘッダーファイルが含まれています

  2. 各プログラムには、他のすべてのヘッダーファイルを含む共通のヘッダーファイルが含まれています

#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__

SJA1000は電源投入後にリセット状態にあり、動作する前に初期化する必要があります。

(1)モードレジスタのビット0をセットしてリセットモードに入ります。

(2)クロック周波数分周レジスタを設定して、クロック周波数とCANモードを選択します。

(3)受け入れフィルターを設定し、検証コードとシールドコードを設定します。

(4)バスタイマーレジスタ0と1を設定して、CANボーレートを設定します。

(5)出力モードを設定します。

(6)モードレジスタのビット0をクリアして、リセットモードを終了します。

モードレジスタ


 

検出専用モード:SJA1000はCANフレームを送信するときに応答ビットをチェックしません。

リッスン専用モード:このモードでは、SJA1000はボーレートの自動検出のためにエラーフレームを送信しません。SJA1000は異なるボーレートでCANフレームを受信します。CANフレームが受信されると、現在のボーレートとバスボーレートが同じであることを示します。

ボーレート設定

CANバスにはクロックがなく、非同期シリアル送信を使用します。ボーレートは1秒で送信されるデータビットです。

 

CANフレーム送信:

CANフレームを送信する手順:1。ステータスレジスタを確認し、送信バッファが使用可能になるのを待ちます。

2.メッセージを送信バッファに入力します。

3.送信を開始します。

 

SJA1000には12バイトのバッファがあり、送信されるメッセージはレジスタ16〜28を介して書き込むか、レジスタ96〜108を介して書き込みまたは読み取りを行うことができます。

 

 

 

送信モードを設定する

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;
}

 送信機能

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      
    }    
}

フレームIDが0x753である理由これは、バッファ内のCANフレームのストレージ形式に関連しています。

 

 

端子抵抗は非常に重要です。ボーレートが高く、端子抵抗が追加されていない場合、信号のオーバーシュートは非常に深刻です。

 

SJA1000には64バイトの受信バッファ(FIFO)があり、MCUの要件を減らすことができます。MCUは、クエリまたは割り込みによってメッセージを受信した後、SJA1000がメッセージを読み取ることを確認できます。

1.国産の代替品は無形ですか?Zhaoyiイノベーションライブクラスに戻ってきてください!

2.オープンソースのRISC-Vは、中国の「コア不足」に対する解毒剤になることができますか?

3. Raspberry Pi Pico:たった4ドルのMCU

4. MCUがAI機能をサポートする理由はたくさんあります〜

5. 2020年に、私が学んだ20のソフトウェアエンジニアリングの原則〜

6.組み込み開発におけるステートマシンのアイデアの適用〜

免責事項:この記事はオンラインで複製されており、著作権は原作者に帰属します。著作権の問題が発生した場合は、お問い合わせください。提供された著作権認証資料に基づいて著作権を確認し、作者の報酬を支払うか、コンテンツを削除します。

おすすめ

転載: blog.csdn.net/DP29syM41zyGndVF/article/details/113749928