CANバスプロトコルの概要

kkohlhase

CANはController Area Networkの略です。このタイプの通信は、いくつかのタイプのシステム内にあり、最も一般的なのは自動車です。これらのシステムは、通常、相互に有線で通信するコントローラ(マイクロプロセッサ/マイクロコントローラ)で構成されています。無線通信を可能にするプロトコルや方式もありますが、有線の方が圧倒的に一般的です。CAN Busは、SPI、I2C、USBなどとは異なり、データ通信の方式が大きく異なります。CANバスは、差動電圧レベルで動作します。

CANwaveForm

通信に使われる電線は2本で、同時にデータを送信します。それらはCAN Hi(ハイ)、CAN Lo(ロー)と呼ばれ、それぞれのコントローラ(CAN Nodeと呼ぶ)で解釈される電圧レベルが異なります。CAN Hiは通常2.5V~3.75V、CAN Loは1.25V~2.5Vを示します。両方のラインが2.5Vを示したとき、信号は 「リセッシブ(Recessive)」と呼ばれ、2進数の値1と等価になります。CAN Hiが3.75V、CAN Loが1.25Vのとき、信号は「ドミナント(Dominant)」と呼ばれ、2進数の値0と等価になります。 概念的には、0がLowで1がHighのデジタルロジックの話をしても意味がないかもしれませんが、このプロトコルは1の値よりも0の値を探しているのです。つまり、このドライバのロジックは一般的なデジタルロジックの解釈とは逆なのです。

基本配線図

CANbusWireFormat

配線には、プロトコルに特有の部分があります。CANバスが単線プロトコルと比較して優れている点は、他のノードに影響を与えることなくノードの接続を切断できることです。特定のノードでCAN HiまたはCAN Loが切断されても、システムの他の部分はそれを気にせず、他のノードにデータを送信することができます。システムによっては、メインラインがダウンした場合、1つのラインでデータを伝送できる場合がありますが、これは会社によって異なります(すべてのシステムがCAN HiまたはCAN Loラインがダウンしても動作するわけではありません)。しかし、120Ωの抵抗には2つの目的があるため、ラインの切断に対応できるシステムでは、パフォーマンスが低下します。まず、Hi-Lo間の差分電圧を提供し、そして、より高い周波数を持つシステムのためのインピーダンスを整合させます。このプロトコルは、差動電圧で最もよく機能します。 また、交差した線(ツイストペア)には2つの目的があります。まず、外部からのEMI放射を遮断する効果があります。第二に、プロトコルが高速でデータを伝送する際のEMIの問題にも対応します。

他の線がないことに注意してください。これは、パケット(メッセージ)がすべてのノードに同時に送信されることを意味します。CANメッセージのデータフレームには「アドレス」は存在しませんが、データフレームには、ユーザーが定義した特定のメッセージの優先順位とともに、各ノードが受け入れるもの、拒否するものを決定するメソッドが存在します。他のメッセージとの衝突を避けるために、データにはビットが設定されている必要があり、その問題を回避するためにCANバスでは優先順位が重要な鍵を握っています。

CANバスのデータフォーマット

すべてのプロトコルと同様に、データは規格によって定義された方法で構成されます。CANバスのプロトコルはCAN2.0から始まり、ISO11898で更新され、現在も開発が続けられています(より長いメッセージのための拡張版プロトコルが存在します)。CANフレーム全体は、通常14バイトの長さです。CANメッセージの内訳は以下のとおりです。

CANMsgFrame

  • SOF(Start of Frame):新しいCANメッセージの開始を示し、バス上の他のノードに同期をとることを促します。
  • 調停フィールド(arbitration field)は、11 ビットの IDとRTR(remote transit request)1 ビットを含む識別子で、他のノードに情報を要求する場合はドミナントに設定されます。IDは他のノードが考慮するコンテキストなので、各ノードがメッセージを処理するかどうかに関係なく確認します。 IDは「トピック」のように振る舞う擬似的なアドレスとお考えください。他のノードが「トピック」に関心を持たなければ、そのメッセージは無視されます。それだけでなく、IDは衝突回避のための優先順位も決定します。通信が同時に発生した場合、ノードはまず回線がアイドル状態(リセッシブ)になるのを待ちます。一方のノードがリセッシブ、他方がドミナントレベルを出力した場合、常にドミナント電圧が優先されます。以下に例を示します。
例:

ノード1 メッセージ:0011 0110 0000…
ノード2 メッセージ:0010 1000 1100…

左から右へデータは送信され、ビット4のドミナント「0」が発生するため、ノード2のメッセージの4番目のビットが先に送信されることになります。ノード1はこれを感知してメッセージの送信を中止し、回線がアイドルになるのを待ちます。

  • R0は今後の開発用です。
  • データ長コード(data length code)は、半バイトの長さで、データフィールドで実際に送信されるデータの長さを示します。
  • データフィールド(data fields)には、プログラミングのために他のノードに送信したい必要なデータが含まれています。
  • CRC(Cyclic Redundancy Check)は、エラー検出のためのビットです。このビットは、ドミナントレベルのエラーがない場合、上書きされます。
  • ACK(Acknowledge)は、エラーがないことを確認するためのリセッシブビットです(エラーがある場合はドミナント)。
  • EOF(End of Frame)は、CANメッセージフレームの終了を知らせる7ビットのフィールドで、ビットスタッフィング(同期データ)を無効にするものです。
  • iFS(interframe space:フレーム間スペース)も7ビットのフィールドで、受信ノードが情報を別のバッファに移動できるようにするための遅延として機能します。
CANメッセージフレームには、5つのエラー訂正の仕組みがあります。2つはビットレベル、3つはメッセージレベルです。ビットモニタとビットスタッフィングはビットレベルです。ビットモニタは各ノードで行われ、どこかにエラーがないか監視し(調停フィールドで行われる)、エラーがあれば特定の方法でフラグが立てられます。もう1つのビットレベルのエラー訂正は、ビットスタッフィングです。これは、メッセージで同じレベルのビットが5つ送信された場合、反対のレベル(RまたはD)を6番目のビットに追加し、これにより送信機と同期をとることができます。これは、各ノードがこの余分なビットを期待しているため、受信機で簡単に取り除くことができます。

メッセージレベルのメカニズムとしては、フレームチェックとCRC/ACKフィールドの2つがあります。フレームチェックは、CANの全パートが存在するか、ACKとCRCの後にリセッシブビットがあるかどうかを確認します。エラーがある場合、2つの閾値があります。最初のエラーが発生すると、1つのビットがフラグとしてドミナントに設定され、ノードのカウンタがインクリメントされます。カウンタが1しかない場合、リセッシブエラーフラグが送信され、バス上のトラフィックは通常通り継続されます。しかし、カウンタが2になった場合、重大なエラーを示し、そのノードは停止します。エラーなく正常にメッセージが送信された場合、カウンタの数値は下がります。

CANバスをご自分で実験したい場合は、いくつかの評価ボードがあります。

  1. https://www.digikey.jp/short/q3bvn8z8
  2. https://www.digikey.jp/short/534jh5w5
  3. https://www.digikey.jp/short/pdfpfwr2



オリジナル・ソース(English)