3.25. CANバスの基礎¶
CAN(Controller Area Network)は、1980年代にBoschが、車載のすべての電子制御ユニットを1本の短い共有バスに接続するために最初に設計したものです。今でも車のワイヤーハーネスを担っていますが、その堅牢性、リアルタイム性、マルチマスタ設計により、オートメーション、ロボティクス、農業機械、各種産業機器における標準的なフィールドバスにもなっています。
CANには、SPIやI2Cのような単一の「コントローラ」と一連の「ペリフェラル」という構成はありません。バス上のすべてのノードは対等であり、どのノードもバスがアイドル状態であればいつでも送信できます。これを大規模に成立させているのが、バスのブロードキャストとアービトレーションを組み合わせた設計です。
3.25.1. 優先度アービトレーション付きブロードキャスト¶
CANバス上のすべてのメッセージは識別子を持ちます。従来の標準フレームでは11ビット、拡張版では29ビットです。識別子はアドレスではなく、そのメッセージが何についてのものか(エンジン回転数、ブレーキペダルの位置、バッテリー電圧など)を表すラベルです。ノードがある値を送信したいときは、適切な識別子を付けてブロードキャストし、バス上のすべてのノードがそのブロードキャストを見ます。各受信側はハードウェアでバスをフィルタリングし、自分が必要とするIDだけを取り出します。
2つのノードが同時に送信しようとすると、バスの電気的設計によって、数値の小さい識別子を持つメッセージがビットを失うことなく勝ち残ります。
その仕組みは、バスの2つの電気的状態にあります。ドミナント(論理0)とリセッシブ(論理1)です。どのノードも話していないとき、CANの配線は終端抵抗によってハイ(リセッシブ)に保たれます。どのノードも、自身のトランシーバを通じて電流を流すことで配線をロー(ドミナント)に引き下げることができます。その結果が配線によるAND(wired-AND)です。すなわち、いずれか1つのノードでもバスをドミナントに駆動すれば、ラインはドミナントを示し、すべてのノードが解放したときにのみリセッシブを示します。常にドミナントが勝ちます。(同じ構成をwired-ORと呼ぶ資料もあります。これはリセッシブビットのANDではなく「ドミナント」をアサートされた信号と捉えるものですが、物理的な振る舞いはどちらで考えても同一です。)
概念的に表したwired-ANDです。実際のCANは、トランシーバと終端抵抗を両方の配線に分割した差動ペア(CAN_H / CAN_L)上で同じロジックを動かしますが、バス上のルールは同じです。どのノードもドミナントに引き下げることができ、すべてのノードが解放したときにのみリセッシブを示します。¶
アービトレーションはこの非対称性を直接利用します。送信中のすべてのノードは、自分のIDを1ビットずつMSBから送り、送信しながらバスを監視します。リセッシブビットを配線に出したのにドミナントが読み戻されたノードは、より小さいIDを持つ別のノードが同じ瞬間に送信しており、そのビット位置で勝ったことを知ります。そのノードは直ちにバスの駆動をやめて待ち受けます。一方、勝ったノードは自分のビットがそのまま出ていくのを見ます。そのノードから見れば何も異常は起きていません。番号の小さいIDが勝つのは、そのドミナントビットが、番号の大きいIDが同じ位置で送ろうとしたリセッシブビットを上書きするからです。
負けたノードはバスがアイドルになるのを待ち、自動的に再送します。衝突もメッセージの喪失もなく、決定論的な優先度順序付けだけが存在します。
これが、CANを大規模に機能させるパブリッシュ/サブスクライブ方式です。誰でも話すことができ、誰でも聞くことができ、IDによってディスパッチが暗黙的に行われます。
3.25.2. 物理バス¶
MCUのCANコントローラはバスを直接駆動しません。公開しているのは2本の3.3 V CMOSピン、すなわちTX(送信したいビット)とRX(バス上で見えるビット)だけで、これらのピンはCANトランシーバまたはPHYと呼ばれる別のチップへ接続されます。トランシーバはコントローラと実際のCAN配線の間に位置し、バスとの通信方法を知っているのはこのトランシーバです。
バス自体は5 Vの差動ペアです。
CAN_H -- ペアの「ハイ」側の配線。
CAN_L -- 「ロー」側の配線。
リセッシブ状態では両方の配線がおおよそ2.5 V(バスの5 V電源の中点)になります。ドミナント状態では、トランシーバがCAN_Hを約3.5 Vまで引き上げ、CAN_Lを約1.5 Vまで引き下げて、ペア間に約2 Vの差電圧を生じさせます。受信側は2本の配線間の差をサンプリングするため、信号は長いケーブル経路で拾うコモンモードノイズの影響を受けません。
トランシーバの双方向の役割は次のとおりです。
TX側では、コントローラの3.3 VシングルエンドのTXピンを読み取り、ドミナントの場合はCAN_HとCAN_Lを引き離し、リセッシブの場合は両方を解放します。
RX側では、差動のCAN_H / CAN_Lペアを読み取り、シングルエンドの3.3 Vレベルとして自身のRXピンからコントローラへ報告します。
ケーブルの物理的な両端に1つずつ配置された2つの120オームの終端抵抗は、どのノードも駆動していないときにバスをリセッシブの中点に保ち、長い経路で差動信号を乱す反射を減衰させます。
3.25.3. データフレーム¶
標準的なCANデータフレームは、配線上では次のようになります。
標準的なCANデータフレーム。SOF、ID、RTR、コントロール、データ、CRC、ACK、EOFの各フィールド。¶
各フィールドには特定の役割があります。
SOF(start of frame、フレーム開始)。新しいフレームが始まることを示し、各ノードのビットクロックを同期させる1つのドミナントビットです。
ID(識別子)。バスがアービトレーションに用いる11ビットの識別子です。番号が小さいほど優先度が高くなります。
RTR(remote transmission request、リモート送信要求)。データの配信ではなくデータの要求の際にセットされます。一致するIDを持つ受信側が、自らデータを送信して応答します。
コントロール。 データ長(
DLC)といくつかの管理ビットをエンコードする6ビットのフィールドです。データ。 0~8バイトのペイロード(CAN Classic、CAN FDではこれを64バイトまで拡張)。
CRC。 合計16ビット。先行するフィールドにわたる15ビットのCRCに、1ビットのCRCデリミタを加えたものです。
ACK。 合計2ビット。最初のビット(ACKスロット)では送信側がラインを解放し、フレームを正しく受信したノードがそれをローに引き下げます。2番目のビットはリセッシブのデリミタです。ACKが無い場合、どのノードもフレームを受信しなかったことを送信側に伝え、再送すべきことを示します。
EOF(end of frame、フレーム終了)。フレームを閉じる7つのリセッシブビットです。
これらはすべてCANコントローラがハードウェアで生成・デコードします。ソフトウェアからはID、データ、いくつかのフラグだけが見えます。
3.25.4. CANの位置づけ¶
CANの設計上の選択が、その用途を決めています。
堅牢。 ツイストペア上の差動信号、組み込みのエラー検出、決定論的な優先度アービトレーション、自動再送により、CANはUARTやSPIならデータを破損させるような電気的にノイズの多い環境でも生き残ります。
マルチマスタ。 どのノードもいつでも話すことができます。中央コントローラは不要で、どのノードも単一障害点になりません。
帯域幅に制限あり。 Classic CANの上限はおよそ
1 Mbit/sで、CAN FDはこれを拡張します。CANは、リンクがボードやモジュール同士の間にあり、しばしば数メートルのケーブルを介し、信頼性が最優先される場合に適した選択肢です。上位層プロトコル。 素のCANバスは、あるIDが何を意味するか、長いメッセージをどのようにフラグメントに分割するかを規定しません。アプリケーション層プロトコル(CANopen、J1939、ISO-TP/UDS、NMEA 2000)が、こうしたルールをその上に重ねます。知っておく価値のある別の項目にDBCファイルがあります。これは、特定の車両やシステムにおいてどのIDがどのビットレベルの信号を運ぶかを記録する、ベンダー固有のテキスト形式です。DBCファイルは1つのバスのメッセージレイアウトを記述するメタデータ形式であり、それ自体がプロトコルではありません。
コードでのCANバス のドライバは配線レベルのCANフレームを扱います。IDを意味に対応付けるのはアプリケーションの役割です。