notes
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 Mbps40 m
500 kbps100 m
250 kbps250 m
125 kbps500 m
10 kbps5 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)#

  1. 複数ノードが同時送信開始
  2. ID を 1 bit ずつ送りながら、自分のビットとバス上のビットを比較
  3. Recessive(1) を出したのに Dominant(0) が見えたら → 負け → 即送信中止
  4. 勝者はそのまま送信継続

ID 値が小さいほど優先度が高い。衝突しても再送不要、決定論的。

設計上: 緊急停止・低レイテンシ要求のメッセージに小さい ID を割り当てる。

エラー処理#

5 種のエラー検出#

  1. Bit error (アービトレーション期を除き、自分の出力とバスが不一致)
  2. Stuff error (6 連続同値)
  3. CRC error
  4. Form error (固定フィールドに dominant)
  5. 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#

ClassicalCAN FDCAN XL
最大ペイロード8 B64 B2048 B
arb 相1 Mbps1 Mbps1 Mbps
data 相1 Mbps8 Mbps (実用 2〜5)10+ Mbps
公開年198620122018

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]]
最終更新:

On this page