車載ネットワーク(6)CAN 通信手順とフレーム構造

CAN には、データフレーム/リモートフレーム/オーバーロードフレーム/エラーフレームの4 種類のフレームタイプがある(表1)。

名称概要
データフレーム通常のデータ送信フレーム(標準/拡張フォーマット)
リモートフレームデータフレーム送信要求
エラーフレームエラーを他のノードに通知
オーバーロードフレーム前回のフレーム処理が完了していないことを通知
表1 フレームフォーマット

主に乗用車で使われる「標準フォーマット」とトラックなどの大型車で使われる「拡張フォーマット」が通常時使用されるフォーマットだ。リモートフレームは、データフレーム送信要求フレームだが、ポーリング動作が主流になったため、かつてほど重要ではない。

エラーフレームは、エラーを検出したノードが他のノードにエラーを通知するフレームだ。エラーフレームは、 Wired or の原理を使い送信中のフレームを破壊するフレームだ。フレームに違いはないが、「フレーム破壊信号」に近いイメージだ。

オーバーロードフレームは、受信フレームの処理が間に合わず次のフレームを受信できないときに送信される。これも、「フレーム送信抑制信号」とでも呼んだ方が実態に近い。最近のプロセッサは十分な性能があるため、オーバーロードフレームが送信されることは極めてまれだ。

標準フォーマット

図1 CAN 標準フォーマット

以下のフレーム構造図で、信号のハイレベルを「リセッシブ」、ローレベルを「ドミナント」と呼ぶ。ドミナントにのみ線がある部分はドミナント固定、リセッシブにのみ線がある部分はリセッシブ固定、両方に線がある部分はデータにより変化する部分だ。フレーム間ギャップは、誰も送信していない状態で「アイドル」状態を表す。

標準フォーマットの各部の機能は次のとおりだ。

SOF:Start Of Frame

ノードから最初に送信され、フレームの開始位置を示す(Start Of Frame)。ノード間の同期にも使用する。1ビットのドミナント。

ID:Identification

データ内容や送信ノードの識別、調停の優先度を決める。標準フォーマットでは、11 ビット長、拡張フォーマットでは11+18 で29ビット長になる。

RTR:Remote Transmission Request

データフレームとリモートフレームの識別領域。データフレームの場合はドミナント、リモートフレームの場合はリセッシブになる。RTRも調停に使用する。1 ビットのリセッシブ。

Control Field

IDE/FDF/DLC で構成する。IDE は標準フォーマットと拡張フォーマットの識別、 FDF(旧規格では予約ビット) は CAN と CAN FD の識別、CAN ではいずれのビットもドミナント。

DLCは、コントロールフィールドに続く Data Field で送信するバイト数を示す。DLC の設定範囲は 0~8 で、9 以上を設定できるが、データ長は 8 バイトに制限される。しかし、曖昧さの残る規定だ。

Data Field

送信データを格納する領域で、データ長は DLC の設定で決まる。Data Field では、全バイトの MSB(最上位ビット)から送信される。一般的な通信や LIN ではLSB (最下位ビット)から送信されるので、注意が必要だ。

CRC Sequence

フレームの伝送誤りを判断する領域。CRC15 の演算範囲は、SOF~Data Field で、送 信側は演算結果を CRC Sequence に格納する。受信側は送信側と同様に SOF~Data Field の演算を行い、演算結果と受信した CRC Sequence と比較し判断する。SOF- Arbitration Field-RTR-Control Field は合計で19ビットある。上位3ビットが最上位ワードになる。CRC15 の多項式は、X15 + X14 + X10 + X8 + X7 + X4 + X3 + 1 。

CRC Delimiter

CRC Sequence の終了を表す区切りで、1ビット長のリセッシブ信号。CRC Sequence とCRC Delimiter を併せて「CRC Field」と呼ぶ。

ACK:Acknowledgement

送信ノードは、1ビット長のリセッシブを送信する。受信ノードは、CRC Field まで正 常に受信できた場合は、ACK のタイミングでドミナントを送信する。CAN では、ドミナントとリセッシブが同時に送信されると Wired OR の原理でドミナントになる。送信が正常に終了すると ACK はドミナントになる。

ACK 動作
図2 ACK 動作
ACK Delimiter

ACK の終了を表す区切りで、1ビット長のリセッシブ固定。ACK と ACK Delimiter を合わせて ACK Field になる。

EOF :End Of Frame

データフレームの終了を表す。7ビット長のリセッシブ信号。

ITM:Intermission

フレーム間を分離する領域で、連続した最小3ビットのリセッシブで構成する。

拡張フォーマット

図3図4 から分かるように、標準フォーマットと拡張フォーマットの違いは、ベース Identifier から拡張 Identifierまでだ。 RTR 以降は全く同じだ。フレームを受信したノードは、11 ビットの Identifier 受信後の 2 ビット情報で、標準と拡張を識別できる。

CAN 拡張フォーマット
図3 CAN 拡張フォーマット
標準/拡張フォーマット比較
図4 標準/拡張フォーマット比較
SOF:Start Of Frame

ノードから最初に送信され、フレームの開始位置を示す(Start Of Frame)。
ノード間の同期にも使用する。1ビットのドミナント。

ID:Identification

データ内容や送信ノードの識別、調停(アービトレーション)の優先度を決める。 標準フォーマットでは、11ビット長、拡張フォーマットでは 11+18 で29ビット 長になる。

SRR:Substitute Remote Request

代替リモート要求。常に1 ビット長のリセッシブ。

IDE:Identifier Extension

29ビットの識別子を持つ拡張フォーマットを示す。常に1 ビット長のリセッシブ。

リモートフレーム

リモートフレームは、データフレーム送信要求に使用する。基本構造は、データフレームから Data Field を除いた形だ。リモートフレームの ID は要求するデータフレームの ID を設定し、 DLC は要求するデータフレームの DLC を設定する。リモートフレームで送信するデータ長では ない(リモートフレームには Data Field がない)。

データフレームとの違いは、RTR がリセッシブになることだ。RTR でデータフレームとリモートフレームを識別することができる。

例えば ECU がセンサ情報を収集する場合、ECU はセンサに対し「リモートフレーム」を送信し、センサは「データフレーム」を送信する。これが CAN の本来の姿だ。しかし、「リモートフレーム」と「データフレーム」のハンドシェークはほとんど使われていない。リモートフレームを使用せず、データフレームを定期的に送信する方式が主流だ。

リモートフレームを使わなくなった理由は2つある。

  • データフレームの送信頻度が高くなるとリモートフレームによる帯域ロスが大きい
  • DLC(送信バイト数を指定)の定義があいまいで、互換性問題が起きる。CAN は0~8バイトのデータを送信できるが、DLC の設定範囲は、0~15 で9以上を指定された場合の動作が曖昧だ。
リモートフレームフォーマット
図5 リモートフレームフォーマット

オーバーロードフレーム

オーバーロードフレームフォーマット
図6 オーバーロードフレームフォーマット

CAN は約40年前に開発されたかなり古い規格だ。規格化当初は、マイクロプロセッサの処理能力が低く、受信データ処理に時間がかかり、次のデータを受信できない事態が想定された。データフレーム受信中に処理が間に合わないノードは、オーバーロードフレームを送信し、次のデータフレーム送信開始を遅らせることができる。

オーバーロードフレームは、データフレームまたはリモートフレームの EOF に続く 6~7 ビッ トの「Overload Flag」と 8 ビットの「Overload Delimiter」で構成される。

最近は、マイクロプロセッサの性能が向上し、このような事態は想定できない。ネットワーク帯域を無駄に消費するため、オーバーロードフレームを使用しないのが一般的になった。

エラーフレーム

オーバーロードフレームフォーマット
図7 オーバーロードフレームフォーマット

エラーフレームは、通信中にエラーが発生した時に送信されるフレームだ。ネットワークに接続されている他のノードに異常を通知する役割がある。エラーフレームは、送信中のデータフレームやリクエストフレームを破壊し、ビットスタッフィングルールを破ることで、他のノードにエラーが発生したことを知らせるようになっている。エラーフレームは、Error Flag と Error Delimiter の2つの領域で構成されている。

Error Flag

エラーを検出したノードが送信する Error Flag には「アクティブエラーフラグ」と「パッシブエラーフラグ」の 2種類がある。アクティブエラーフラグは 6 ビットのドミナント、パッシブエラーフラグは 6ビットのリセッシブで構成される。先行する(最初に検出)アクティブエラーフラグは、ビットスタッフィングルールを破ることで、他のノードにもエラーフラグ(パッシブエラーフラグ)を送信することを促す。エラー検出のタイミングは微妙で、アクティブエラーフラグを受信していない状態ではアクティブエラーフラグを送信するが、ノード間でのノード間での時間ずれが起き得る。

他ノードのエラー検出タイミングにより、パッシブエラーフラグのドミナントの幅は 0 ~ 6 バイトの幅で変わる。結果として、 6 ~ 12 ビットのドミナントが Error Flag としてバス上に現れることになる。

Error Delimiter

8 ビットのリセッシブで、エラーフレームの終了を表す。データフレームやリモートフレームは、8 ビットのリセッシブ(1 ビットの ACK Delimiter + 7 ビットの EOF)で終わ るが、エラーフレームも同じ 8 ビットのリセッシブで終わるようになっている。

車載ネットワーク

この記事を書いた人

岩崎 有平

早稲田大学 理工学部 電子通信学科にて通信工学を専攻。
安立電気(現 アンリツ)に入社後、コンピュータ周辺機器の開発を経てネットワーク機器の開発やプロモーションに従事する。
おもにEthernetを利用したリアルタイム監視映像配信サービスの実現や、重要データの優先配信、映像ストリームの安定配信に向けた機器の開発行い、Video On Demandや金融機関のネットワークシステム安定化に注力した。
現在は、Ethernetにおけるリアルタイム機能の強化・開発と普及に向けて、Ethernet TSNの普及活動を行っている。