SocketCAN(gs_usb)
V4.6 及以后固件支持 SocketCAN(gs_usb)。通过 USB CDC串口工具发送 AT+VER 查询版本时,V4.6 固件返回 V46。使用串口工具发送 AT+ 指令时,请将发送结束符设置为 CRLF。在 Linux 主机通过 USB 接入开发板后,系统会通过内核 gs_usb 驱动生成 canX 网络接口。用户可以直接使用 ip、cansend、candump、python-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 转 RS485 和 SPI 转 RS485。
接口说明
SANPO 集成开发板包含两颗 STM32F407 芯片,每颗芯片提供 2 路 CAN 接口。通过 USB 接入 Linux 后,会枚举出 4 个 canX 接口。
Linux 分配的 can0、can1、can2、can3 顺序由主机枚举顺序决定。正式使用前建议先确认 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 规则,将动态的 can0、can1 等名称固定为业务中更容易识别的名称。
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
开发样例
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。
波特率配置
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-utils、python-can或 Linux SocketCAN API 的场景。USB CDC串口协议面向 SANPO Studio、串口工具、原有 USB 串口 Python 示例和部分电机原厂调试软件。
SPI 协议面向 Jetson Nano、树莓派或其他主控板通过 SPI 与开发板高速通信的场景。
正式控制同一路物理 CAN 总线时,建议选择其中一种入口发送控制帧。若同时使用多个入口,需要确保波特率配置一致,并避免不同上位机程序同时向同一 CAN 总线发送互相冲突的控制命令。