著者:クリスチャン・クルツケ
第1話のあらすじ
車両機能の複雑化(より多様な電子センサーやアクチュエーター)に伴い、車全体にケーブルを配線する作業はますます煩雑になっていった。
CANバスは、アナログのポイントツーポイント配線方式からデジタル(2線式)通信バスアーキテクチャへの移行によって、これらの問題の一部を解決するために1990年代半ばに導入されました。
車両内でCANバスを介した通信にデバイスがどのように参加できるかを見ていきましょう。
ハードウェア接続
ハードウェアノードがCANバス通信に参加するためには、最低でも2層のチップセット機能が必要であり、これらは多くの場合、(非常に低コストの)SoCに統合されている。
その2つの層とは:
- CANバスの電気的な「レベル」コンバーター。堅牢な±12V差動ワイヤフォーマットから、標準的な0/5VデジタルRX/TXプロトコルへ変換します。
この用途によく使われる部品は、MCP2551というチップです。
画像出典 - パケットフレーミング、衝突検出、優先順位の適用など、CANプロトコルの基本機能を実装したマイクロコントローラ。
この用途でよく使われるチップはMCP2515です。
画像出典
以下は、Raspberry Pi 用のディスクリート CAN インターフェースの例です。詳細はこちらをご覧ください。

次の章では、CANバスの最下位3層について詳しく説明します。
このトピックに関する詳細な説明については、 この電子書籍、またはISO 11898-1およびISO 11898-2に記載されているCANバスの電気仕様を参照してください。これらの規格では、最大1Mbpsのデータレートでバスを駆動するための電気仕様と信号要件が拡張されています。
詳細な仕様はこちらからご覧いただけます。
電気的特性
CANバスネットワーク上で通信を行うには、デバイスはバスに電気的に接続され、特定の通信規格用に標準化された低レベルの電気信号を「理解」し、「発信」できる必要があります。
物理的な観点から見ると、CANバスは2線式差動バストポロジーです。基本的な原理は以下のとおりです。
- CANには2本のワイヤがありますが、専用の「送信」ワイヤと「受信」ワイヤはありません。2本のワイヤはすべてのノード間で共有される媒体を表しており、すべてのノードは同時に受信および/または送信を行うことができます(ここではデータパケットの衝突は無視します)。
- すべてのノードは通常、「バス」と呼ばれる構造で順番に配置されますが、いくつかの制限はあるものの、スター型やその他のグラフトポロジーとして配置することも可能です。
- 送信機は「オープンコレクタ」または「ドミナントゼロ」であり、複数のノードが送信する場合、ゼロを送信するノードが、イチを送信するノードよりも優先されます(これはCANパケットの優先順位解決において重要になります)。
- バスの両端は120オームの抵抗器で終端されている。
配線の分かりやすい図解を以下に示します。

以下は、バス上の単一のCANパケットがどのような状態になるかを示すオシロスコープ表示の例です。

電気的な接続レベルでは、信号変換器が差動電圧レベルをデジタル1と0のビットに変換する。
通常、この変換はMCP2551トランシーバーのような非常にシンプルな集積回路で行われます。詳細については、こちらの例をご覧ください。
CANパケットとして1と0を解釈する
信号がビットに処理されると、生のビットストリームは、低レベルCANプロトコルISO 11898に従ってCANコントローラによって処理されます。
これは例えば、MCP2515マイクロコントローラを使用することで実現できます。このコントローラは、整形式のCANパケットを生成し、物理層のCANプロトコル(衝突制御、優先順位解決、CRC、ビットタイミング、パケットタイミングなど)を処理します。詳細については、こちらをご覧ください。
より柔軟なアーキテクチャを実現するには、 CAN-USBブリッジングファームウェアを実行するArmベースのSTM32xxファミリーなどのマイクロコントローラによってこの機能を提供することも可能です。
CANバス低レベル通信
CANコントローラから、CANパケットのペイロードがCPUに送信されます。以下の例では、データはSPIインターフェースを介して、CANデバイスドライバを実行しているRaspberry Piに渡されます。その他の接続方法としては、USBまたはRS232シリアル接続があります。
このレベルでは、CANデータパケットは次の構造になっています(詳細については、こちらを参照してください)。

低レベルプロトコル仕様
最も単純なケースでは、CANデータパケットは次のように考えることができます。
- 11ビットパケットID
- 64ビットペイロード
- 15ビットCRCエラー検出/訂正
11ビットのパケットIDを理解することが重要です。
- 送信元アドレスでも宛先アドレスでもありません。バス上のどのノードでも、技術的には任意のIDを使用してCANパケットを送信できます。
- ペイロードデータの解釈を示します(例:エンジン温度の値か、車輪速度の値か)。
- バス衝突が発生した場合の仲裁を行います。IDが最も小さいパケットが優先されるため、重要度に応じてIDが小さくなります。
これはセキュリティ上の興味深い影響を及ぼし、攻撃者がパケットを偽装したり、優先度の高いパケットでバスを溢れさせたりすることを可能にします。この記事ではこれらの問題の詳細には触れていませんが、概要についてはこちらをご覧ください。
CANバス上のノードとの通信方法に関するより詳細な情報は、次のセクションで説明します。
Please reach out to discuss your particular scenario today.