RDK X5 裸板 CAN 通讯测试 500kbps 收发通讯报错误帧故障

1、使用了RDK X5开发版。系统版本 3.5.0,内核 6.1.83。

hobot-boot 3.1.0-20260518154347
hobot-dtb 3.0.8-20260409105754
hobot-kernel-headers 3.0.4-20260409105759
hobot-miniboot 3.0.9-20260409105755
hobot-configs 3.1.4-20260409105753
hobot-io 3.1.4-20260409105736
hobot-dnn 3.0.4-20260409110123
hobot-camera 3.1.1-20260409105913

2、can 设置为 ip link set can0 type can bitrate 500000 sample-point 0.800 sjw 2 restart-ms 100

3、测试结果如图所示,CAN能够发送和接收,但是CAN 接收和发送的时候,都报错误帧。

4、log日志也请见附件。

5、问题诉求: 请问如何设置常用波特率 CAN 250kbps 500kbps 1M kbps 和 CAN FD 500kbps 2Mkbps 等情况下的can BRP TSEG1 TSEG2 SJW 等参数,来避免错误帧。

这个板子买来就是想测试AI开发板和CAN通讯 的,两年间也是断断续续也测试了五六轮了,RDK Studio 也换了三个版本,但是卡在CAN通讯时间一长就卡死的情况,最近RDK Studio大模型出来,方便测试了很多,但是这个问题 moss前后也跑了好多天,它定位的问题是设备树等的设置问题,也不知道对不对, 还请麻烦多支持支持,解决 不同波特率下CAN 能够持续发送,谢谢!

logs.zip (26.1 KB)

先给判断:能收发但两端都报错误帧,通常出在物理层或两端位定时不一致,不是设备树。DTS 只决定 TCAN4550(SPI5 + 中断/复位 GPIO)能否被枚举成 can0;你现在能收发,说明枚举、SPI 和驱动基本通了。而“跑十几分钟卡死”是另一类问题(bus-off 反复重启或 SPI/中断吞吐),要分开看。

1. 先回读真实位定时,不要只看自己下的命令

ip -details -statistics link show can0

重点看 clock、tq / prop-seg / phase-seg1 / phase-seg2 / sjw、state,以及 bus-errors / error-warn / error-pass / bus-off / re-started。同型号板卡社区回读的 CAN 时钟是 clock 20000000(20 MHz),请以你自己的输出为准。500 kbps 下正常应为 40 个 tq(tq=50 ns),采样点 80%,与你设的 0.8 一致。

2. 关于 BRP/TSEG:ip 不能直接设这几项
你只能给 bitrate / sample-point / sjw(FD 再加 dbitrate / dsample-point / dsjw),BRP、TSEG1、TSEG2 由 m_can 驱动反算。按 20 MHz 时钟,参考值如下,用于核对回读结果:

速率 BRP prop-seg phase-seg1 phase-seg2 SJW 采样点
250k 2 15 16 8 1 80%
500k 1 15 16 8 1 80%
1M 1 6 9 4 1 80%
FD 数据段 2M 1 — (dtseg1=6) — 3 (dtseg2) dsjw 1 70%

经典 CAN 建议先统一用 80%、sjw 1,排查阶段不要带 restart-ms 100(它会让 bus-off 反复重启,日志里错误帧更多、状态被掩盖):

ip link set can0 down
ip link set can0 type can bitrate 250000 sample-point 0.800 sjw 1
ip link set can0 up

CAN FD(仲裁段 500k、数据段 2M,官方文档明确 X5 支持 1M CAN / 2M CAN FD):

ip link set can0 down
ip link set can0 type can bitrate 500000 dbitrate 2000000 fd on
ip link set can0 up

需要调数据段采样点时再加 dsample-point 0.700 dsjw 1,若该 iproute2 版本不认这两个参数,就按上面的官方写法先用。

3. 物理层是本题最可能的原因
官方明确:距离 >1 m 或速率 >125 kbps 时,要闭合 X5 板上的 120 Ω 终端电阻开关,对端设备也必须使能 120 Ω;同时必须共地、L/H 不能接反。

  • 断电后量 CANH–CANL,应约 60 Ω(两端各 120 Ω);若 120 Ω 说明只有一端使能,40 Ω 说明多接了一个终端。
  • USB-CAN 分析仪侧的 120 Ω 是否使能、是否与 X5 用同一根地线,是错误帧最常见的来源。
  • ZCANPRO 里把波特率设为 500k、采样点也设 80%,与板端保持一致。



来源:RDK X5 CAN 使用

4. 用 loopback 做一次隔离

ip link set can0 down
ip link set can0 type can bitrate 500000 loopback on
ip link set can0 up
candump can0 -L &
cansend can0 123#1122334455667788

loopback 干净(数据立刻回显、无错误计数增长)→ 控制器和位定时的软件配置没问题,问题在收发器外部或对端;loopback 也异常 → 再查 dmesg | grep -iE "m_can|tcan|spi5"。

5. 长时间卡死
去掉 restart-ms 后持续发包,卡住瞬间抓一次 ip -s -d link show can0 和 dmesg:出现 bus-off / re-started 增长属于总线错误累积(回到第 3 步查电气和采样点);状态还正常但不再收发、dmesg 有 SPI 超时或中断丢失,才是驱动/SPI 吞吐方向,这类社区有同类反馈(如RDK X5 can 卡死),需要带日志进一步定位。

麻烦补充两个信息,就能收敛下一步:① 断电时 CANH–CANL 实测电阻是多少,X5 的终端电阻开关和分析仪的 120 Ω 各自是什么状态?② 报错误帧时 ip -details -statistics link show can0 的 state、berr-counter、bus-off 和 clock 值(可只贴这几行)。

1、 总的电阻是62欧,没有错。

2、请看附件log文件。

62Ω 说明两端 120Ω 都在位(并联约 60Ω),终端电阻不是这次错误帧的原因,不要再并第三个(会掉到 40Ω 反而更差)。设备树基本也可以排除:can0 能枚举、能收发,说明 SPI5 + 中断/复位 GPIO 已经通了;你现在是“帧能过、但夹大量错误帧”,属于位定时/波特率一致性或 L/H/GND 接线层面的事。

1. 位定时只能间接设置,先确认命令真的生效了
你原来那条 ip link set can0 type can bitrate 500000 ... 是在接口 up 的状态下发的,会返回 Device or resource busy 而位定时根本没改。必须先 down:

sudo ip link set can0 down
sudo ip link set can0 type can bitrate 500000 sample-point 0.800 sjw 1
sudo ip link set can0 up
ip -details -statistics link show can0

BRP/TSEG1/TSEG2 不能直接设,由 m_can 驱动按 bitrate + sample-point + 时钟反算。参考值(按 CAN 时钟 20 MHz 折算,仅用于核对回读的 tq/prop-seg/phase-seg,时钟以你回读的 clock 为准):

速率 BRP tq prop-seg phase-seg1 phase-seg2 采样点
250k 2 100ns 15 16 8 80%
500k 1 50ns 15 16 8 80%
1M 1 50ns 7 8 4 80%
FD 数据段 2M 1 50ns —(dtseg1=6) — 3(dtseg2) 70%

250k/1M 同理套用:

sudo ip link set can0 down
sudo ip link set can0 type can bitrate 250000 sample-point 0.800 sjw 1   # 或 1000000
sudo ip link set can0 up

CAN FD(仲裁 500k、数据 2M,官方文档明确 X5 支持 1M CAN / 2M CAN FD):

sudo ip link set can0 down
sudo ip link set can0 type can bitrate 500000 dbitrate 2000000 fd on
sudo ip link set can0 up

排查阶段去掉 restart-ms 100,它会让 bus-off 自动重启,把“到底谁先报错”这个关键信息冲掉。

2. ZCANPRO 侧也要对齐:设备类型 USB-CAN-II、工作模式“正常”(不能是只听/静默,否则不 ACK,X5 会持续重发并最终 bus-off)、波特率 500k、采样点设 80%;若勾了“自定义 BTR/sjw”,务必与上表一致或干脆用标准 500k。

3. 三个能区分原因的步骤

  • 双方都降到 125k 再发一次:错误帧消失 → 信号完整性/采样点/线束问题;仍报错 → 位定时或接线问题。
  • 只让一端发:ZCANPRO 发 0x123,X5 上 candump can0 -L 持续收 1 分钟;再反过来用 cangen can0 -I 123 -L 8 -D i -g 100 发、ZCANPRO 收。哪一端一发包就报错,问题就在那一端。
  • X5 本地回环隔离(回环时帧不上总线,也不会被 ACK,所以这步要断开 ZCANPRO 的发送):
sudo ip link set can0 down
sudo ip link set can0 type can bitrate 500000 loopback on
sudo ip link set can0 up
candump can0 -L &
cansend can0 123#1122334455667788

回显干净、bus-errors 不涨 → X5 控制器与位定时没问题。

X5 板上 120Ω 开关位置与端子接线(GND–GND、L–L、H–H),对着实物核对一次接头顺序:



来源:RDK X5 CAN 使用

你附的 logs.zip 我这边打不开内容,麻烦把这两项贴成文本就能继续收敛:① 上面 ip -details -statistics link show can0 的输出(state、clock、各 seg、bus-errors/bus-off);② ZCANPRO 里波特率那一栏的设置(是否勾了自定义 BTR、sjw 多少)。另外“跑十几分钟卡死”如果是 state 正常但不再收发、dmesg 里有 SPI 超时/中断丢失,那是另一条线(SPI/中断吞吐),把卡死瞬间的 dmesg 一起抓下来。如果多轮排查后确认是整机总线联调层面的问题,论坛这边可以先按上述梳理方案,具体项目联调可通过 DGP 项目对接与技术支持 找 FAE 一起看。

你自己用诊断仪验证过吗?功能都正常吗?

先直说:我没有在你的板子和这台 USB-CAN 分析仪上做过实测,也没有"诊断仪功能全部正常"的验证结论。前面几轮判断来自官方 RDK X5 CAN 文档(板载 TCAN4550,支持 1M CAN / 2M CAN FD;距离 >1 m 或速率 >125 kbps 需两端使能 120Ω)加上你给的日志和截图,属于分析推断,不能代替你现场的实测。所以下面几步的目的是让你自己把"板子"和"诊断仪"分开。

从这张截图能直接读到:Tx 的 0x001 帧状态是"发送成功",Rx 也收到 1 帧相同数据,但随后状态列大量"错误帧"、错误类型"格式错误",错误帧数远多于成功帧。格式错误是接收方在 CRC 分隔符、ACK 分隔符、EOF 这些固定格式位上检到显性电平才置位的,正常配置下不会持续出现;它指向两端位定时/采样点不一致(尤其分析仪侧的自定义 BTR)、或 L/H 与共地问题,而不是设备树。62Ω 已确认两端 120Ω 都在位,终端电阻可以彻底排除。

三步验证,按顺序做完即可定性:

  1. 分析仪自检:把接到 X5 的 CAN 线拔掉,只留 ZCANPRO 一台设备发送。单节点时正常现象是"应答错误"(无 ACK)。如果单独一台也一直报格式错误,说明问题在分析仪侧(固件/驱动/自定义 BTR 写错),改用标准 500k、清掉自定义 BTR 再试。
  2. X5 回环(官方回环测试,先断开总线):
sudo ip link set can0 down
sudo ip link set can0 type can bitrate 125000 loopback on
sudo ip link set can0 up
candump can0 -L &
cansend can0 123#1122334455667788

数据立即回显、ip -details -statistics link show can0 中 bus-errors 不增长 → X5 控制器和位定时软件侧没问题。
3. 双方都降到 125k 真实收发(官方双设备测试用的就是 125k):125k 无错误帧 → 高速下是采样点/线束/共地问题;125k 仍报格式错误 → 位定时或接线(L/H 反接、未共地)问题。

接线必须是 GND–GND、L–L、H–H,并与分析仪共地:


来源:RDK X5 CAN 使用

要把位定时对死,需要你把这两处贴成文本(截图上我看不出具体数值):① ip -details -statistics link show can0 的 clock、bitrate、prop-seg/phase-seg1/phase-seg2/sjw、state、berr-counter、bus-errors;② ZCANPRO 定时设置里的波特率、采样点,以及是否勾了自定义 BTR、各项值是多少。

你不要发重复的内容了

附件日志看过了,62Ω已记录。我没有用你这款诊断仪做过同环境实测。

日志反复出现 failed to enable configuration mode 和 probe ... -16,先处理控制器初始化/恢复异常,继续换BRP不能保证解决。no CAN clock source defined 在官方驱动里有20MHz回退,不能单凭这句判设备树缺时钟。

先执行 sudo systemctl disable --now can-init.service,停用日志里操作GPIO、重载驱动的恢复服务,再完全断电重启,用原配驱动按官方500k配置复测。BRP/TSEG先让驱动计算;若仍报配置模式错误,请通过DGP申请CAN驱动工程师支持,现有日志不用重传。

官方用法:https://developer.d-robotics.cc/rdk_x_doc/Advanced_development/hardware_development/rdk_x5/can
DGP:https://developer.d-robotics.cc/dgp

X5 这组 500k/80% 按 20MHz 计算没问题,诊断仪的 80MHz 不用跟它一致。图里圈了 80%,底部结果却还是 75%,先确认 80% 参数已真正应用到通道,再测经典 CAN。如果仍报错,就需要 CAN 工程师结合波形定位。

支持入口:https://developer.d-robotics.cc/dgp

测试用的是80%

500k/80% 这一项可以收掉了:你贴的 can0 回读是 state ERROR-ACTIVE (berr-counter tx 0 rx 0)、sample-point 0.800、tq 50 prop-seg 15 phase-seg1 16 phase-seg2 8 sjw 1、clock 20000000,计算器里选的也是 500k / 80.00%,配置值不用再对。但这只是那一刻的快照,推不出错误帧是哪一端发的——同一批日志里 can-init 自报 19:45:56 是 ERROR-ACTIVE,19:48:04 又回到 ERROR-WARNING。

logs/can-20261021-1930-1950.log 里能确认的事实(行号为该文件):

  • 19:34:21(46–48 行):failed to enable configuration mode → Failed registering m_can device -EBUSY → probe of spi5.0 failed with error -16;journal 同刻 625–627 行一致。
  • 19:33:02(4–5)、19:33:21(16–17)、19:34:02(37–38)、19:41:47(62–63)、19:46:39(135–136)反复 refusing to configure device when in normal mode,配 failed to enable configuration mode / failed to disable configuration registers。
  • 19:41:36(49–53)、19:45:29(104–108)、19:46:16(122–126)、19:48:08(159–163)是 m_can_class_unregister / tcan4x5x_can_remove / tcan4x5x_can_driver_exit,即驱动被卸载重载。日志里没有触发 reload 的脚本或其命令行,是 can-init 还是别的操作触发的我这边没核实,所以“芯片先假死导致重载”和“重载时序导致进不了配置模式”目前都只是候选,不能定因。
  • 19:32:52(1 行)一条孤立的 Bit Error Corrected,没有上下文,无法定位来源。

要把这两条线切开只能靠冷启动,也就是上一条说的停 can-init + 整机断电 10 s 上电(不是 reboot):只配置一次 500k/80%,中途不 down/up、不重载模块,单向持续收发 10–30 分钟。判读:

  • 这一场不再出现 failed to enable configuration mode、错误帧也基本没有 → 问题在重复初始化/重载时序这条线,把这份日志交给 CAN 侧定位时序即可。
  • 冷启动第一场在干净配置下仍持续报错、berr-counter 上涨 → 定时数值已排除,剩下电气与对端定时。注意分析仪按 80 MHz、X5 是 20 MHz,同样标 80% 时每 bit 的 tq 构成完全不同,这个只能靠抓 CANH/CANL 看位宽和 ACK、EOF 位置来判,不要再改 BRP 去猜。

还缺两项,截图是 -details,没有统计项:

ip -details -statistics link show can0   # bus_error、berr-counter、error-warn/pass、bus-off 累计
candump -e -ta can0                      # -e 打出错误帧标志,可看 crc / format / ack 类别

冷启动那场开始前抓一次、出现错误帧时再抓一次。之前提的分析仪单机自检和 X5 loopback 如果已经做了,把结果说一下,能直接缩小到某一端。