車載ネットワーク(5)CAN 通信手順とCSMA/CR 衝突時の調停

CAN には、データフレーム/リモートフレーム/オーバーロードフレーム/エラーフレームの4種類のフレームタイプがある。データフレームには標準フォーマットと拡張フォーマットの2種類がある。両者の違いは、識別コード(ID)の長さだ。標準フォーマットは 11 ビットの識別コード、拡張フォーマットには 29 ビットの識別コードがある。

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

CANの元々の考え方は、データを必要とするマスタノードがリモートフレーム(送信要求)を送信し、要求されたスレーブノードがデータフレームを返すというハンドシェーク方式だ(図2 ハンドシェーク動作)。この方式は、送受信に必要なときのみノード内のプロセッサが起動し、プロセッサリソースの無駄がない。バス上も最低限必要な送受信フレームだけになり、無駄なフレームの送受信はなくなる。データの更新頻度が低い場合は、効率の良い方法だ。

しかし、データの更新頻度が高くなると状況が変わる。必要なデータフレームの数と同じ数のリモートフレームが必要であるため、バスの使用効率は悪くなる。リモートフレームの送信をやめ、データフレームを定期的に送るポーリングの方がバス使用率を改善できる。ポーリング方式は、無駄なデータを送受信する可能性があるが、データ更新間隔が短くなると無駄なデータを取り込む確率が下がる。現在では、プロセッサの性能が向上し、ボトルネックにならないこともあり、リモートフレームを使用せずデータフレームのみで通信するポーリング方式が主流だ(図2 ポーリング動作)。

CAN のデータ送信手順
図2 CAN のデータ送信手順

CSMA/CR

CAN は、マルチマスタ方式だ。同時に複数のノードがバスにメッセージを送信すると衝突が起き、データは壊れる。バスの競合を回避するために、 CAN は CSMA/CR(Carrier Sense Multiple Access/Collision Resolution) と呼ばれる調停方法を使用している。バスの調停方法は、調停後に勝者に送信権を渡すのが一般的だが、CAN はデータ送信と同時進行で調停を行う方式だ。調停プロセスで帯域を消費しない効率の良い手法だ。

CSMA/CR の基本動作は次のようになっている。

Carrier Sense

誰もデータを送信していないことを確認する

Multiple Access

誰もデータを送信していないならば、送信準備を完了している複数のノードが送信を開始する。

Collision Resolution

自分自身が送信したデータと異なるデータを受信することで、衝突を検出できる。衝突はフレーム先頭部の「識別部(ノード番号)」で起きる。調停で勝利したノードは送信を続け、敗退したノードは送信を停止する。識別部は、ノードの識別番号(ID)そのものであるため、そのまま送信を続けることができる。調停は識別部の範囲で行うため、後に続くデータ部は破壊されない。

CAN の衝突解決手順を図3 の例で説明したい。

図3 調停手順の例
  • CAN バスは空き状態で誰も送信していない。
  • 送信できるデータを持つノード A は、CAN バスの空きを確認し、送信開始。送信中は、信号衝突やエラーは発生していない。
  • ノード A の送信が終わり、CAN バスは空き状態。
  • 送信できるデータを持つノード B は、CAN バスの空きを確認し、送信開始。送信中は、信号衝突やエラーは発生していない。ノードA は、ノードB 送信開始時点で、送信準備ができていないため競合しない。
  • ノード B の送信が終わり、CAN バスは空き状態。
  • ノード A とノード B はいずれも、送信できるデータを持っている。いずれのノードも CAN バスの空きを確認し、送信を開始する。同時に送信を開始するため、ノード A/B の調停部の信号が衝突し、調停が始まる。調停の結果、ノード A が勝利し、送信を続ける。 ノード B は敗退し、送信を停止する。データ部は衝突がないため、ノード A は無事データを送信を完了する。
  • CAN バスは空き状態で誰も送信していない。
  • 敗退し待ち状態のノード B は、 CAN バスの空きを確認し、再送信開始。送信中は、信号衝突やエラーは発生していない。

[6]で信号が衝突したにもかかわらず、勝利したノード A の識別部(ID)は破壊されず、無事に送信を完了する。これこそが、バスの Wired OR 機能を使ったCAN 特有のユニークな調停方法だ。調停方法の詳細はこれから説明したい。また、Wired OR の仕組みは後ほど説明する。

衝突時の調停

CSMA/CR は、バス使用中に他のノードがデータフレームやリモートフレームを送信することはできない。しかし、複数のノードが同時に送信開始することを防ぐことができない。複数ノードが同時にデータフレームやリモートフレームを送信した場合、「衝突時の調停」を行い、勝者に送信権を与え敗者が引き下がる工夫が必要になる。

衝突時の優先度は、調停部の ID(Arbitration Field)と RTR で決まる。優先度は、ID の値が小さい方が強く、大きい方が弱い。標準フォーマットの優先度を決定する領域を、図3 に示す。ここで注意しなければならないのは、CAN では MSB(最上位ビット)から出力されることだ。一般的な通信や LIN では、LSB(最下位ビット)から出力する。順序が真逆だ。

標準フォーマット優先度
図4 標準フォーマット優先度

複数のノードが同時に送信を開始した場合の調停を説明したい。バス接続では、バスの信号状態を常に監視することができる。また、複数ノードが送信した信号が全てリセッシブ(「1」)ならば、バス上もリセッシブになるが、1本でもドミナント(「0」)があると、バスはドミナントになる。Wired OR の原理だ。

SOF を検出するとフレームの送受信が始まる。調停の仕組みは、先頭の1ビット目(ID 10)から始まる。自分が送信した信号レベルとバス上をモニターした信号レベルが一致すれば、送信を継続する。送信した信号レベルとバスをモニターした信号レベルが異なると、「調停に敗退」したと判断し送信をやめる。ID 10 から始まり調停領域最後の RTR までこれを繰り返す。送信信号とバスをモニターした信号が全て一致し、送信を継続したノードが勝者となり、フレームを最後まで送信することになる。

つまり、他のノードがリセッシブ(「1」)を送信しているときに、ドミナント(「0」)を送信したノードが勝者になる仕組みだ。最強のノードは、全てのビットがドミナント(全ビットが「0」)のノードで、ID の値が小さいほど優先順位が高い。ID の値は設計者が自由に設定でき、 CAN は、重要度の高いノードに、より小さい ID を与えることで優先度をコントロールすることができる。

具体例で、「調停」の動きを確認したい。図5 は3台のノード(A/B/C)が同時にデータフレームを送信開始した例だ。各ノードが送信する ID の値は表2 、同時送信時の挙動は表3 だ。

調停手順の例
図5 調停手順の例
SOFID
10
ID 9ID 8ID 7ID 6ID 5ID 4ID 3ID 2ID 1ID 0RTR
ノード A0110010101110
ノード B0110100101010
ノード C0110010101010
表2 ノードA/B/Cのノード ID と RTR
SOFID
10
ID 9ID 8ID 7ID 6ID 5ID 4ID 3ID 2ID 1ID 0RTR
ノード A01100101011××
ノード B01101××××××××
ノード C0110010101010
バス0110010101010
表3 ノードA/B/C 同時送信時の挙動

ID7 で敗退したノードBは、ID6 から送信停止(x:リスニング状態)
ID1 で敗退したノードAは、ID0 から送信停止(x:リスニング状態) 調停で敗北したノードは、敗北を認識した次のビットから「リスニング状態」に遷移最後まで勝利したノードCは、ID+RTR を最後まで送信し、送受信を継続できる

先ず SOF が送信される。SOF は1ビット長のドミナントで、バスの状態もドミナントになっている。3台のノードは、送信した内容とモニターしたバスの状態が同じであるため、送信を継続する。ID 10 ~ ID 8 までは、この状態が続き、全てのノードは送信を続ける。

ID 7 で状況が変わる。ノード A とノード C は、ドミナント(「0」)で、ノード B はリ セッシブ(「1」)を送信した。バス上はドミナントになり、ノード B は送信信号とモニターした受信信号が異なるため、調停に敗退し、送信を停止しリスニング状態になる。これで、ノード B は調停の場から姿を消すことになる。

ID 6 ~ ID 2 までは、ノード A/C は同じデータを送信しているので、状態は変化しない。 ID 1 で、ノード A はリセッシブ、ノード C はドミナントを送信し、バスはドミナントになる。ここでノード A は敗退し、送信を停止しリスニング状態になる。この時点で、調停の勝者はノード C に決定する。

本来、衝突時の調停は ID のみで実行できるが、同じ ID のデータフレームとリモートフ レームが同時に送信された場合調停できない。そこで、RTR を調停の対象に加えることになった。データフレームの RTR はドミナント、リモートフレームの RTR はリセッシブであるため、データフレームの優先度が高い。

CAN には標準フォーマットと拡張フォーマットがある。拡張フォーマットは、調停用の ID が 29 ビットに拡張されている。2種類のフォーマットが同時に送信を開始した場合も問題は起きない。先頭の 11 ビットの ID が同じ場合でも、次の RTR(標準データフレーム)がドミナントで、拡張フォーマットの同じ場所(SRR)はリセッシブだ。必ず、標準フォーマットが勝つ仕組みになっている(図6)。

標準フォーマットと拡張フォーマットの競合
図6 標準フォーマットと拡張フォーマットの競合

車載ネットワーク

この記事を書いた人

岩崎 有平

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