RK3588 USB转CAN扩展实战:从驱动编译到设备绑定的完整指南

张开发
2026/4/13 21:36:31 15 分钟阅读

分享文章

RK3588 USB转CAN扩展实战:从驱动编译到设备绑定的完整指南
1. RK3588 USB转CAN扩展需求与选型指南在工业控制、汽车电子等领域CAN总线因其高可靠性和实时性被广泛应用。RK3588作为一款高性能嵌入式处理器原生支持2路CAN总线接口但在实际项目中比如自动化生产线或多节点设备控制我们经常需要更多CAN通道。这时候USB转CAN模块就成了经济高效的扩展方案。我最近在飞凌OK3588-C开发板上完成了4路CAN总线的扩展实践这里分享下选型经验。经过实测PCAN和CH341转CAN模块表现稳定而XCAN和SLCAN由于驱动兼容性问题未能成功。具体来看PCAN工业级模块支持CAN 2.0B和CAN FD实测在-40℃~85℃环境下稳定运行适合严苛工业场景CH341转CAN基于常见USB转串口芯片的方案成本低但需要额外电平转换电路实测在-7℃以下可能出现异常XCAN需要厂家提供特定内核版本的驱动5.10.66内核兼容性差SLCAN开源方案但文档匮乏调试成本过高选型时要特别注意三点首先是工作温度范围工业现场常有低温需求其次是驱动兼容性Linux内核版本差异可能导致驱动失效最后是协议支持传统CAN 2.0A/B与CAN FD的硬件不兼容。2. CH341转CAN驱动移植全流程2.1 驱动编译环境搭建CH341是常见的USB转串口芯片其CAN扩展模块需要先配置串口驱动。在飞凌OK3588-CUbuntu 20.04内核5.10.66上直接使用预编译驱动可能会报头文件缺失错误。我的解决方案是使用飞凌提供的配套虚拟机环境包含完整内核头文件下载官方CH341驱动源码或从Linux内核drivers/usb/serial目录提取执行以下编译命令make -C /lib/modules/$(uname -r)/build M$(pwd) modules编译成功后生成ch341.ko文件通过scp传输到开发板scp ch341.ko user192.168.x.x:/home/user/drivers/2.2 驱动安装与自动加载手动测试驱动可用性insmod /path/to/ch341.ko dmesg | grep ch341 # 查看内核日志 ls /dev/ttyCH341* # 检查设备节点要实现开机自动加载需要完成以下步骤将驱动文件复制到标准目录sudo mkdir -p /lib/modules/$(uname -r)/kernel/drivers/usb/serial sudo cp ch341.ko /lib/modules/$(uname -r)/kernel/drivers/usb/serial/更新模块依赖关系sudo depmod -a创建systemd模块加载配置echo ch341 | sudo tee /etc/modules-load.d/ch341.conf重启后通过lsmod | grep ch341验证驱动是否自动加载。2.3 多设备枚举问题解决当连接多个相同型号的USB-CAN适配器时系统可能随机分配设备节点如ttyCH341USB0和ttyCH341USB1互换。这在工业控制中会导致严重问题。通过udev规则可以固定设备映射先插入设备获取其物理端口信息udevadm info -a -p /sys/class/tty/ttyCH341USB0创建udev规则文件/etc/udev/rules.d/99-ch341.rulesSUBSYSTEMtty, KERNELS3-2.1, ATTRS{idVendor}1a86, ATTRS{idProduct}7523, SYMLINKttyCH341_CAN1 SUBSYSTEMtty, KERNELS3-2.2, ATTRS{idVendor}1a86, ATTRS{idProduct}7523, SYMLINKttyCH341_CAN2重新加载规则sudo udevadm control --reload sudo udevadm trigger现在无论设备插入顺序如何/dev/ttyCH341_CAN1和/dev/ttyCH341_CAN2都会对应固定的物理端口。3. PCAN-USB驱动内核编译实战3.1 内核配置与编译PCAN-USB是工业级CAN适配器其驱动已集成到Linux内核但默认未启用。在RK3588平台需要重新编译内核进入内核源码目录飞凌提供的内核位于OK3588_Linux_fs/kernel执行菜单配置make menuconfig按以下路径启用驱动Networking support → CAN bus subsystem support → CAN Device Drivers → CAN USB interfaces → [M] PEAK PCAN-USB/USB Pro interfaces保存配置后修改BoardConfig.mk确保配置不被覆盖export RK_KERNEL_DEFCONFIGok3588_can_defconfig完整编译内核和模块./build kernel ./build.sh modules3.2 驱动部署与测试编译生成的peak_usb.ko驱动文件需要手动部署sudo cp peak_usb.ko /lib/modules/$(uname -r)/kernel/drivers/net/can/usb/peak_usb/ sudo depmod -a echo peak_usb | sudo tee /etc/modules-load.d/peak_usb.conf插入PCAN设备后可以通过以下命令测试sudo ip link set can0 up type can bitrate 500000 candump can0 # 测试数据收发如果出现NOARP状态可能是终端电阻未启用需要在PCAN模块上跳线启用120Ω终端电阻。4. 系统集成与性能优化4.1 CAN总线参数调优工业现场对CAN总线稳定性要求极高推荐以下配置sudo ip link set can0 up type can \ bitrate 500000 \ sample-point 0.875 \ sjw 4 \ restart-ms 100 \ berr-reporting on关键参数说明sample-point采样点位置建议75%-90%sjw同步跳转宽度恶劣环境可增大restart-ms总线关闭后自动恢复时间4.2 实时性保障措施在Ubuntu 20.04默认配置下CAN帧传输可能受系统调度影响。可通过以下方式优化设置CPU性能模式sudo apt install cpufrequtils echo GOVERNORperformance | sudo tee /etc/default/cpufrequtils sudo systemctl restart cpufrequtils提高CAN线程优先级sudo chrt -f 99 candump can0禁用USB自动挂起echo ACTIONadd, SUBSYSTEMusb, TESTpower/control, ATTR{power/control}on | sudo tee /etc/udev/rules.d/10-usb-power.rules4.3 系统监控与日志建立完整的监控体系有助于快速定位问题CAN错误帧统计ip -details -statistics link show can0USB设备状态监控watch -n 1 lsusb -t dmesg | tail -n 10持久化日志配置sudo mkdir /var/log/can echo */5 * * * * root /usr/bin/canlogrotate.sh | sudo tee /etc/cron.d/canlog在工业现场部署时建议增加硬件看门狗和双电源冗余设计。飞凌OK3588-C的GPIO接口可以方便地连接硬件看门狗模块通过以下命令测试echo 17 | sudo tee /sys/class/gpio/export # 假设WD连接在GPIO17 echo out | sudo tee /sys/class/gpio/gpio17/direction watch -n 1 echo 1 | sudo tee /sys/class/gpio/gpio17/value sleep 0.1 echo 0 | sudo tee /sys/class/gpio/gpio17/value

更多文章