SocketCAN

SocketCAN 适合在 Linux 上直接控制 CAN 和 CAN FD 设备。开发板通过 USB 接入后,Linux 会把 4 路 CAN/CAN FD 显示为 4 个 canX 网络接口,可以直接使用 can-utilspython-can 或其他 SocketCAN 软件。

Windows下没有 SocketCAN 网络接口。可以使用 协议模式 收发CAN/FDCAN数据,请阅读:SANPO USB 转 CANSANPO 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 onbitratedbitrate。如果错误计数持续增加,应停止发送并检查波特率、终端电阻、接线和设备供电。

SocketCAN 设置不会保存到开发板。设备重新上电、重新插拔或重新枚举后,应重新执行 ip link 配置。

小米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。

常见问题

现象

处理方法

找不到 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、协议、供电和总线参数