# SocketCAN SocketCAN 适合在 Linux 上直接控制 CAN 和 CAN FD 设备。开发板通过 USB 接入后,Linux 会把 4 路 CAN/CAN FD 显示为 4 个 `canX` 网络接口,可以直接使用 `can-utils`、`python-can` 或其他 SocketCAN 软件。 Windows下没有 SocketCAN 网络接口。可以使用 协议模式 收发CAN/FDCAN数据,请阅读:[SANPO USB 转 CAN](usb_can) 和 [SANPO USB 转 FDCAN](usb_fdcan)。 Windows下调试 CAN 和 CAN FD 设备,可以使用线上调试工具 [SANPO Studio](https://sanporobot.com/sanpo-studio),或者离线软件 [CANgaroo](https://gitcode.com/sanpo/robot/blob/main/products/spine/v8/tools/CANgaroo/CANgaroo-Windows-MinGW-Qt6.zip)。 ## 连接和识别设备 1. 将开发板 USB 接到 Linux/Windows 主机。开发板芯片通过USB供电,确保USB电压不低于5V。 2. 将电机接到开发板 CAN 接口,XT60接入电机电源。 3. Linux下使用方式: 安装工具并加载驱动 ```bash sudo apt update sudo apt install can-utils sudo modprobe gs_usb ``` 查看接口: ```bash ip link show type can ``` 完整开发板通常显示 4 个 `canX`。Linux 的编号取决于枚举顺序,不能仅凭 `can0~can3` 判断对应的板上接口。 首次使用时,建议只连接一个电机,逐个接口发送查询命令确认物理对应关系。也可以查看 USB 设备路径: ```bash readlink -f /sys/class/net/can0/device udevadm info -q property -p "$(readlink -f /sys/class/net/can0/device)" ``` 长期使用时,可以根据 USB 物理端口或设备序列号编写 `udev` 规则,为接口设置稳定名称。 ### 配置经典 CAN 将 `can0` 设置为 1 Mbps: ```bash sudo ip link set can0 down sudo ip link set can0 type can bitrate 1000000 sudo ip link set can0 up ``` 监听总线: ```bash candump can0 ``` 发送标准帧: ```bash cansend can0 123#11223344 ``` 以上数据仅作为示例,应替换为实际电机协议要求的 ID 和数据。 发送扩展帧: ```bash cansend can0 0000FD01#0102030405060708 ``` 以上数据仅作为示例,应替换为实际电机协议要求的 ID 和数据。 `cansend` 成功时通常没有输出。电机是否回复取决于电机协议、ID 和当前状态。 ### 配置 CAN FD 将 `can0` 设置为仲裁段 1 Mbps、数据段 可配置 2/3/4/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 ``` 发送开启 BRS 的 CAN FD 标准帧: ```bash cansend can0 123##11122334455667788 ``` 以上数据仅作为示例,应替换为实际电机协议要求的 ID 和数据。 发送开启 BRS 的 CAN FD 扩展帧: ```bash cansend can0 0000FD01##11122334455667788 ``` 以上数据仅作为示例,应替换为实际电机协议要求的 ID 和数据。 在 `##` 后,第一个十六进制数字是 CAN FD 标志;`1` 表示开启 BRS,后面才是数据。 ## 查看状态 ```bash ip -s -details link show can0 ``` CAN FD 正常启用时可以看到 `fd on`、`bitrate` 和 `dbitrate`。如果错误计数持续增加,应停止发送并检查波特率、终端电阻、接线和设备供电。 SocketCAN 设置不会保存到开发板。设备重新上电、重新插拔或重新枚举后,应重新执行 `ip link` 配置。 ## 小米CyberGear电机 示例 完整示例:[Linux SocketCAN CyberGear 使用说明](https://gitcode.com/sanpo/robot/blob/main/products/spine/v8/demo/guides/socketcan-cybergear.md) 控制 `can0` 上 ID 为 1 的电机: ```bash sudo python3 socketcan_cybergear_demo_v8.py \ --setup-links \ --motor-map "can0:1" ``` 多接口示例: ```text --motor-map "can0:1,2,3;can1:4,5,6" ``` 运行前应根据实际枚举结果和电机接线修改接口名及 ID。 ## 常见问题 | 现象 | 处理方法 | | --- | --- | | 找不到 `canX` | 执行 `sudo modprobe gs_usb`,然后重新插拔 USB | | `Network is down` | 执行对应的 `sudo ip link set can0 up` | | `Device or resource busy` | 先执行 `sudo ip link set can0 down`,再重新配置 | | `No buffer space available` | 检查总线接线、波特率和终端电阻;排除问题后将接口 down 再重新启用 | | 能发送但电机没有回复 | 检查 `canX` 与物理接口的对应关系、电机 ID、协议、供电和总线参数 |