SocketCAN(gs_usb)

V6 固件支持 SocketCAN(gs_usb),在 Linux 上可以直接使用 SocketCAN。单块 SANPO 集成开发板包含两颗 STM32 芯片,每颗芯片提供 2 路 FDCAN/CAN,因此整板共提供 4 路 FDCAN/CAN 接口。插入设备后,系统会通过内核 gs_usb 驱动生成 canX 网络接口;在主机没有其他 SocketCAN 设备时,通常显示为 can0can1can2can3

SocketCAN 不使用 SANPO 的 ST / ET / SF / EF 自定义帧头。上位机直接使用 Linux 标准工具或 SocketCAN API 发送 CAN 报文,例如 ipcansendcandumppython-can

示例命令中的 cansendcandump 来自 can-utils

功能支持

功能

支持情况

经典 CAN 标准帧

支持

经典 CAN 扩展帧

支持

CAN FD 标准帧

支持

CAN FD 扩展帧

支持

CAN FD BRS

支持

RS485

不通过 SocketCAN 使用,请使用 USB CDC串口或 SPI 协议

通道关系

Linux 最终显示为哪个 canX,由主机枚举顺序决定。通常会出现 4 个 canX 接口,但不能仅凭 can0can1can2can3 判断它们分别连接板上的哪一路 CAN 总线。

建议在系统集成时先确认 canX 和物理接口的对应关系:

ip -details link show type can

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

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

如果需要固定命名,建议在 Linux 上根据 USB 物理端口或设备序列号配置 udev 规则,将 can0can1 这类动态名称固定为业务名称。

经典 CAN 使用

加载驱动:

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

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

发送 CAN FD 标准帧,开启 BRS:

cansend can0 123##11122334455667788

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

cansend can0 0000FD01##11122334455667788

确认接口已经进入 CAN FD 模式:

ip -details link show can0

正常情况下可以看到 fd onbitratedbitrate 等信息。

波特率配置

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

配置 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

配置 can0 为 CAN FD,仲裁段 1 Mbps,数据段 5 Mbps:

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

如果需要同时配置 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

查看配置结果:

ip -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

与 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 总线发送互相冲突的控制命令。