SocketCAN(gs_usb)
V6 固件支持 SocketCAN(gs_usb),在 Linux 上可以直接使用 SocketCAN。单块 SANPO 集成开发板包含两颗 STM32 芯片,每颗芯片提供 2 路 FDCAN/CAN,因此整板共提供 4 路 FDCAN/CAN 接口。插入设备后,系统会通过内核 gs_usb 驱动生成 canX 网络接口;在主机没有其他 SocketCAN 设备时,通常显示为 can0、can1、can2、can3。
SocketCAN 不使用 SANPO 的 ST / ET / SF / EF 自定义帧头。上位机直接使用 Linux 标准工具或 SocketCAN API 发送 CAN 报文,例如 ip、cansend、candump、python-can。
示例命令中的 cansend 和 candump 来自 can-utils。
功能支持
功能 |
支持情况 |
|---|---|
经典 CAN 标准帧 |
支持 |
经典 CAN 扩展帧 |
支持 |
CAN FD 标准帧 |
支持 |
CAN FD 扩展帧 |
支持 |
CAN FD BRS |
支持 |
RS485 |
不通过 SocketCAN 使用,请使用 USB CDC串口或 SPI 协议 |
通道关系
Linux 最终显示为哪个 canX,由主机枚举顺序决定。通常会出现 4 个 canX 接口,但不能仅凭 can0、can1、can2、can3 判断它们分别连接板上的哪一路 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 规则,将 can0、can1 这类动态名称固定为业务名称。
经典 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 on、bitrate、dbitrate 等信息。
波特率配置
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
开发样例
SocketCAN 控制小米 CyberGear 电机示例程序(Python 版本):socketcan_cybergear_demo_v6.py
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"
其中 can0、can1、can2、can3 是 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-utils、python-can或 Linux SocketCAN API 的场景。USB CDC串口协议面向 SANPO Studio、串口工具、原有 USB 串口 Python 示例和部分电机原厂调试软件。
SPI 协议面向 Jetson Nano、树莓派或其他主控板通过 SPI 与开发板高速通信的场景。
正式控制同一路物理 CAN 总线时,建议选择其中一种入口发送控制帧。若同时使用多个入口,需要确保波特率配置一致,并避免不同上位机程序同时向同一 CAN 总线发送互相冲突的控制命令。