CAN通信プロトコル

概要

CANは、パワートレイン系、ボディ系、オーディオ/マルチメディア系などに幅広く適用されており、事実上の業界標準として、世界中の数多くの車種に採用されています。

現在一般的に使われているCANの伝送速度は、最大500kビット/秒です。 規格の上では、SAE のクラスCに対応する最大1Mビット/秒の高速CAN(CAN-C)のほか、SAEのクラスBに対応する最大125kビット/秒の低速CAN(CAN-B)があります。

そのほか、CANには次のような特徴があります。
1.すべてのECUがマスターとして振る舞うマルチマスター方式を採用。
2.CSMA/CA(Carrier Sense Multiple Access/Collision Avoidance )方式による、優先順位に応じたバス・アクセス。
3.ライン型のバス・トポロジを採用。
4.差動電圧送信を利用して耐ノイズ性能を向上。
5.エラー検出機能とエラー時のハンドリング機能を装備。

1.CANコントローラ

CANのコントローラは送受信用のバッファを複数個持っています。 このバッファの数が少ないタイプのコントローラをBasicCAN、多いタイプをFullCANといいます。 FullCANはBasicCANに比べ処理が早く、高速通信で使用されます。BasicCANはバッファが少ない分コストが削減できます。

2.コントローラフォーマット

CANのコントローラフォーマットは標準フォーマット2.0A、拡張フォーマット2.0B パッシブ、拡張フォーマット 2.0Bアクティブの3種類があります。
CANには各ノードの識別やメッセージの優先順位の判定を行うためのID(詳細後述)が存在し、 標準フォーマット(11ビット)と拡張フォーマット(29ビット)の2種類のフォーマットがあります。
2.0Aでは標準フォーマットのみの送受信が可能です。もし拡張フォーマットを受信してしまった場合、エラーが発生してしまいます。
2.0Bパッシブは、送受信が可能なのは2.0Aと同じ標準フォーマットのみですが、拡張フォーマットを受信した場合、それを無視することでエラーを回避することができます。
2.0Bアクティブは標準フォーマットも拡張フォーマットも送受信が可能です。
現在はより多くのIDを使用できる2.0Bアクティブが主流となっています。

3.通信バス規格

CANの通信バスの規格には最大1MbpsのHigh Speed CANと、最大125kbpsのLow Speed CANという2種類があります。
両方の規格とも、ノイズの影響を受けにくくするため2本の通信線を使用しています。 しかし、Low Speed CANはHigh Speed CANに比べて通信速度が遅い代わりに、通信線に問題が発生した場合、1本の線のみで通信を行うことができます。
2種類の規格の差異はCANコントローラが吸収してくれるため、混在して使用しても問題ありません。

4.ドミナントとリセッシブ

デジタル通信においてすべてのデータは0と1で表される2進数に変換されて通信されます。
CANでは0をドミナント(Dominant:優性)、1をリセッシブ(Resessive:劣性)といいます。
通信において、複数のノードからドミナントとリセッシブが同時に送信された場合、言葉の意味通りドミナントが優先されることとなります。

5.同期とスタッフィングルール

CANは通信データがリセッシブ(1)→ドミナント(0)に変化するときに同期をとっています。
しかし、通信データが長い間同じ状態になる可能性も当然あります。そうすると、その間は同期がとれなくなってしまい、通信のタイミングが徐々にずれていってしまいます。
このような問題を回避するために、CANではスタッフィングルールという規則を設けています。
これは、同じ通信データが5ビット続いたとき、その次のデータにスタッフビットという反転ビットを入れるというルールです。こうすることにより、6ビット以上同じ通信データが続かないようにしています。

6.マルチマスタ方式 / イベントドリブン方式

マルチマスタ方式とは、バスが空いていればどのノードでもメッセージを送信することができる通信方式です。また、各ECUでネットワーク管理を行うので、ノードの自由な着脱が可能となっています。
イベントドリブン方式とは、指定されたイベント(スイッチが押された、特定のデータを受信した等)に対応して処理を行うという実行方式のことです。
つまり、CANは指定したイベントに対応してデータの送信処理を行う、自由度の高い通信方式となっています。

7.アービトレーション(調停)

マルチマスタ方式とイベントドリブン方式を組み合わせた通信方式は自由度が高い一方で、複数のECUが同時に送信処理を行ってしまい、メッセージの衝突が発生する危険性も含んでいます。 一般的なネットワークでは、衝突が起きた場合、通信をストップし、ある程度の時間を置いた後で通信を再開するという方式をとっていますが、その後繰返し衝突が発生し、長い間送信が出来ない状態が続く可能性があります。 通信ができない可能性があるということは、すなわち通信の信頼性の低下を意味します。

CANプロトコルでは信頼性の向上のため、衝突が発生した場合、アービトレーション(調停)という処理を行います。 メッセージに含まれる識別子(Identifier:ID)を使用して、衝突したノードのいずれかに送信優先権を与えることで、通信をストップさせることがないようにしています。

8.フレーム

CANは「データフレーム」「リモートフレーム」「エラーフレーム」「オーバーロードフレーム」と呼ばれる4種類のフレームを用いて通信を行います。

8.1.データフレーム

データフレームはデータを送信する転送フォーマットです。データフレームのフォーマットは標準フォーマットと拡張フォーマットの2種類があります。

8.1.1.標準フォーマット

以下は標準フォーマットのデータフレーム構造です。

・SOF(Start Of Frame):バスアイドル状態であるリセッシブからドミナントに変化することで、データフレームの送信を表し、受信側と同期をとります。

・ID(Identifier):データ内容や送信ノードの識別や、先述したアービトレーションで優先順位を決定するのに用いられます。11ビット長で構成されます。

・RTR(Remote Transmission Request):データフレームとリモートフレームの間に入り、両者の区別をします。RTRは必ずドミナントとなります。

・コントロールフィールド:予約ビットr0、r1と4ビットのDLC(Data Length Code)から構成されます。DLCは後述のデータフィールドが何バイトになるかを示します。

・データフィールド:実際の送信データです。データ長は前述のコントロールフィールドで決定されます。

・CRC(Cyclic Redundancy Check)フィールド:CRCシーケンスとCRCデリミタから構成されます。 CRCシーケンスでは、SOF、ID、コントロールフィールド、データフィールドから演算した値が送信されます。 受信側は受信したSOF、ID、コントロールフィールド、データフィールドを同じように演算し、CRCシーケンスの値と比較することで、正常にデータが受信できたかを判別します。
CRCデリミタはCRCシーケンスの終了を表し、必ずリセッシブとなります。

・ACK(Acknowledgement)フィールド:ACKスロットとACKデリミタから構成されます。
ACKスロットでは送信ノードは必ずリセッシブの送信を行います。対して、受信ノードはCRCフィールドまで正常に受信できていた場合、その確認応答としてACKスロットのタイミングでドミナントを送信します。 CANでは、同じタイミングでリセッシブとドミナントが送信された場合、ドミナントが優先されます。 つまり、ACKスロットのタイミングでドミナントとなっているということは、正常にデータが受信できた受信ノードが存在することを意味します。
ACKデリミタはACKスロットの終了を表し、必ずリセッシブとなります。

・EOF(End of Frame):データフレームの終了を表し、必ずリセッシブの7ビット長となります。

最後のITM(intermission)はフレームではありません。リセッシブの3ビットを送信し、その後バスアイドル状態となることを示します。

8.1.2.拡張フォーマット

拡張フォーマットでは、標準フォーマットのID11ビットに拡張ID18ビットが追加され、合計29ビット長のIDを表すことができます。

標準フォーマットでIDだったフィールドは、拡張フォーマットではBASE IDといいます。
BASE IDの後、リセッシブ1ビット長のSRR(Substitute Remote Request Bit)とIDE(Identifier Extention Bit)が続きます。
その後に拡張IDであるEXTENSION IDが18ビット長送信されます。
CONTROL FIELD以降は標準フォーマットと変わりません。

8.2.リモートフレーム

リモートフレームは特定のノードにデータフレームの要求をする際に用います。

基本的なフレーム構造は、データフレームからデータフィールドを除いたものになります。 データフレームとの区別はRTRで行います。データフレームではドミナントとなるRTRですが、リモートフレームではリセッシブになります。 IDに要求するデータフレームのID、コントロールフィールドのDLCに要求するデータフレームのデータ長を設定して使用します。

8.3.オーバーロードフレーム

オーバーロードフレームはCANコントローラが前回のフレームの処理を終了させるための待ち時間を作るために用いられます (昔のマイコンは処理能力が低く、前回のフレームの処理が間に合わない場合があったため発案されたフレームです。 現在のマイコンは昔に比べ処理能力が上がっているため、処理が間に合わないということはほぼありませんが、CANの規格上オーバーロードフレームの機能は持っています)。

・オーバーロードフラグ:ドミナントの6ビット長でオーバーロードフレームが送信されていることを示します。 ノードが送信するビット長は6ビットですが、送信動作によりCANバスには7ビット現れることもあります。
・オーバーロードデリミタ:リセッシブの8ビット長でオーバーロードフレームの終了を示します。

データフレーム、もしくはリモートフレームが送信終了(EOF送信終了)し、ITMを送信開始するタイミングで、処理待ちが必要なノードがオーバーロードフラグを2ビット以内に送信します (3ビット=ITMがすべて送信されるとバスアイドルになってしまうため2ビット以内に送信します)。
ITMのバスレベルがリセッシブに対して、オーバーロードフラグはドミナントなので、オーバーロードフラグが優先されます。
オーバーロードフラグを受け取った他のノードはすぐにオーバーロードフラグを送り返します。 つまり、最初のオーバーロードフラグから1ビット遅れで送信するため、CANバスには計7ビット長のオーバーロードフラグが現れます。 もし、すべてのノードがITM送信のタイミングでオーバーロードフラグを送信した場合、送り返しがないため、6ビット長になります。
オーバーロードフラグ送信後、オーバーロードデリミタとITMを送信しバスアイドルになります。
このように、ITMにオーバーロードフラグをかぶせて送信することで、バスアイドル状態に遷移する時間を遅くし、処理時間を稼ぐことができます。

8.4.エラーフレーム

エラーフレームは通信エラーが発生した際に送信されるフレームです。

・エラーフラグ:ドミナントの6ビット長で、エラーが発生したことを示します。
・エラーデリミタ:リセッシブの8ビット長でエラーフレームの終了を示します。

データフレームもしくはリモートフレームの送受信にエラーが検出された場合、そのノードはエラーフラグを送信します。 そのとき、わざとスタッフィングルールを守らずに(6ビット同じデータを送り)、スタッフィングエラーを発生させます。
他のノードはこのスタッフィングエラーによって、エラーが発生したことを判断し、エラーフラグを送り返します。
エラーを検出したノードからのエラーフラグと、スタッフィングエラーを受けて返されたエラーフラグはCANバス上で重複する場合があるため、CANバスには6~12ビットのエラーフラグが現れます。
エラーの内容はエラーフレームが送られたタイミングで判別され、以下の5種類が存在します。
 ・ビットエラー:送信ノードが送信した内容と実際にバスに流れている内容が異なった場合に検出するエラーです。送信ノードで検出されます。

 ・ACKエラー:ACKスロットで、どの受信ノードもドミナントを返さなかった場合に検出するエラーです。 すべての受信ノードが誤ったメッセージを受信したか、他のノードが一つも接続されていない場合に検出されます。送信ノードで検出されます。

 ・CRCエラー:受信したメッセージとCRCシーケンスの値が異なる場合に検出されるエラーです。受信ノードで検出されます。

 ・スタッフエラー:ビットスタッフィングルールが守られなかった場合に検出されるエラーです。受信ノードで検出されます。

 ・フォーマットエラー:本来リセッシブであるはずのCRCデリミタ、ACKデリミタ、EOFがドミナントになっている場合に検出されるエラーです。受信ノードで検出されます。

9.エラー状態

CANには3つのエラー状態があります。
・エラーアクティブ状態:通信に正常に参加できる状態です。

・エラーパッシブ状態:通信には参加できますが、エラーを起こしやすいと判断された状態です。 エラーを起こしやすい状態なので、もしエラーパッシブ状態のノードが繰返しエラーを出し続けてしまったら、 他の正常なノードの通信の妨げになってしまいますので、エラーパッシブ状態とエラーアクティブ状態では送受信の処理が異なります。
送信時には優先的にエラーアクティブ状態のノードから送信させるために送信待機を行います。 ITMを受信した後、さらに8ビットのリセッシブ(バスアイドルを示すリセッシブ)を受信してからでないと送信処理を行うことができません。
また、エラーが発生したときに送信するエラーフラグは通常ドミナントですが、エラーパッシブ状態のノードが送信するエラーフラグはリセッシブになります。 受信時には送信ノードを含む他のノードが通信を行うため、リセッシブであるエラーフラグは無視されることとなり、結果エラーパッシブ状態の受信時エラーは他の通信を妨げません。
しかし、送信をするとき、通信するのは一つのノードだけなので、リセッシブでも6ビット続いた時点でスタッフィングエラーを検出します。 このことより、エラーパッシブ状態のノードが発生させるエラーは送信時のエラーだけということになります。

・バスオフ状態:通信に参加できない状態です。

これら3つの状態は、送信エラーカウンタと受信エラーカウンタによって管理されています。各エラーカウンタはエラー時に増加し、正常通信時に減少します。下記画像はエラー状態の遷移図です。

10.ビットタイミング

データの最小単位は1ビットですが、CANはこの1ビットをさらに4つのセグメント(区分)に分けています。 このセグメントはTimeQuantum(以下Tq)という単位で表されます。ビットをセグメントとTqで分割・構成することをビットタイミングといいます。
5.同期とスタッフィングルールで、CANはリセッシブ(1)→ドミナント(0)のビットデータの切り替えで同期をとっているとしましたが、 色々な遅延や誤差により、送信ノードが送信したタイミングと受信ノードが受信したタイミングがずれることがあります。 このずれを修正し再同期させるために、このビットタイミングを用います。 表2は各セグメントの役割とTq数を表します。

他に、reSynchronization Jump Width(SJW)という、PBS1,2を増減・減少させる値があり、1~4Tqの範囲で設定できます。
ビットタイミングによってノード間の確実な同期を行うため、ビットタイミングの設定はすべてのノードで統一させる必要があります。
各セグメントのTqを長くすると、遅延や誤差に対する修正の幅が広がるため、同期ミスの確率が減少します。 しかし一方で、1ビットの長さが長くなってしまうため、転送速度が遅くなってしまいます。
転送速度を取るのか、同期ミスの確率を減らすのかはどのようなCANネットワークを作るかによって変わります。

11.アクセプタンスフィルタ

CANの送信メッセージはすべての受信ノードに送信されます。 しかし、すべての受信ノードがそのメッセージを必要としているとは限りません。受信ノードが必要なデータのみを受信するための機能がアクセプタンスフィルタです。
必要なデータであるかを判断するにはデータフレームのIDを使用します。 受信ノードは自分が受信したいメッセージのIDを設定しておき、送信メッセージのIDがそれと一致した場合のみメッセージを受信します。
逆を言えば、アクセプタンスフィルタを使用しない(アクセプタンスマスク)ようにすると、複数のメッセージが受信できるようにすることも可能です。

12.CAN通信ミドルウェア

CAN通信ミドルウェアの利用のみでネットワークを構築できるため、通信ソフトウェアの開発工数を大幅削減可能です。 →CAN通信ミドルウェアを共通に利用しているため、移植性と保守性が向上し、また可読性の向上も期待出来ます。

もっと見る

ご相談・ご質問等ございましたら、
お気軽にお問い合わせください。

株式会社ヴィッツ
〒460-0008 
名古屋市中区栄三丁目3番21号セントライズ栄6階
TEL (052)220-1218 / FAX (052)218-5855