当你在RK3588平台上需要扩展CAN总线接口时,USB转CAN模块可能是最便捷的选择。但实际部署过程中,从驱动编译到稳定运行,每一步都可能遇到意想不到的障碍。本文将基于飞凌OK3588-C开发板(Ubuntu 20.04系统,内核5.10.66),详细记录CH341和PCAN两种USB转CAN模块的完整部署流程,包括驱动移植、内核配置、固件烧写以及解决多设备枚举顺序问题的实用技巧。
在开始技术实现前,选择合适的硬件模块和搭建开发环境至关重要。经过实际测试,CH341转CAN模块和PCAN模块在RK3588平台上表现稳定,而XCAN和SLCAN模块由于驱动兼容性问题暂不可用。
硬件准备清单:
软件环境要求:
表:测试通过的USB转CAN模块参数对比
| 模块类型 | 支持协议 | 工作温度 | 特点 | 适用场景 |
|---|---|---|---|---|
| CH341转CAN | CAN 2.0A/B | -20°C~75°C | 成本低,易获取 | 中低速CAN通信 |
| PCAN | CAN 2.0B/CAN FD | -40°C~85°C | 工业级稳定性 | 高可靠性场景 |
提示:购买CH341转CAN模块时需注意,市面上有些型号使用的是CH340芯片,工作温度范围较窄,在极端环境下可能出现异常。
CH341作为常见的USB转串口芯片,其转CAN版本在Linux下的驱动支持需要特别注意。以下是完整的移植步骤和问题解决方案。
首先需要获取CH341的Linux驱动源码。通常模块厂商会提供,也可以从芯片厂商官网下载:
bash复制wget http://www.wch.cn/downloads/CH341SER_LINUX_ZIP.html
unzip CH341SER_LINUX.ZIP
cd CH341SER_LINUX
直接编译可能会遇到头文件缺失问题,这是因为开发板上缺少内核头文件。解决方法有两种:
在开发板上安装内核头文件
bash复制sudo apt install linux-headers-$(uname -r)
使用飞凌配套虚拟机交叉编译(推荐)
bash复制make modules_prepare
cd /path/to/ch341/driver
make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
编译成功后,会生成ch341.ko文件。将其复制到开发板并安装:
bash复制insmod ch341.ko
lsmod | grep ch341 # 验证驱动是否加载
ls /dev/ttyCH341* # 检查设备节点
如果一切正常,应该能看到类似/dev/ttyCH341USB0的设备节点。此时可以使用串口工具测试:
bash复制sudo apt install cutecom
cutecom # 打开串口工具选择对应设备
为避免每次重启后手动加载驱动,需要配置系统自动加载:
将驱动复制到标准模块目录:
bash复制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
创建模块加载配置文件:
bash复制echo "ch341" | sudo tee /etc/modules-load.d/ch341.conf
重启后验证:
bash复制lsmod | grep ch341
当使用多个相同的CH341转CAN模块时,系统可能会随机分配设备节点名(ttyCH341USB0、ttyCH341USB1),这在实际应用中会造成混乱。解决方案是使用udev规则固定设备映射。
首先需要确定每个物理设备的唯一标识:
bash复制udevadm info -a -p /sys/class/tty/ttyCH341USB0
重点关注以下属性:
在/etc/udev/rules.d/目录下创建规则文件:
bash复制sudo vim /etc/udev/rules.d/99-ch341-rk3588.rules
示例规则内容:
code复制# 固定USB端口1-4.1连接的设备为ttyCH341UART_CAN1
KERNELS=="1-4.1", SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="ttyCH341UART_CAN1", MODE="0666"
# 固定USB端口1-4.2连接的设备为ttyCH341UART_CAN2
KERNELS=="1-4.2", SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="ttyCH341UART_CAN2", MODE="0666"
应用新规则:
bash复制sudo udevadm control --reload-rules
sudo udevadm trigger --subsystem-match=tty
验证结果:
bash复制ls -l /dev/ttyCH341UART*
PCAN作为工业级CAN解决方案,其驱动需要重新编译内核模块。以下是详细步骤:
进入飞凌提供的虚拟机内核源码目录:
bash复制cd /home/forlinx/3588/OK3588_Linux_fs/kernel
启动内核配置界面:
bash复制make menuconfig
按以下路径启用PCAN驱动:
code复制Networking support →
CAN bus subsystem support →
CAN Device Drivers →
CAN USB interfaces →
[M] PEAK PCAN-USB/USB Pro interfaces for CAN 2.0b/CAN-FD
保存配置为自定义配置文件(如ok3588_can_defconfig)
修改BoardConfig.mk指定自定义配置:
bash复制vim device/forlinx/.BoardConfig.mk
修改为:
makefile复制export RK_KERNEL_DEFCONFIG=ok3588_can_defconfig
将配置文件复制到正确位置:
bash复制cp ok3588_can_defconfig arch/arm64/configs/
cp ok3588_can_defconfig .config
开始编译内核:
bash复制sudo ./build kernel
编译完成后,生成的文件位于:
使用瑞芯微烧录工具将boot.img写入开发板
手动加载PCAN驱动:
bash复制insmod peak_usb.ko
modprobe peak_usb
验证驱动加载:
bash复制lsmod | grep peak_usb
ip link show | grep can
配置开机自动加载:
bash复制echo "peak_usb" | sudo tee /etc/modules-load.d/peak_usb.conf
驱动就绪后,还需要正确配置CAN接口参数才能正常通信。
设置CAN接口比特率为500kbps:
bash复制sudo ip link set can0 up type can bitrate 500000
对于CAN FD接口,需要额外配置数据段比特率:
bash复制sudo ip link set can0 up type can bitrate 500000 dbitrate 2000000 fd on
查看CAN接口状态:
bash复制ip -details -statistics link show can0
实时监控CAN总线数据:
bash复制candump can0
发送测试帧:
bash复制cansend can0 123#1122334455667788
使用can-utils工具进行压力测试:
bash复制cangen can0 -g 10 -I 100 -L 8 -D 1122334455667788
监控系统负载:
bash复制dmesg | grep can
cat /proc/interrupts | grep can
在RK3588平台上,USB转CAN模块的实际性能表现如下:
表:实测性能数据
| 模块类型 | 最大稳定速率 | 典型延迟 | CPU占用率 |
|---|---|---|---|
| CH341转CAN | 500kbps | 2-5ms | 3-5% |
| PCAN | 1Mbps(CAN), 5Mbps(CAN FD) | 1-3ms | 2-4% |
确保系统长期稳定运行需要考虑以下因素:
创建看门狗脚本监控CAN接口:
bash复制#!/bin/bash
if ! ip link show can0 &> /dev/null; then
echo "CAN interface down, restarting..."
sudo ip link set can0 up type can bitrate 500000
fi
添加到cron定时任务:
bash复制(crontab -l ; echo "*/5 * * * * /path/to/can_watchdog.sh") | crontab -
RK3588在高负载下可能发热,建议:
bash复制cat /sys/class/thermal/thermal_zone*/temp
经过实际项目验证,这套方案在工业自动化设备中已连续稳定运行超过180天,处理了超过2000万条CAN消息无丢失。最难解决的驱动加载顺序问题通过udev规则得到了完美解决,而内核级的PCAN驱动则表现出了优异的稳定性。