CANで採用しているCSMA/CAでは、バス使用中に他ノードはデータフレームやリモートフレームを送信することができない仕様になっている。
しかし、実際には複数ノードから同時に送信されてしまうことを防ぐことができない。そのため、通信調停を行う必要がある。
CANにおいて通信調停に使用されるのは図6のIDとRTRだ(ここでは標準フォーマットを例に解説する)。
それでは、実際の通信調停がどのように行われているのかを見てみよう。
図7に、ID 0x653と0x65Bの2台のノードより同時にデータフレームが送信された場合を示す。
同時にデータフレームが送信される場合、複数ノードからの開始位置は同一となる。はじめにSOFが送信されるが、SOFは1ビット長のドミナント固定となっており、バスの状態はドミナントとなる。
各ノードは自身が送信したものとバス状態をモニターし比較するが、SOFにおいては各ノード自身が送信した内容のままになっていると判断し送信を継続する。
続いて、IDが1ビットずつ送信されるが、送信中の複数ノードの送信ビットが同一、例えば複数ノードからリセッシブが送信されればバスはリセッシブとなり、送信した内容そのままとなる。
リセッシブとドミナントが別々のノードより同時に送信された場合、ドミナントが優先され、バスの状態はドミナントとなる。このとき、リセッシブを送信したノードは自身が送信したものとバス状態の違いにより、通信調停に負けたことを検出し送信を停止する。
このことより、複数ノードから同時送信が起こってしまった場合、他ノードがリセッシブ送信を行っているときにドミナントを送信したノードが通信調停に勝つので、優先順位が高いIDは0x0であり、IDの値が小さいものほど優先順位が高くなる。
IDの割り当てについてはデータフレームのデータフィールドの割り当てと同様に、設計者が自由に割り当てできるが、通信調停時の優先順位の関係で重要度の高いものはIDの値を小さくするなど、ネットワーク全体を考慮する必要がある。
基本的にはIDのみで通信調停が行えるが、なぜRTRも通信調停に使用するのか? それは、同じIDのデータフレームとリモートフレームが同時に送信された場合、IDのみでは調停は行えないからである。このようなことが起きた場合、IDだけではなくRTRも使用して通信調停を行うが、データフレームではRTRはドミナント、リモートフレームではRTRはリセッシブであるため、データフレームが優先されることになる。
さて、次回は残る2つのフレーム「オーバーロードフレーム」と「エラーフレーム」と、エラー処理について解説する予定だ。(次回に続く)
Copyright © ITmedia, Inc. All Rights Reserved.