# 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` 和物理接口的对应关系: ```bash ip -details link show type can ``` 查看某个接口对应的 USB 设备路径: ```bash 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 使用 加载驱动: ```bash sudo modprobe gs_usb ``` 配置 `can0` 为 1 Mbps 经典 CAN: ```bash sudo ip link set can0 down sudo ip link set can0 type can bitrate 1000000 sudo ip link set can0 up ``` 发送标准帧: ```bash cansend can0 123#11223344 ``` 发送扩展帧: ```bash cansend can0 0000FD01#0102030405060708 ``` 接收报文: ```bash candump can0 ``` 查看接口状态和统计信息: ```bash ip -s -details link show can0 ``` ## CAN FD 使用 配置 `can0` 为仲裁段 1 Mbps、数据段 5 Mbps,并开启 CAN FD: ```bash 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: ```bash cansend can0 123##11122334455667788 ``` 发送 CAN FD 扩展帧,开启 BRS: ```bash cansend can0 0000FD01##11122334455667788 ``` 确认接口已经进入 CAN FD 模式: ```bash ip -details link show can0 ``` 正常情况下可以看到 `fd on`、`bitrate`、`dbitrate` 等信息。 ## 波特率配置 SocketCAN 的波特率由 Linux 主机通过 `ip link set` 配置。该配置只对当前运行中的 `canX` 接口生效,不会写入固件 Flash;设备重新上电、重新插拔或重新枚举后,应由上位机重新配置。 配置 `can0` 为 1 Mbps 经典 CAN: ```bash 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: ```bash 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,可以逐个接口执行: ```bash 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 ``` 查看配置结果: ```bash ip -details link show can0 ``` ## 开发样例 - SocketCAN 控制小米 CyberGear 电机示例程序(Python 版本):socketcan_cybergear_demo_v6.py Ubuntu 下可以使用以下命令运行示例: ```bash 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 总线发送互相冲突的控制命令。