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。

连接和识别设备

  1. 将开发板 USB 接到 Linux/Windows 主机。开发板芯片通过USB供电,确保USB电压不低于5V。

  2. 将电机接到开发板 CAN 接口,XT60接入电机电源。

  3. 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 测试指南。

常见问题

现象

处理方法

找不到 canX

执行 sudo modprobe gs_usb,然后重新插拔 USB

Network is down

执行对应的 sudo ip link set can0 up

Device or resource busy

先执行 sudo ip link set can0 down,再重新配置

No buffer space available

检查总线接线、波特率和终端电阻;排除问题后将接口 down 再重新启用

能发送但电机没有回复

检查 canX 与物理接口的对应关系、电机 ID、协议、供电和总线参数