CAN
2 本線のバス。ID が小さい方が勝ち、すべてのフレームに CRC が付く。
標準データフレーム
ID 0x123 で 2 バイトのデータを送るフレームです。CRC もスタッフビットも実際に計算しています。同じビットが 5 つ続くたびに余分なビットが挿入される様子を見てください。
フレーム全体
2 バイトのペイロードに、線上で 61 ビット時間かかり、うち 1 ビットがスタッフビットです。SOF から CRC まではスタッフィングされ、終わりの固定形式部分はされません。500 kbit/s なら 122 マイクロ秒です。
SOF
Start Of Frame。ドミナント(0)の 1 ビットです。バスはアイドル時にレセッシブ(1)なので、この立ち下がりで全ノードに「フレーム開始」を知らせ、ビットタイミングを合わせます。
識別子 0x123
11 ビットの識別子(MSB から)です。宛先ではなく「どんなメッセージか」(例: エンジン回転数)を表します。同時に優先度でもあります。2 つのノードが同時に送ると、ドミナント 0 がレセッシブ 1 を上書きするため、数値の小さい方がアービトレーションに勝ちます。0x123 = 291。
RTR
Remote Transmission Request。0 は通常のデータフレーム、1 なら「この ID を送って」という要求になります。
IDE
Identifier Extension。0 は標準の 11 ビット識別子、1 は拡張 29 ビット形式です。
r0(予約)
予約ビット。ドミナントで送ります。
DLC = 2
Data Length Code。このあと 2 バイトのデータが続きます(0〜8)。4 ビットなので、クラシック CAN では 9〜15 も 8 を意味します。
スタッフビット
同じビットが 5 つ連続した(00000)ので、送信側が 1 を 1 つ挿入します。CAN にはクロック線がなく、受信側はエッジで同期を取り直します。5 ビットごとにエッジを強制することで、同期に十分な変化を保証します。スタッフビットは受信側が自動で取り除くので、データには含まれません。
データ 0 バイト目 = 0xDE
0 バイト目のペイロード(MSB から)。CAN フレームは最大 8 バイトで、意味はこの ID の信号定義を作った側が決めます。
データ 1 バイト目 = 0xAD
1 バイト目のペイロード(MSB から)。CAN フレームは最大 8 バイトで、意味はこの ID の信号定義を作った側が決めます。
概要
CAN(Controller Area Network)は自動車のために作られました。多数の ECU が 1 対のより線を共有し、バスが空いていればどのノードも話せます。メッセージは宛先アドレスではなく ID で区別され、全ノードがすべてのフレームを見ます。
2 つのノードが同時に送り始めると、どちらも ID を送りながら線を監視します。ドミナントの 0 はレセッシブの 1 を上書きするため、1 を送ったノードに 0 が見え、負けたと悟って黙ります。勝った側のフレームは壊れません。アービトレーションに時間のロスがないのです。
基本情報
- 信号線
- CAN_H, CAN_L (differential)
- クロック
- なし(エッジ再同期 + スタッフィング)
- よくある速度
- 125 k / 500 k / 1 Mbit/s
- ペイロード
- 0〜8 バイト(CAN FD は 64 バイト)
- 調停
- ID が小さい方が勝つ(ビット単位)
- 誤り検出
- CRC-15 + stuffing + ACK
使われる場面
- 自動車・トラック: エンジン、ブレーキ、ボディ電装(OBD-II は CAN の上で動く)
- 産業機械・農機(CANopen、J1939)
- 堅牢なマルチノードバスが要るロボット、ドローン、電動バイク
つまずきやすい点
- バスの両端に 120 Ω の終端抵抗が必要です。ないと反射でランダムにエラーが出ます。
- ID は宛先ではなく優先度です。安全に関わるメッセージには小さい ID を割り当てます。
- 全ノードでビットレート(とサンプルポイント)を揃える必要があります。違う速度のノードは毎フレームでエラーを出し、バスを乱します。
出典・規格
- ISO 11898-1 (CAN data link layer)
- Bosch CAN Specification 2.0