USB-CAN 适配器选型 (OmniPicker CAN-FD)
OmniPicker 使用 CAN-FD 协议通信,仲裁段 1 Mbps / 数据段 5 Mbps。本文调研适用于 Linux + SocketCAN + python-can 环境的 USB-CAN 适配器方案。
选型对比
| 指标 | CANable 2.0 (MKS) | PCAN-USB FD | Innomaker USB2CAN | candleLight FD |
|---|---|---|---|---|
| CAN-FD | 支持 (slcan 固件; candleLight 固件暂不支持 FD) | 原生支持 | 不支持 (仅 CAN 2.0) | 原生支持 |
| 最大速率 | 仲裁 1M / 数据 5M (slcan) | 仲裁 1M / 数据 12M | 仅 1 Mbps CAN 2.0 | 仲裁 500K / 数据 2M (已验证); 理论更高 |
| Linux 驱动 | gs_usb 内核驱动 (candleLight); slcand 用户态 (slcan) | peak_usb 内核驱动 (自 Kernel 3.4; FD 自 Kernel 4.0) | gs_usb 内核驱动 (自 Kernel 5.4 免驱) | gs_usb 内核驱动 (FD 需 Kernel >= 5.18) |
| SocketCAN | 原生 (candleLight) 或 slcand (slcan) | 原生 | 原生 | 原生 |
| 硬件时间戳 | 支持 (1 us 精度, candleLight 固件, Kernel >= 6.1) | 支持 (us 级精度, 有 USB 同步漂移) | 不明确 | 支持 (1 us, Kernel >= 6.1) |
| 隔离保护 | MKS Pro S: 5.7 kV 隔离 | 500V 电气隔离 | 3000V 隔离 + 15 kV ESD | 无隔离 (需外部隔离) |
| 参考价格 | ~80-150 CNY (淘宝 MKS 版) | ~2500-2800 CNY (正品); ~700 CNY (兼容) | ~100-200 CNY | ~400 CNY (欧洲进口, 约 55 EUR) |
| 国内购买 | 淘宝/京东有大量 MKS CANable 2.0 Pro 现货 | 京东/淘宝有, 但正品贵; 有兼容 PCAN 替代品 | 淘宝/京东现货, Innomaker 为国内品牌 | 需海淘 (Linux Automation GmbH, 德国) |
| python-can | socketcan 接口 (candleLight) 或 gs_usb 接口 | socketcan 接口或 pcan 接口 | socketcan 接口 | socketcan 接口或 gs_usb 接口 |
| 开源 | 硬件+固件全开源 (CERN OHL) | 闭源 | 驱动开源, 硬件闭源 | 硬件+固件全开源 (CERN OHL) |
关键发现
CANable 2.0 固件选择问题
CANable 2.0 有两种固件模式, 对 CAN-FD 支持有重大差异:
- candleLight 固件 (gs_usb): 即插即用, 直接枚举为 SocketCAN 设备 (can0), 不需要 slcand. 但官方 candleLight 固件目前不支持 CAN-FD 帧.
- slcan 固件: 通过串口 + slcand 用户态守护进程工作. 支持 CAN-FD, 但性能和延迟不如 gs_usb 原生驱动.
- CANable 2.5 固件 (第三方增强): 将 slcan 和 candleLight 合并为一个代码库, 在 candleLight 模式下也支持 CAN-FD. 这是目前最佳选择.
Innomaker 不适用
Innomaker USB2CAN 系列全线产品仅支持 CAN 2.0A/2.0B, 最高 1 Mbps. 不支持 CAN-FD, 不满足 OmniPicker 1M/5M CAN-FD 需求. 排除.
PCAN-USB FD 的优劣
- 优势: 工业级品质, 500V 电气隔离, 12 Mbps CAN-FD, peak_usb 内核驱动非常成熟稳定.
- 劣势: 正品价格约 $368 USD (~2600 CNY), 性价比低. 国内有兼容版 (~700 CNY) 但驱动兼容性存疑.
candleLight FD
- 由 Linux Automation GmbH (Pengutronix 关联) 制造, 硬件品质有保证.
- 使用 STM32G0B1CBT 处理器, gs_usb 驱动原生支持.
- CAN-FD 需 Linux >= 5.18, 硬件时间戳需 Kernel >= 6.1.
- 售价约 55 EUR (~440 CNY), 需从德国海淘, 国内不便购买.
总线带宽分析
场景: 2 台 OmniPicker, 100 Hz 轮询
假设每台设备每个周期收发各 1 帧, 每帧 8 字节数据 (CAN-FD 可达 64 字节, 此处按保守 8 字节估算):
CAN-FD 帧大小估算 (8 字节数据):
- 仲裁段 (1 Mbps): SOF(1) + ID(11/29) + 控制位(~7) = ~40 bits
- 数据段 (5 Mbps): 数据(64 bits) + CRC(17 bits) = ~81 bits
- 尾部 (1 Mbps): ACK(2) + EOF(7) + IFS(3) = ~12 bits
- 位填充开销: ~20%
单帧总线占用时间:
- 仲裁段: 40 bits / 1 Mbps = 40 us
- 数据段: 81 bits / 5 Mbps = 16.2 us
- 尾部: 12 bits / 1 Mbps = 12 us
- 小计: ~68.2 us/帧
- 加 20% 位填充: ~82 us/帧
总线负载计算:
消息数 = 2 设备 x 100 Hz x 2 (TX+RX) = 400 帧/秒
总线占用 = 400 x 82 us = 32,800 us/s = 32.8 ms/s
总线负载 = 32.8 ms / 1000 ms = 3.28%
结论: 总线负载仅约 3.3%, 远低于推荐上限 (一般建议 < 70%). 单个 USB-CAN 适配器完全可以承载两台 OmniPicker 在同一总线上以 100 Hz 轮询.
即使提升到 64 字节 CAN-FD 帧:
数据段: 512 bits / 5 Mbps = 102.4 us
单帧: ~(40 + 102.4 + 12) x 1.2 = ~185 us
总负载: 400 x 185 us = 74 ms/s = 7.4%
依然非常轻松.
USB 端瓶颈
USB 2.0 Full Speed (12 Mbps) 是大多数 USB-CAN 适配器的上行瓶颈, 但 400 帧/s x ~20 字节/帧 = 8 KB/s, 远低于 USB 2.0 FS 吞吐极限. 不构成瓶颈.
推荐方案
首选: MKS CANable 2.0 Pro (刷 CANable 2.5 固件)
- 价格: ~80-150 CNY (淘宝大量现货)
- 刷入 CANable 2.5 固件: 合并 slcan + candleLight, 在 gs_usb 模式下支持 CAN-FD
- 驱动: gs_usb 内核驱动, 即插即用
- 硬件时间戳: 1 us 精度 (Kernel >= 6.1)
- MKS Pro S 版: 带 5.7 kV 隔离, 适合工业环境
python-can 配置示例:
import can
bus = can.Bus(channel='can0', interface='socketcan', fd=True,
bitrate=1000000, data_bitrate=5000000)ip link 配置:
sudo ip link set can0 type can bitrate 1000000 dbitrate 5000000 fd on
sudo ip link set can0 up备选: PCAN-USB FD (预算充足 / 需工业级可靠性)
- 适合需要长期稳定运行的生产环境
- peak_usb 驱动非常成熟, 几乎零配置
- 500V 隔离是硬件级保障