尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

从零到一:在Firefly ITX-3588J上搞定CAN与CAN-FD驱动的完整踩坑实录

从零到一:在Firefly ITX-3588J上搞定CAN与CAN-FD驱动的完整踩坑实录 从零到一在Firefly ITX-3588J上搞定CAN与CAN-FD驱动的完整踩坑实录第一次接触CAN总线开发时面对Firefly ITX-3588J开发板和一堆专业术语我仿佛置身于陌生的技术丛林。作为嵌入式开发的新手我花了整整三周时间才从硬件接线到成功实现CAN-FD通信。本文将完整记录这段从困惑到豁然开朗的实践历程特别是解决数据比特率必须大于等于仲裁比特率这个关键问题的全过程。1. 硬件准备与环境搭建在开始软件配置前正确的硬件连接是基础。ITX-3588J开发板提供了多个CAN接口我们需要先确认硬件连接无误。所需材料清单Firefly ITX-3588J开发板CAN总线分析仪或另一块CAN设备120Ω终端电阻双绞线CAN_H和CAN_L硬件连接时最常见的错误是忽略了终端电阻。根据我的实测当通信距离超过1米时不加终端电阻会导致波形畸变通信失败率显著提高。正确的接线方式如下开发板CAN_H --- 分析仪CAN_H 开发板CAN_L --- 分析仪CAN_L 开发板CAN_GND --- 分析仪GND可选但建议连接在开发板和分析仪两端各接一个120Ω电阻如果只有两个节点也可以只在分析仪端接一个电阻。我曾尝试不接终端电阻结果在3米距离上通信出现大量错误帧。2. 内核配置与驱动加载RK3588的Linux内核已经包含了CAN和CAN-FD驱动但需要正确配置才能使用。通过SSH登录开发板后首先检查内核配置zcat /proc/config.gz | grep CAN确认以下关键配置项为y或mCONFIG_CANy CONFIG_CAN_RAWy CONFIG_CAN_BCMy CONFIG_CAN_GWy CONFIG_CAN_ROCKCHIPy CONFIG_CANFD_ROCKCHIPy如果缺少任何配置需要重新编译内核。编译时特别注意make menuconfig路径Networking support → CAN bus subsystem support → CAN Device Drivers在我的实践中发现官方提供的固件有时会缺少CAN-FD支持这时需要自行编译内核模块。编译完成后使用insmod加载驱动insmod rockchip_canfd.ko加载成功后/sys/class/net/目录下会出现can0设备节点。3. 设备树(DTS)配置详解RK3588的CAN控制器在设备树中的配置非常关键。以下是ITX-3588J开发板的典型配置can1 { status okay; assigned-clocks cru CLK_CAN1; assigned-clock-rates 200000000; pinctrl-names default; pinctrl-0 can1m1_pins; };关键参数解析参数说明推荐值assigned-clock-ratesCAN控制器时钟频率100MHz(≤3Mbps)200MHz(3Mbps)pinctrl-0引脚复用配置必须匹配硬件连接tx-fifo-depth发送FIFO深度默认1即可rx-fifo-depth接收FIFO深度建议6-8我曾遇到一个棘手问题CAN通信时断时续。经过排查发现是时钟配置不当导致。当波特率超过3Mbps时必须将时钟设置为200MHz否则会出现位定时误差累积。4. CAN-FD配置的深坑与解决方案CAN-FD的配置比传统CAN复杂得多最大的坑点在于比特率设置。以下是正确配置CAN-FD的命令# 先关闭接口 ip link set can0 down # 设置仲裁段500kbps数据段1Mbps ip link set can0 type can bitrate 500000 dbitrate 1000000 fd on # 启用接口 ip link set can0 up常见错误及解决方法错误提示ifconfig: SIOCSIFFLAGS: Invalid argument原因数据比特率(dbitrate)未设置或小于仲裁比特率解决确保dbitrate存在且≥bitrate错误提示can0: bit-timing not yet defined原因未设置bitrate就直接启用接口解决按正确顺序执行配置命令通信不稳定原因终端电阻未接或时钟配置不当解决检查硬件连接调整时钟频率通过分析内核源码rockchip_canfd.c我找到了比特率校验的代码逻辑if ((priv-ctrlmode CAN_CTRLMODE_FD) (!priv-data_bittiming.bitrate || priv-data_bittiming.bitrate priv-bittiming.bitrate)) { netdev_err(dev, incorrect/missing data bit-timing); return -EINVAL; }这段代码明确要求在CAN-FD模式下数据比特率必须存在且不小于仲裁比特率。5. 实战测试与性能优化配置完成后使用can-utils工具包进行测试# 终端1接收数据 candump can0 # 终端2发送标准帧 cansend can0 123#1122334455667788 # 发送扩展帧 cansend can0 00000123##1DEADBEEF性能优化技巧增大接收缓冲区echo 1000 /proc/sys/net/core/rmem_default echo 1000 /proc/sys/net/core/rmem_max实时优先级提升对低延迟要求高的场景chrt -f 99 candump can0错误帧监控ip -details -statistics link show can0在我的压力测试中CAN-FD在1Mbps仲裁段4Mbps数据段配置下64字节数据帧的吞吐量可达传统CAN的5倍以上。但要注意随着波特率提高信号完整性变得至关重要此时使用优质双绞线确保终端电阻匹配尽量缩短通信距离避免与高频信号线平行走线6. 高级应用与调试技巧当基本通信稳定后可以尝试更高级的应用场景多路CAN-FD桥接# 创建CAN网关假设有can0和can1两个接口 cangw -A -s can0 -d can1 -e cangw -A -s can1 -d can0 -eCAN帧过滤只接收ID为0x123-0x125的帧candump can0,123:7FF总线负载监控ip -details -statistics link show can0输出示例5: can0: NOARP,UP,LOWER_UP,ECHO mtu 72 qdisc pfifo_fast state UP mode DEFAULT group default qlen 10 link/can promiscuity 0 can state ERROR-ACTIVE (berr-counter tx 0 rx 0) restart-ms 0 bitrate 500000 sample-point 0.875 tq 25 prop-seg 34 phase-seg1 35 phase-seg2 20 sjw 1 rockchip_can: tseg1 2..256 tseg2 1..128 sjw 1..128 brp 1..1024 brp-inc 1 clock 200000000 re-started bus-errors arbit-lost error-warn error-pass bus-off 0 0 0 0 0 0 RX: bytes packets errors dropped overrun mcast 15820 283 0 0 0 0 TX: bytes packets errors dropped carrier collsns 11200 200 0 0 0 0关键指标解读bus-errors总线错误计数理想值为0arbit-lost仲裁丢失次数频繁出现需检查总线竞争error-pass节点进入被动错误状态次数7. 常见问题快速排查指南根据我的踩坑经验整理出以下快速排查表现象可能原因解决方案无法发送数据接口未启用ip link set can0 up接收不到数据波特率不匹配两端设备统一比特率大量错误帧终端电阻缺失补接120Ω电阻通信距离短线材质量差更换优质双绞线CAN-FD无法启用数据比特率设置错误确保dbitrate≥bitrate随机通信中断电磁干扰检查接地增加屏蔽当遇到复杂问题时可以启用内核调试echo 8 /proc/sys/kernel/printk dmesg -w这会实时打印内核日志帮助定位底层驱动问题。
返回列表