SocketCAN
SocketCAN 适合在 Linux 上直接控制 CAN 和 CAN FD 设备。开发板通过 USB 接入后,Linux 会把 4 路 CAN/CAN FD 显示为 4 个 canX 网络接口,可以直接使用 can-utils、python-can 或其他 SocketCAN 软件。
Windows下没有 SocketCAN 网络接口。可以使用 协议模式 收发CAN/FDCAN数据,请阅读:SANPO USB 转 CAN 和 SANPO USB 转 FDCAN。
Windows下调试 CAN 和 CAN FD 设备,可以使用线上调试工具 SANPO Studio,或者离线软件 CANgaroo。
连接和识别设备
将开发板 USB 接到 Linux/Windows 主机。开发板芯片通过USB供电,确保USB电压不低于5V。
将电机接到开发板 CAN 接口,XT60接入电机电源。
Linux下使用方式:
安装工具并加载驱动
sudo apt update
sudo apt install can-utils
sudo modprobe gs_usb
查看接口:
ip link show type can
完整开发板通常显示 4 个 canX。Linux 的编号取决于枚举顺序,不能仅凭 can0~can3 判断对应的板上接口。
首次使用时,建议只连接一个电机,逐个接口发送查询命令确认物理对应关系。也可以查看 USB 设备路径:
readlink -f /sys/class/net/can0/device
udevadm info -q property -p "$(readlink -f /sys/class/net/can0/device)"
长期使用时,可以根据 USB 物理端口或设备序列号编写 udev 规则,为接口设置稳定名称。
配置经典 CAN
将 can0 设置为 1 Mbps:
sudo ip link set can0 down
sudo ip link set can0 type can bitrate 1000000
sudo ip link set can0 up
监听总线:
candump can0
发送标准帧:
cansend can0 123#11223344
以上数据仅作为示例,应替换为实际电机协议要求的 ID 和数据。
发送扩展帧:
cansend can0 0000FD01#0102030405060708
以上数据仅作为示例,应替换为实际电机协议要求的 ID 和数据。
cansend 成功时通常没有输出。电机是否回复取决于电机协议、ID 和当前状态。
配置 CAN FD
将 can0 设置为仲裁段 1 Mbps、数据段 可配置 2/3/4/5 Mbps,并启用 CAN FD:
sudo ip link set can0 down
sudo ip link set can0 type can bitrate 1000000 dbitrate 5000000 fd on
sudo ip link set can0 up
发送开启 BRS 的 CAN FD 标准帧:
cansend can0 123##11122334455667788
以上数据仅作为示例,应替换为实际电机协议要求的 ID 和数据。
发送开启 BRS 的 CAN FD 扩展帧:
cansend can0 0000FD01##11122334455667788
以上数据仅作为示例,应替换为实际电机协议要求的 ID 和数据。
在 ## 后,第一个十六进制数字是 CAN FD 标志;1 表示开启 BRS,后面才是数据。
查看状态
ip -s -details link show can0
CAN FD 正常启用时可以看到 fd on、bitrate 和 dbitrate。如果错误计数持续增加,应停止发送并检查波特率、终端电阻、接线和设备供电。
SocketCAN 设置不会保存到开发板。设备重新上电、重新插拔或重新枚举后,应重新执行 ip link 配置。
V错误处理与 Bus-Off 恢复
V83以后的固件版本增加错误处理和Bus-Off恢复能力,会把 Error Warning、Error Passive、Bus-Off 和 Restarted 状态作为标准
SocketCAN 错误帧上报,并附带发送/接收错误计数。主机启用
berr-reporting on 时,还会上报 Stuff、Form、ACK、Bit0、Bit1 和 CRC 等总线
错误详情。可使用以下命令观察:
candump -e can0
ip -s -details link show can0
Bus-Off 恢复采用兼容的双路径:
Linux 6.8 等旧版
gs_usb不识别扩展特性时,固件在 Bus-Off 后等待 100 ms 自动恢复;此时不要设置restart-ms。支持
GS_CAN_FEATURE_BUS_OFF_RECOVERY(bit 18)和GS_USB_BREQ_BUS_OFF_RECOVERY(request 32)的新版驱动会接管恢复。此时可由 SocketCAN 设置恢复时间:
sudo ip link set can0 down
sudo ip link set can0 type can bitrate 1000000 dbitrate 5000000 fd on \
berr-reporting on restart-ms 100
sudo ip link set can0 up
若命令返回 Operation not supported,说明当前驱动仍是旧路径,去掉
restart-ms 即可,固件自动恢复仍然有效。若新版驱动设置 restart-ms 0,则
不会自动重启,可在排除接线、终端电阻、供电或波特率问题后执行手动恢复:
sudo ip link set can0 type can restart
恢复时会清空 FDCAN 硬件发送项以及 USB、SPI 软件发送队列,避免把 Bus-Off
期间积压的旧运动指令在总线恢复后重放。正常运行路径只检查内存中的中断标志,
不会每 1 ms 读取 FDCAN 错误寄存器。管理口 AT+STAT? 中 CABOF/CBBOF
表示 Bus-Off 次数,CARCV/CBRCV 表示成功恢复次数,CARCF/CBRCF 表示恢复
失败重试次数,CADROP/CBDROP 表示恢复时丢弃的旧帧数,CATXMAX/CBTXMAX
表示观测到的最大发送错误计数。
小米CyberGear电机 示例
完整示例:Linux SocketCAN CyberGear 使用说明
控制 can0 上 ID 为 1 的电机:
sudo python3 socketcan_cybergear_demo_v8.py \
--setup-links \
--motor-map "can0:1"
多接口示例:
--motor-map "can0:1,2,3;can1:4,5,6"
运行前应根据实际枚举结果和电机接线修改接口名及 ID。
SANPO J8108-R8 FDCAN 示例
完整示例:SocketCAN J8108-R8 FDCAN 只读测试
该程序只发送 SANPO FDCAN v1 的 HELLO 和 STATE_REQUEST,读取电机
CAPABILITY 和 STATE,不会使能电机或发送运动目标。不带 --interfaces
时默认遍历系统中的全部 canX(整板通常为 can0~can3)。以下命令将四路
接口配置为仲裁段 1 Mbit/s、数据段 5 Mbit/s、CAN FD+BRS 后逐路测试:
J8108-R8 必须已经选择并重启进入 SANPO FDCAN Profile;样例不会切换或写入
电机 Profile。
python3 socketcan_j8108_demo_v8.py \
--setup-links \
--node-id 1
仅枚举接口而不发送测试帧时使用 --list-only。
只检查指定接口:
python3 socketcan_j8108_demo_v8.py \
--setup-links \
--interfaces can0,can1 \
--node-id 1
若已有 J8108-R8 配置为 1M/2M,应增加 --data-bitrate 2000000。未连接电机的
接口显示 MISS 属于正常现象;至少一条路径同时通过 CAPABILITY 和 STATE
即证明该路径的 CAN FD 双向通信正常。详细说明见
J8108-R8 FDCAN 测试指南。
常见问题
现象 |
处理方法 |
|---|---|
找不到 |
执行 |
|
执行对应的 |
|
先执行 |
|
检查总线接线、波特率和终端电阻;排除问题后将接口 down 再重新启用 |
能发送但电机没有回复 |
检查 |