🤖 roboto_origin_03 Wiki
首页 / 固件 / USB2CAN 适配器使用指南

roboto_usb2can 是一款面向机器人开发与 CAN 总线调试场景的单通道 USB 转 CAN2.0 适配器。本文档面向初次接触的开发者,提供从开箱到稳定通信的完整路径,涵盖 Windows 免驱使用、Linux SocketCAN 接入、上位机工具操作以及固件更新方法。通过本指南,你可以在 10 分钟内完成首次 CAN 数据收发。

Sources: readme_cn.md

产品概览与硬件规格

适配器基于 STM32G431CBT6 微控制器构建,运行 Zephyr RTOS 实时操作系统,通过开源 gs_usb 协议(candleLight 兼容)与主机通信。核心优势在于跨平台免驱:Windows 8.1 及以上系统通过 WinUSB 描述符自动绑定驱动,Linux 内核 3.16 以上版本则自带 gs_usb 驱动实现即插即用。

硬件规格如下表所示:

项目 参数
MCU STM32G431CBT6 (Cortex-M4+ @ 170MHz)
USB 接口 USB 2.0 Full Speed (Type-C)
CAN 接口 单路 CAN2.0(兼容 ISO 11898)
隔离收发器 TI ISO1050
状态指示灯 蓝灯(USB 状态)、黄灯(CAN 状态)、绿灯(数据活动)
设备 VID/PID 0x1D50 / 0x606F

Sources: readme_cn.md roboto_usb2can.dts

系统架构

下图展示了适配器在两种主流操作系统中的工作方式。Windows 环境下通过 WinUSB 与上位机工具交互;Linux 环境下由内核 gs_usb 驱动自动创建 SocketCAN 接口,直接兼容 can-utils 工具链。

graph LR
    subgraph 主机端
        A[Windows 应用] -->|WinUSB| B[USB 总线]
        C[Linux 应用<br/>candump/cansend] -->|SocketCAN| B
    end
    B -->|USB 2.0 FS| D[roboto_usb2can<br/>STM32G431]
    D -->|CAN2.0| E[CAN 总线网络]

Sources: main.c prj.conf

快速开始

本节提供两条并行的最短路径:如果你使用 Windows,请直接阅读「Windows 上位机工具」小节;如果你使用 Linux,请跳至「Linux SocketCAN 接入」小节。两条路径均不需要手动编译固件。

固件获取

出厂设备已预烧录固件。如需更新或恢复,可前往 GitHub Releases 页面下载预编译的 roboto_usb2can_vX.X.X_YYYYMMDD.bin 文件,再通过 STM32CubeProgrammer、J-Link、OpenOCD 或 Probe-rs 等工具烧录。对大多数用户而言,出厂固件已满足日常调试需求。

Sources: readme_cn.md

LED 状态速查

设备板载三颗 LED,用于直观展示系统运行状态。首次上电时,请根据下表核对指示灯行为,以确认硬件工作正常。

LED 颜色 状态 闪烁模式 含义
蓝灯 就绪 0.5 秒亮 / 0.5 秒灭 USB 连接正常,设备就绪
蓝灯 错误 0.1 秒亮 / 0.1 秒灭 USB 通信错误
黄灯 关闭 0.05 秒亮 / 3.95 秒灭 CAN 通道未开启或总线关闭
黄灯 活跃 0.5 秒亮 / 0.5 秒灭 CAN 通道已启动,正常工作中
黄灯 警告 0.2 秒亮 / 1.8 秒灭 CAN 总线警告状态
黄灯 错误 0.1 秒亮 / 0.1 秒灭 CAN 总线错误或错误洪水
绿灯 空闲 常灭 总线无数据
绿灯 收发 短闪(约 100 毫秒) 检测到 CAN 帧接收或发送

上电后,若蓝灯以中速闪烁,说明 USB 枚举成功;此时若尚未启动 CAN 通道,黄灯应处于极慢闪烁状态。绿灯仅在总线上有真实数据流动时才会闪动。

Sources: readme_cn.md roboto_usb2can.h

Windows 上位机工具

Windows 系统无需安装额外驱动,插入设备后自动识别为 WinUSB 设备。我们提供了基于 Python + Tkinter 的跨平台上位机工具,支持同时管理多个适配器,适合通过 USB Hub 扩展多路 CAN 的场景。

环境准备与启动

确保已安装 Python 3.8 或更高版本,并安装 pyusb 依赖:

pip install pyusb

将设备通过 Type-C 线缆连接电脑,随后进入 scripts 目录运行工具:

cd roboto_usb2can/scripts
python roboto_usb2can_tool.py

在 Windows 环境下,需确保同目录下存在 libusb-1.0.dll,或该动态库已加入系统 PATH。

Sources: readme_cn.md requirements.txt

界面功能与操作流程

工具界面采用三栏式布局:顶部为连接与总线控制工具栏,中部为报文收发区与实时日志,底部为已连接设备列表。典型使用流程如下图所示:

flowchart TD
    A[插入设备] --> B[点击 Connect All]
    B --> C{是否识别到设备?}
    C -->|否| D[检查 USB 线缆与驱动]
    C -->|是| E[选择波特率]
    E --> F[点击 Start CAN]
    F --> G[输入 ID 与 Data]
    G --> H[点击 Send 或启用 Periodic]
    H --> I[查看 Traffic Log 收发信息]

核心功能说明如下:

Sources: roboto_usb2can_tool.py roboto_usb2can_tool.py

打包为独立可执行文件(可选)

若目标电脑未安装 Python,可使用 PyInstaller 将工具打包为单文件 EXE:

pip install pyinstaller
cd scripts
pyinstaller --noconfirm --onefile --windowed --clean --icon="icon.ico" --add-data "icon.ico;." roboto_usb2can_tool.py

生成的可执行文件位于 scripts/dist/roboto_usb2can.exe,可直接拷贝运行。

Sources: readme_cn.md

Linux SocketCAN 接入

Linux 内核对 gs_usb 驱动的原生支持使适配器在插入后即可自动生成 can0 接口,无需额外安装内核模块。

设备识别与接口启动

插入设备后,通过以下命令确认系统已正确识别:

dmesg | grep gs_usb
# 期望输出包含: Configuring for 1 channels

随后使用 ip 命令设置波特率并启动接口。以下示例配置为 1 Mbps:

sudo ip link set can0 up type can bitrate 1000000

启动成功后,ip link show can0 应显示接口状态为 UP。若需关闭接口,执行 sudo ip link set can0 down

Sources: readme_cn.md

基础收发测试(can-utils)

安装 can-utils 工具包后,即可在命令行完成收发验证:

# 终端 A:监听总线
candump can0

# 终端 B:发送测试帧
cansend can0 123#DEADBEEF

其中 123 为 CAN ID(十六进制),DEADBEEF 为 8 字节数据负载。若配置正确,终端 A 将实时打印接收到的帧信息。

Sources: readme_cn.md

自动化压力测试

scripts 目录下提供了 test_roboto_usb2can.sh 脚本,可快速验证多设备并发场景下的稳定性。该脚本会自动配置接口、启动 cangen 流量发生器,并以仪表盘形式实时展示各接口的收发速率、错误计数与总线状态。

使用前请确保已安装 can-utilsiproute2,然后执行:

chmod +x scripts/test_roboto_usb2can.sh
sudo ./scripts/test_roboto_usb2can.sh

脚本默认以 0.5 毫秒间隔发送随机 ID 的标准 CAN 帧,并启用 100 毫秒自动 Bus-Off 恢复机制,适合检验硬件在高负载下的表现。按 Ctrl+C 即可停止测试并清理后台进程。

Sources: test_roboto_usb2can.sh

udev 规则配置

为避免每次操作 SocketCAN 或运行上位机工具时都使用 sudo,建议安装项目提供的 udev 规则。该规则赋予 plugdev 用户组对设备的读写权限,并支持创建友好的 /dev/roboto_usb2can* 符号链接。

在工作区根目录执行以下命令完成安装:

sudo cp roboto_usb2can/scripts/99-roboto-usb2can.rules /etc/udev/rules.d/
sudo chmod 644 /etc/udev/rules.d/99-roboto-usb2can.rules
sudo udevadm control --reload-rules
sudo udevadm trigger

随后将当前用户加入 plugdevdialout 组:

sudo usermod -a -G plugdev,dialout $USER
# 重新登录后生效

验证规则是否生效的方法:

lsusb | grep 1d50:606f
ls -l /dev/roboto_usb2can*
ip link show type can

Sources: readme_cn.md 99-roboto-usb2can.rules

固件编译与烧录

如果你需要修改固件功能、调整 CAN 参数或进行二次开发,可参考以下步骤基于 Zephyr RTOS 重新编译。

编译环境准备

本项目依赖 Zephyr SDK 与 west 工具链。首先确保已按 Zephyr 官方指南完成基础环境搭建,随后在 Zephyr 工作区的 submanifests 目录中添加 CANnectivity 模块声明,并执行 west update 同步依赖。最后将本仓库克隆至 zephyr/samples/roboto_usb2can 目录。

Sources: readme_cn.md west.yml

编译与烧录命令

进入项目目录后,使用以下命令编译:

cd roboto_usb2can
west build -b roboto_usb2can

编译成功后,根据手头调试器选择对应烧录方式:

调试器/工具 烧录命令
STLINK-V3MINIE (推荐) west flash --runner stm32cubeprogrammer
Probe-rs west flash --runner probe-rs
J-Link west flash --runner jlink
PyOCD west flash --runner pyocd
OpenOCD west flash --runner openocd

构建系统在 Release 模式下会自动生成带版本号的二进制文件,位于 build/zephyr/roboto_usb2can_vX.X.X_YYYYMMDD.bin,可直接用于量产烧录。

Sources: readme_cn.md CMakeLists.txt

常见问题排查

下表整理了初学者最常遇到的三种场景及其排查思路:

现象 可能原因 解决方案
Windows 设备管理器出现黄色感叹号 USB 线缆仅支持充电,或驱动未正确绑定 更换支持数据传输的 Type-C 线缆;必要时使用 Zadig 手动指定 WinUSB 驱动
黄灯持续快速闪烁 CAN 总线错误(终端电阻缺失、线序接反、波特率不匹配) 确认总线两端各接 120Ω 终端电阻;检查 CAN_H/CAN_L 是否接反;核对所有节点波特率一致
高波特率下出现丢包 USB 线缆过长或质量差,导致高速传输不稳定 改用更短、屏蔽性能更好的 USB 线缆;降低总线负载或发送频率

Sources: readme_cn.md main.c

下一步

完成本指南后,你已具备 roboto_usb2can 适配器的基础使用能力。若希望深入理解其内部实现,建议按以下顺序阅读后续文档: