SocketCAN

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

SocketCAN 不使用 SANPO 的 STETSFEF 帧头。RS485 也不通过 SocketCAN 使用。

连接和识别设备

  1. 将开发板 USB 接到 Linux 主机。

  2. 将电机接到开发板 CAN 接口并正常供电。

  3. 安装工具并加载驱动:

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

发送扩展帧:

cansend can0 0000FD01#0102030405060708

cansend 成功时通常没有输出。电机是否回复取决于电机协议、ID 和当前状态。

使用 CAN FD

can0 设置为仲裁段 1 Mbps、数据段 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

发送开启 BRS 的 CAN FD 扩展帧:

cansend can0 0000FD01##11122334455667788

## 后,第一个十六进制数字是 CAN FD 标志;1 表示开启 BRS,后面才是数据。

查看状态

ip -s -details link show can0

CAN FD 正常启用时可以看到 fd onbitratedbitrate。如果错误计数持续增加,应停止发送并检查波特率、终端电阻、接线和设备供电。

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

CyberGear 示例

示例程序:SocketCAN CyberGear 示例

控制 can0 上 ID 为 1 的电机:

sudo python3 socketcan_cybergear_demo_v6.py \
  --setup-links \
  --motor-map "can0:1"

多接口示例:

--motor-map "can0:1,2,3;can1:4,5,6"

运行前应根据实际枚举结果和电机接线修改接口名及 ID。

常见问题

现象

处理方法

找不到 canX

确认两颗 MCU 已烧录 V6 固件,执行 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、协议、供电和总线参数