Welcome to Firefly
中文
Firefly文档中心
最近更新: 2026-11-13 16:38:16

CAN 使用

CAN 简介

CAN(Controller Area Network) 总线,即控制器局域网总线,是一种有效支持分布式控制或实时控制的串行通信网络。CAN 总线是一种在汽车上广泛采用的总线协议,被设计作为汽车环境中的微控制器通讯。 如果想了解更多的内容可以参考 CAN 应用报告。

注意

RK3568 的 CAN FD 位填充功能与 CAN FD 标准协议不一样,不推荐使用 CAN FD。

硬件连接

CAN 模块之间接线:CAN_H 接 CAN_H,CAN_L 接 CAN_L。

DTS 节点配置

  • 公共配置 arch/arm64/boot/dts/rockchip/rk3568-firefly-port.dtsi

    &can1 {
            status = "disabled";
            compatible = "rockchip,can-1.0";
            assigned-clocks = <&cru CLK_CAN1>;
            assigned-clock-rates = <150000000>;
            pinctrl-names = "default";
            pinctrl-0 = <&can1m1_pins>;
    };
    
    &can2 {
            status = "disabled";
            compatible = "rockchip,can-1.0";
            assigned-clocks = <&cru CLK_CAN2>;
            assigned-clock-rates = <150000000>;
            pinctrl-names = "default";
            pinctrl-0 = <&can2m0_pins>;
    };
  • 板级配置 arch/arm64/boot/dts/rockchip/rk3568-firefly-itx-3568q.dtsi

    &can1 {
        status = "okay";
    };
    
    &can2 {
        status = "disabled";
    };

    ITX-3568Q 仅引出 can1,因此仅使能 can1

通信测试

CAN 通信测试

使用 candump 和 cansend 工具进行收发报文测试即可,将工具 push 到 /system/bin/ 目录下执行。工具可以在 官方 或者 github 下载。

#在收发端关闭can0设备
ip link set can0 down
#在收发端设置比特率为250Kbps
ip link set can0 type can bitrate 250000
#在收发端打开can0设备
ip link set can0 up
#在接收端执行candump,阻塞等待报文
candump can0
#在发送端执行cansend,发送报文
cansend can0 123#1122334455667788

更多指令

1、 ip link set canX down 		//关闭can设备;
2、 ip link set canX up   		//开启can设备;
3、 ip -details link show canX 		//显示can设备详细信息;
4、 candump canX  			//接收can总线发来数据;
5、 ifconfig canX down 			//关闭can设备,以便配置;
6、 ip link set canX up type can bitrate 250000 //设置can波特率
7、 conconfig canX bitrate + 波特率;
8、 canconfig canX start 		//启动can设备;
9、 canconfig canX ctrlmode loopback on //回环测试;
10、canconfig canX restart 		// 重启can设备;
11、canconfig canX stop 		//停止can设备;
12、canecho canX 			//查看can设备总线状态;
13、cansend canX --identifier=ID+数据 	//发送数据;
14、candump canX --filter=ID:mask	//使用滤波器接收ID匹配的数据

FAQS

总结调试过程中遇到的几个问题及解决方法:

报文发送后很久才接收到,或者接收不到。

检查总线 CAN_H 和 CAN_L,杜邦线是否松动或者接反。

CAN时钟频率配置

CAN

如果 CAN 的比特率 1M,建议修改 CAN 时钟到 300M,信号更稳定。低于 1M 比特率的,时钟设置 200M 就可以。

CAN时钟频率修改

CAN 时钟频率修改方法参考如下:

diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3568-firefly-port.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3568-firefly-port.dtsi
index 274ebb1..5f2ca7b 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3568-firefly-port.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3568-firefly-port.dtsi
@@ -673,7 +673,7 @@
        status = "disabled";
        compatible = "rockchip,can-1.0";
        assigned-clocks = <&cru CLK_CAN1>;
-       assigned-clock-rates = <150000000>;
+       assigned-clock-rates = <100000000>;
        pinctrl-names = "default";
        pinctrl-0 = <&can1m1_pins>;
 };
@@ -682,7 +682,7 @@
        status = "disabled";
        compatible = "rockchip,can-1.0";
        assigned-clocks = <&cru CLK_CAN2>;
-       assigned-clock-rates = <150000000>;
+       assigned-clock-rates = <100000000>;
        pinctrl-names = "default";
        pinctrl-0 = <&can2m0_pins>;
 };

注意

  • 在某些时钟频率下,CAN 的 bitrate 无法获得准确的速率,可以自行调整 assigned-clock-rates 去解决。

  • 查看是否得到所需的 bitrate:

    ip -d link show can1

本页目录