Robotics
CAN 通信の基礎
Controller Area Network の物理層・フレーム構造・アービトレーション・エラー処理の基本
要点
CAN は差動 2 線・マルチマスタバス。ID が小さいほど優先度が高く、ビット単位の非破壊アービトレーションで衝突を解決する(CSMA/CR)。Classical CAN は最大 1 Mbps・8 バイトデータ、CAN FD はデータ相最大 8 Mbps・64 バイトまで拡張。
数字
- Classical CAN: 1 Mbps / 8 byte data / ID 11 or 29 bit
- CAN FD: arb 1 Mbps / data 相 8 Mbps / 64 byte data
- 終端: バス両端に 120Ω(合計 60Ω)
- Dominant: CAN_H ≈ 3.5V, CAN_L ≈ 1.5V (差 2V)
- Recessive: CAN_H = CAN_L ≈ 2.5V (差 0V)
- ワイヤードAND: 誰か 1 人が 0 → バスは 0
bit rate と最大バス長(Classical)
| bit rate | 最大バス長 |
|---|---|
| 1 Mbps | 40 m |
| 500 kbps | 100 m |
| 250 kbps | 250 m |
| 125 kbps | 500 m |
| 10 kbps | 5 km |
物理層
- ISO 11898-2 (High-Speed CAN)
- 差動信号 CAN_H / CAN_L + GND
- 符号化: NRZ + ビットスタッフィング(同一値 5 連続で反転ビット挿入、同期維持)
- ドライバ: dominant はプッシュプル、recessive はハイインピーダンス
フレーム構造 (Data Frame, 標準 11-bit ID)
[SOF][ID 11b][RTR][IDE][r0][DLC 4b][Data 0-8B][CRC 15b][CRC delim][ACK][ACK delim][EOF 7b]- SOF: dominant 1 bit、バス同期の起点
- ID: 標準 11 bit / 拡張 29 bit (CAN 2.0B)
- RTR: Remote Transmission Request (データ要求フレーム)
- DLC: データ長 0〜8 byte (FD は 0〜64)
- CRC: 15 bit
- ACK: 送信側 recessive → 受信側が dominant で上書きで成立
アービトレーション (CSMA/CR)
- 複数ノードが同時送信開始
- ID を 1 bit ずつ送りながら、自分のビットとバス上のビットを比較
- Recessive(1) を出したのに Dominant(0) が見えたら → 負け → 即送信中止
- 勝者はそのまま送信継続
ID 値が小さいほど優先度が高い。衝突しても再送不要、決定論的。
設計上: 緊急停止・低レイテンシ要求のメッセージに小さい ID を割り当てる。
エラー処理
5 種のエラー検出
- Bit error (アービトレーション期を除き、自分の出力とバスが不一致)
- Stuff error (6 連続同値)
- CRC error
- Form error (固定フィールドに dominant)
- ACK error (誰も ACK しない)
エラー検出したノードは Error Frame を送信 → 全ノードが現フレーム破棄 → 送信者が自動再送。
フォールト封じ込め
各ノードに TEC (送信エラーカウンタ) / REC (受信エラーカウンタ):
- 0 〜 127: Error Active (通常)
- 128 〜 255: Error Passive (Error Frame の送信が制限)
- 256 〜: Bus Off (バス切断、リセット必要)
Classical CAN / CAN FD / CAN XL
| Classical | CAN FD | CAN XL | |
|---|---|---|---|
| 最大ペイロード | 8 B | 64 B | 2048 B |
| arb 相 | 1 Mbps | 1 Mbps | 1 Mbps |
| data 相 | 1 Mbps | 8 Mbps (実用 2〜5) | 10+ Mbps |
| 公開年 | 1986 | 2012 | 2018 |
Linux での操作 (SocketCAN)
sudo apt install can-utils
# 実 HW
sudo ip link set can0 type can bitrate 500000
sudo ip link set can0 up
candump can0 # 受信モニタ
cansend can0 123#DEADBEEF # ID 0x123, 4 byte 送信
cangen can0 -I 100 -L 8 -D r # ランダム生成
# 仮想 CAN (HW 無しで試せる)
sudo modprobe vcan
sudo ip link add dev vcan0 type vcan
sudo ip link set up vcan0関連
- [[can-fd]]
- [[canopen-basics]]
- [[socketcan]]
- [[gs-usb-timestamp]]
最終更新: