跳到主要内容

CAN 开发指南

本文档基于瑞芯微官方文档 Rockchip_Developer_Guide_Can_CN.pdf(V1.2.0, 2024-03-26)整理,介绍 Rockchip 系列芯片 CAN 总线的驱动配置、使用方法和常见问题排查。

适用范围
芯片平台内核版本
RV1126 / RV1109Linux 4.4 & 4.19
RK3568Linux 4.19 & 5.10
RK3588Linux 5.10
RK3562Linux 5.10

读者对象:技术支持工程师、软件开发工程师


CAN 驱动

驱动文件

芯片平台驱动文件
RV1126 / RV1109drivers/net/can/rockchip/rockchip_can.c
RK3568 / RK3588drivers/net/can/rockchip/rockchip_canfd.c
RK3562drivers/net/can/rockchip/rk3562_canfd.c

DTS 节点配置

主要参数说明

参数说明
interrupts中断配置,转换完成后产生中断信号
assigned-clocks / assigned-clock-ratesCAN 时钟配置
clocks / clock-names时钟源:baudclk(波特率时钟)和 apb_pclk(总线时钟)
compatible兼容字符串,不同芯片不同
pinctrl引脚复用配置

时钟频率建议

  • 比特率 1M 建议 CAN 时钟设为 300M,信号更稳定
  • 低于 1M 比特率,时钟设置 200M 即可
  • CAN 时钟最好设置成比特率的偶数倍,便于分出精准的比特率频率

compatible 对应关系

芯片平台compatible 值
RV1126 / RV1109"rockchip,can-1.0"
RK3568"rockchip,rk3568-can-2.0"
RK3588"rockchip,can-2.0"
RK3562"rockchip,rk3562-can"

DTS 配置示例

&can {
pinctrl-names = "default";
pinctrl-0 = <&canm0_pins>;
status = "okay";
};

pinctrl 配置 can_hcan_l 的 iomux 为 CAN 功能。

内核配置

CAN_ROCKCHIP(CAN 控制器)

Symbol: CAN_ROCKCHIP [=y]
Type : tristate
Prompt: Rockchip CAN controller
Location:
-> Networking support (NET [=y])
-> CAN bus subsystem support (CAN [=y])
-> CAN Device Drivers
-> Platform CAN drivers with Netlink support (CAN_DEV [=y])

CANFD_ROCKCHIP(CAN FD 控制器)

Symbol: CANFD_ROCKCHIP [=y]
Type : tristate
Prompt: Rockchip CANFD controller
Location:
-> Networking support (NET [=y])
-> CAN bus subsystem support (CAN [=y])
-> CAN Device Drivers
-> Platform CAN drivers with Netlink support (CAN_DEV [=y])

RK3562 专用配置

CONFIG_CAN_RK3562=y

CAN 通信测试工具

canutils 是常用的 CAN 通信测试工具包,内含 5 个独立程序:

工具功能
canconfig配置 CAN 总线接口参数(波特率、模式等)
candump从 CAN 总线接收数据并以十六进制打印,可输出到文件
canecho把接收到的所有数据重新发送回总线
cansend往指定接口发送指定数据
cansequence自动重复递增数字发送/接收校验

ip 命令(iproute2 版本)用于配置 CAN 波特率和功能。

注意

busybox 里的 ip 工具是阉割版本,不支持 CAN 操作。请使用完整的 iproute2 版本。

Buildroot 开启配置

BR2_PACKAGE_CAN_UTILS=y
BR2_PACKAGE_IPROUTE2=y

CAN 常用命令

查询网络设备

ifconfig -a

启动/关闭 CAN

# 关闭 CAN
ip link set can0 down

# 设置比特率 500KHz
ip link set can0 type can bitrate 500000

# 打印 can0 详细信息
ip -details -statistics link show can0

# 启动 CAN
ip link set can0 up

CAN 发送

# 标准帧 + 数据帧,ID: 123,数据: DEADBEEF
cansend can0 123#DEADBEEF

# 标准帧 + 远程帧,ID: 123
cansend can0 123#R

# 扩展帧 + 数据帧,ID: 00000123,数据: 12345678
cansend can0 00000123#12345678

# 扩展帧 + 远程帧,ID: 00000123
cansend can0 00000123#R

CAN 接收

# 开启打印,等待接收
candump can0

CAN 常见问题排查

无法收发

先使用回环模式测试,确认控制器本身是否正常:

# 启动 CAN 后,通过 io 命令开启回环自测
# 基地址根据实际 DTS 中 CAN 配置
io -4 0xfe580000 0x8415

回环模式下,cansendcandump 可以接收,说明控制器工作正常。此时只需要检查:

  • IOMUX 配置是否正确
  • 硬件连接是否正确
  • 终端 120 欧姆电阻有没有接入
  • CAN 转换芯片是否正常

概率性不能收发

1. 确认比特率是否精准

ip -details -statistics link show can0

如果比特率有偏差会造成收发异常,需要根据比特率调整输入时钟,以分到精准的比特率。

2. 调整采样点

上面的命令会打印当前配置的采样点。尽量保证同一网络中采样点一致,可以保障收发稳定性。


CAN 比特率和采样点计算

CAN 架构根据输入频率和比特率自动计算参数。采样点规则按照 CiA 标准协议

/* Use CiA recommended sample points */
if (bt->sample_point) {
sample_point_nominal = bt->sample_point;
} else {
if (bt->bitrate > 800000)
sample_point_nominal = 750; // 75.0%
else if (bt->bitrate > 500000)
sample_point_nominal = 800; // 80.0%
else
sample_point_nominal = 875; // 87.5%
}

比特率计算公式

BitRate = clk_can / (2 * (brp + 1)) / ((tseg2 + 1) + (tseg1 + 1) + 1)

采样点计算公式

Sample = (1 + (tseg1 + 1)) / (1 + (tseg1 + 1) + (tseg2 + 1))

其中 brptseg1tseg2 见 CAN TRM 中的 BITTIMING 寄存器。


参考资料

  • 原始文档:Rockchip_Developer_Guide_Can_CN.pdf V1.2.0
  • 瑞芯微官网:www.rock-chips.com