CAN フレーム構造:バス上を流れるもの
SOF から EOF まで、古典 CAN データフレームのフィールド・仲裁・CRC・ACK を読む。
更新日 2026-11-05
Controller Area Network はブロードキャストバスです。すべてのノードが同じより対線 CAN_H / CAN_L に接続され、古典的な意味でのアドレス指定はありません。各フレームは全ノードに見え、受信側が識別子(ID)を必要とするかをローカルに判断します。バスの状態はドミナント(論理 0、差動電圧あり)とリセッシブ(論理 1、差動駆動なし)の 2 種類で、ドミナントは常にリセッシブを上書きします。これがアービトレーションと応答の物理的な基礎です。両端に 120 オームの終端抵抗を置くのが一般的で、古典 CAN の通信速度はケーブル長に応じて 125 kbit/s〜1 Mbit/s 程度です。
データフレームは受信側を同期させる単一のドミナント SOF ビットで始まります。続くアービトレーションフィールドには 11 ビット ID(拡張フレームは基本 ID と拡張 ID に分かれた 29 ビット)と、データフレームとリモートフレームを区別する RTR ビットが入ります。制御フィールドは IDE、予約ビット、DLC(データ長コード)です。古典 CAN では DLC が 0〜8 バイトを直接表し、CAN FD では同じフィールドを最大 64 バイトまでの表のインデックスとして使います。ビットスタッフィングは同じビットが 5 個続いた後に反対のビットを挿入して受信クロックの同期を保ち、SOF から CRC シーケンスの終わりまで適用されます。
SOF から EOF まで順に読む
ペイロードの後には 15 ビット CRC(CAN FD は 17 ビット)、リセッシブの CRC デリミタ、ACK スロットが続きます。送信側は ACK スロットをリセッシブで送り、フレームを正しく受信したノードがドミナントへ引き込みます。これにより送信側は、どのノードかは知らずとも、少なくとも 1 台が理解したことを確認できます。EOF は 7 個のリセッシブビットで、次のフレームまでに短いインターミッションが入ります。2 台が同時に送信した場合、両者は ID を送りながらバスを監視し、片方がリセッシブ、もう片方がドミナントになった最初の位置で勝敗が決まり、敗者はただちに受信側に回ります。これは非破壊アービトレーションで、勝ったフレームは壊れず、衝突による帯域の無駄がありません。
エラー処理はハードウェアが行います。ビットエラー、スタッフエラー、CRC エラー、フォームエラーを検出したノードはエラーフレームを送ってカウンタを増やし、問題が続くと error-active から error-passive、最終的に bus-off へ移行します。終端抵抗の不足やボーレート不一致が「きれいな停止」ではなく「フレームがランダムに抜ける」ように見えるのはこのためです。フレーム自体は名前・単位・換算を持たず、ID と最大 8 バイトの生データだけを運びます。このバイトを工学的な値に変えるのが DBC データベースの役割であり、次の記事のテーマです。
フィールド一覧
- SOF —— ドミナント 1 ビット、フレーム開始とハード同期
- アービトレーション —— 11 / 29 ビット ID と RTR、数値が小さい ID が優先
- 制御 —— IDE、予約ビット、DLC(古典 CAN は 0〜8 バイト)
- データ —— 生のペイロード。意味は DBC の SG_ 行が記述
- CRC —— 15 ビット checksum とデリミタ
- ACK —— 受信側がドミナントへ引き込み、EOF とインターミッションで終了
古典 CAN データフレームの各フィールドを順に表示
生バイトから信号へ
ID 0x1F0 DLC 8 DATA 12 34 00 7A 00 00 00 00
^^^^ DBC の SG_ 行が各ビットの意味を定める実務ではフレームを手でデコードすることはほとんどありません。DBC を読み込み、ID に一致するメッセージを選び、開始ビット・長さ・バイトオーダ・符号・係数・オフセットを各信号に適用させます。それでも構造を知る価値はあります。ボーレート違いで 1 フレームも受信できない理由、古典 CAN で 8 バイトが上限である理由、同一メッセージ内で 2 つの信号が重なってもバスが気付かない理由を説明できるからです。ツールはデータベースの記述を表示できるだけで、記述自体の意味的な誤りまでは判定できません。
ビューアで試す
サンプルファイルを開くか、自分の DBC / A2L ファイルをドロップしてください。解析はブラウザ内で完結し、アップロードはありません。
ビューアを開くよくある質問
小さい ID が必ず優先されますか?
標準データフレームでははい。ドミナントビットがリセッシブを上書きするため、数値が最小の ID がアービトレーションに勝ちます。
DLC はバイト数そのものですか?
古典 CAN では 0~8 バイトを表します。CAN FD では最大 64 バイトに対応するコードです。