SocketCAN(gs_usb)

V4.6 及以后固件支持 SocketCAN(gs_usb)。通过 USB CDC串口工具发送 AT+VER 查询版本时,V4.6 固件返回 V46。使用串口工具发送 AT+ 指令时,请将发送结束符设置为 CRLF。在 Linux 主机通过 USB 接入开发板后,系统会通过内核 gs_usb 驱动生成 canX 网络接口。用户可以直接使用 ipcansendcandumppython-can 等标准 SocketCAN 工具收发经典 CAN 报文。

SocketCAN 是 Linux 下的 CAN 网络接口使用方式,不使用 SANPO USB CDC串口协议中的 ST / ET 自定义帧头。如果需要使用 SANPO Studio、原有 USB 串口 Python 示例或电机原厂串口调试软件,请参考 USB 转 CAN

功能支持

功能

支持情况

经典 CAN 标准帧

支持

经典 CAN 扩展帧

支持

经典 CAN 远程帧

支持

RS485

不通过 SocketCAN 使用

RS485 仍通过 USB CDC串口协议或 SPI 协议使用,请参考 USB 转 RS485SPI 转 RS485

接口说明

SANPO 集成开发板包含两颗 STM32F407 芯片,每颗芯片提供 2 路 CAN 接口。通过 USB 接入 Linux 后,会枚举出 4 个 canX 接口。

Linux 分配的 can0can1can2can3 顺序由主机枚举顺序决定。正式使用前建议先确认 canX 与开发板物理 CAN 接口的对应关系。

支持 SocketCAN 的 V4 固件使用 USB 复合设备方式枚举,因此 Linux 上通常会同时出现 canX 网络接口和 /dev/ttyACM* USB CDC串口。canX 用于 SocketCAN,/dev/ttyACM* 仍可用于原有 USB CDC串口协议。

查看当前 CAN 接口:

ip link show type can

查看接口详细信息:

ip -details link show can0

查看某个 canX 对应的 USB 设备路径:

readlink -f /sys/class/net/can0/device
udevadm info -q property -p "$(readlink -f /sys/class/net/can0/device)"

如果系统中同时接入多个 SocketCAN 设备,建议在 Linux 上根据 USB 物理端口或设备序列号配置 udev 规则,将动态的 can0can1 等名称固定为业务中更容易识别的名称。

Linux 使用步骤

安装常用 CAN 工具:

sudo apt install can-utils

加载 gs_usb 驱动:

sudo modprobe gs_usb

配置 can0 为 1 Mbps 经典 CAN:

sudo ip link set can0 down
sudo ip link set can0 type can bitrate 1000000
sudo ip link set can0 up

发送标准帧:

cansend can0 123#11223344

发送扩展帧:

cansend can0 0000FD01#0102030405060708

接收报文:

candump can0

查看接口状态和收发统计:

ip -s -details link show can0

开发样例

Ubuntu 下可以使用以下命令运行示例:

sudo python3 socketcan_cybergear_demo_v6.py \
  --setup-links \
  --motor-map "can2:1,2,3;can3:4,5,6;can0:7,8,9;can1:10,11,12"

其中 can0can1can2can3 是 Linux 枚举出来的 SocketCAN 网络接口名,不一定与开发板丝印或物理 CAN 接口顺序固定对应。正式运行前,应先确认每个 canX 对应的实际物理接口和接入的电机 ID,再按现场接线修改 --motor-map。例如 can2:1,2,3 表示当前 Linux 系统中的 can2 接口连接了 ID 为 1、2、3 的电机。

--setup-links 会在打开 SocketCAN 套接字前配置命令中涉及的 canX 接口,默认波特率为 1 Mbps;如需使用其他波特率,可同时指定 --bitrate

波特率配置

SocketCAN 的波特率由 Linux 主机通过 ip link set 配置,只对当前运行中的 canX 接口生效,不会写入固件 Flash。设备重新上电、重新插拔或重新枚举后,需要由上位机重新配置。

修改波特率前,应先将接口设为 down

sudo ip link set can0 down
sudo ip link set can0 type can bitrate 500000
sudo ip link set can0 up

如果接口仍处于 up 状态时修改波特率,Linux 可能返回:

RTNETLINK answers: Device or resource busy

此时先执行 sudo ip link set can0 down,再重新配置波特率。

如果需要同时配置 can0~can3 为 1 Mbps 经典 CAN,可以逐个接口执行:

for i in 0 1 2 3; do
  sudo ip link set can$i down
  sudo ip link set can$i type can bitrate 1000000
  sudo ip link set can$i up
done

与 USB CDC串口/SPI 的关系

SocketCAN、USB CDC串口协议和 SPI 协议是三种不同的上位机入口。它们最终访问的是开发板上的同一组物理 CAN 接口。

  • SocketCAN 面向 Linux 标准 CAN 网络接口,适合使用 can-utilspython-can 或 Linux SocketCAN API 的场景。

  • USB CDC串口协议面向 SANPO Studio、串口工具、原有 USB 串口 Python 示例和部分电机原厂调试软件。

  • SPI 协议面向 Jetson Nano、树莓派或其他主控板通过 SPI 与开发板高速通信的场景。

正式控制同一路物理 CAN 总线时,建议选择其中一种入口发送控制帧。若同时使用多个入口,需要确保波特率配置一致,并避免不同上位机程序同时向同一 CAN 总线发送互相冲突的控制命令。