CAN (Controller Area Network)
CAN は、Robert Bosch が1983年に開発を始め1986年のSAEカンファレンスで発表した、組み込み機器向けのシリアル通信バス。もともとは自動車のワイヤーハーネス削減(各ECU間を1対1で配線する代わりに1本のバスに相乗りさせる)が目的で、1991年のメルセデス・ベンツ W140 が量産車として初めて採用した。ISO 11898 として標準化されている。
現代の自動車には最大70個ほどのECUが載っていて、エンジン制御・変速機・ABS・エアバッグなどがCANで繋がっている。自動車以外でも、産業用オートメーション、3Dプリンタ(ステッピングモータのノイズに強い)、シマノのDi2電動変速、NMEA 2000(舶用)など幅広く使われる。
物理層
- ツイストペア1組の差動信号 (CAN_H / CAN_L)。差動なので同相ノイズに強い。
- ビットには dominant (論理0) と recessive (論理1) がある。dominant はドライバが能動的に電圧差をつける状態、recessive は終端抵抗で自然に戻る状態。つまりバス全体が wired-AND として振る舞い、1台でも0を出せばバスは0になる。
- バス両端に 120Ωの終端抵抗(並列で60Ω)を入れて反射を抑える。
- ビットレートと距離はトレードオフ。高速CAN (ISO 11898-2) は 1Mbps で最大40m、125kbps まで落とすと500m。
ビット単位の非破壊アービトレーション
CANの一番おもしろい部分がここ。
複数ノードが同時に送信を始めると、各ノードは自分が送ったビットとバス上の実際のビットを比較しながら進む。dominant(0) と recessive(1) が衝突すると、wired-AND の性質でバスは dominant(0) になる。recessive を出したのに 0 が見えたノードは「負けた」と判断して即座に送信をやめ、受信側に回る。
フレームの先頭はIDなので、結果として IDの数値が小さいメッセージほど優先度が高い。しかもこの調停は破壊的ではない——勝ったノードのフレームはそのまま壊れずに送り切られる。Ethernetのような衝突検出&ランダムバックオフと違い、最優先メッセージの遅延が衝突によって伸びることがないので、リアルタイム性が要求される制御系に向く。
この方式は CSMA/CD+AMP (Carrier Sense Multiple Access / Collision Detection with Arbitration on Message Priority) と呼ばれる。
フレーム形式
標準フォーマット(11bit ID)の構成:
| フィールド | bit数 |
|---|---|
| SOF (Start of Frame) | 1 |
| 識別子 (ID) | 11 |
| RTR (Remote Transmission Request) | 1 |
| IDE / r0 | 2 |
| DLC (データ長) | 4 |
| データ | 0〜64 (0〜8バイト) |
| CRC | 15 + デリミタ1 |
| ACKスロット | 1 + デリミタ1 |
| EOF | 7 |
- 拡張フォーマットでは 11bit の基本IDに 18bit を足して 29bit ID にする(IDEビットで区別)。
- 同一極性が5bit続いたら逆極性を1bit挿入する ビットスタッフィング で、受信側のクロック同期を保つ。
- IDは「送信元」でも「宛先」でもなく、メッセージの種類と優先度を表す。誰宛かという概念がプロトコルに無いので、アドレッシングやフロー制御は上位プロトコルで足す。
エラー処理
各ノードが送信エラーカウンタ (TEC) と受信エラーカウンタ (REC) を持ち、状態を3段階で遷移させる。
- Error Active (カウンタ < 128) — 通常状態。エラーを検出したらエラーフレームを出してバスに知らせる。
- Error Passive (128〜255) — 挙動を控えめにする。
- Bus Off (TEC > 255) — バスから完全に切り離され、リセットされるまで黙る。
壊れたノードが延々とエラーフレームを撒き散らしてバスを潰す(babbling idiot)事態を、自己隔離で防ぐ設計になっている。
CAN FD / CAN XL
- CAN FD (Bosch, 2012) — ペイロードを8バイトから64バイトに拡張し、アービトレーション区間は従来速度のままデータ区間だけ高速化する(調停の物理的制約と、スループットの要求を分離した)。
- CAN XL — 最大2048バイト・20Mbps。CAN FDとEthernetの間を埋める位置づけ。
上位プロトコル
CAN自体はアドレッシングもフロー制御も持たないので、実用にはほぼ必ず上位プロトコルが乗る。
- SAE J1939 — 大型車両・建機。29bit IDを分解して PGN (Parameter Group Number) と送信元アドレスを表現する。
- ISO 11783 (ISOBUS) — 農業機械。J1939ベース。
- NMEA 2000 — 舶用。J1939ベース。
- CANopen / DeviceNet — 産業用オートメーション。
- OBD-II — 車両診断。米国では1996年以降義務化。
- ISO-TP (ISO 15765-2) — 8バイトを超えるデータの分割再構成。診断通信で使う。
セキュリティ
CANには認証も暗号化も無い。IDにも送信元を保証する仕組みが無いので、バスに物理的に繋げる(OBD-IIポート、インフォテインメント機器、ヘッドライト裏の配線など)だけで、任意のECUになりすましたメッセージを注入できる。近年の車両ハッキング事例の多くはこの性質を突いている。対策はゲートウェイでのドメイン分離や、上位層でのメッセージ認証(AUTOSAR SecOC など)といった後付けにならざるを得ない。
車載ソフトウェアの安全性という観点では、コーディング規約側からのアプローチとして MISRA C がある。
舶用データ通信プロトコルの中での位置づけ
舶用専用の規格ではないが、NMEA 2000 の土台になっているという意味でこの地図に含まれる。NMEA 2000 のトラブルシューティング(終端抵抗・バス長・アービトレーション)は、結局CANの知識に帰着する。
出典
#can #protocol #embedded #automotive