在工业自动化、车载电子和机器人控制领域,CAN总线如同汽车的神经系统,负责各部件间的高效通信。RK3588作为一款高性能处理器,其内置的CAN控制器为开发者提供了强大的工业级通信能力。本文将带您从零开始,在Debian11系统上为RK3588开发板配置CAN总线功能,涵盖内核编译、设备树修改到实际测试的全流程,并分享调试过程中的实战技巧。
确保开发板已安装基于Linux 5.10内核的Debian11系统。通过SSH连接开发板后,首先更新软件源:
bash复制sudo apt update && sudo apt upgrade -y
安装必要的开发工具:
bash复制sudo apt install build-essential libncurses-dev flex bison libssl-dev
进入内核源码目录,执行菜单配置:
bash复制cd /path/to/kernel
make ARCH=arm64 rockchip_linux_defconfig
make ARCH=arm64 menuconfig
关键配置项路径及设置:
code复制Networking support →
CAN bus subsystem support →
CAN Device Drivers →
<*> Platform CAN drivers with Netlink support
<*> Rockchip CAN support
<*> Rockchip CAN FD support
保存配置后生成新的defconfig:
bash复制make ARCH=arm64 savedefconfig
cp defconfig arch/arm64/configs/rockchip_linux_defconfig
编译内核模块:
bash复制make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- modules -j$(nproc)
将生成的驱动文件rockchip_canfd.ko复制到系统模块目录:
bash复制sudo cp drivers/net/can/rockchip/rockchip_canfd.ko /lib/modules/$(uname -r)/kernel/drivers/net/can/rockchip/
sudo depmod -a
在rk3588s.dtsi中,CAN控制器的时钟配置直接影响通信稳定性。典型配置如下:
dts复制can1: can@fea60000 {
compatible = "rockchip,can-2.0";
reg = <0x0 0xfea60000 0x0 0x1000>;
interrupts = <GIC_SPI 342 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru CLK_CAN1>, <&cru PCLK_CAN1>;
clock-names = "baudclk", "apb_pclk";
assigned-clock-rates = <200000000>; // 200MHz时钟
pinctrl-names = "default";
pinctrl-0 = <&can1m1_pins>; // 根据原理图选择正确的引脚组
status = "okay";
};
时钟频率选择:
3Mbps:推荐200MHz时钟
引脚冲突检查:
使用sudo cat /proc/interrupts确认CAN中断是否正常注册,通过dmesg | grep can查看驱动加载日志。
加载驱动并配置CAN接口:
bash复制sudo modprobe rockchip_canfd
sudo ip link set can0 type can bitrate 500000
sudo ip link set can0 up
验证接口状态:
bash复制ip -details -statistics link show can0
帧过滤设置:
bash复制sudo ip link set can0 type can bitrate 500000 \
berr-reporting on loopback off \
restart-ms 100
压力测试脚本:
bash复制#!/bin/bash
while true; do
cansend can0 123#$(hexdump -n 4 -e '4/4 "%08X"' /dev/urandom)
sleep 0.01
done
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 无法发送数据 | 终端电阻未接 | 在总线两端接入120Ω电阻 |
| 接收乱码 | 波特率不匹配 | 确认两端设备使用相同波特率 |
| 接口无法UP | 引脚配置错误 | 检查设备树pinctrl设置 |
提示:使用
candump -l can0可以将CAN数据记录到文件,便于后期分析。
通过调整内核调度参数提升实时性:
bash复制sudo sysctl -w kernel.sched_rt_runtime_us=950000
对于需要更高带宽的场景,启用CAN FD模式:
bash复制sudo ip link set can0 type can \
bitrate 500000 dbitrate 2000000 \
fd on
搭建测试环境时,建议使用以下拓扑结构:
通过cansend和candump工具组合,可以模拟复杂的多节点通信场景。