AutoClaw 固件升级后 CAN 总线初始化失败排查

# AutoClaw 固件升级后 CAN 总线初始化失败排查

## 现象

在 AutoClaw(澳龙)控制器刷入 v2.4.0 固件后,部分批次的设备在上电自检阶段打印:

“`
[ERROR] can0: initialization failed (timeout waiting for bus-off recovery)
[ERROR] hal_can: driver attach failed (-110)
“`

随后主进程退出,启动日志停在 `init: cannot start can_bus` 行。串口 Shell 仍能进入,但 `ip link set can0 up type can bitrate 500000` 手动执行也复现同样报错。

此现象集中在 2025 年 12 月之后出厂的 HW-3.2 主板,使用老版本(v2.3.x)固件的同批次设备则无异常。

## 背景与原理铺垫

在动手排查之前,有必要先理解 CAN 总线初始化的核心机制。AutoClaw 控制器基于 STM32F4 系列 MCU,CAN 控制器挂在 APB1 总线上,CAN 控制器从 APB1 取得时钟源后,经过内部波特率预分频器(Prescaler)、时间段 1(Time Segment 1)与时间段 2(Time Segment 2)三段分频,最终输出 CAN 位时间(Bit Time)。CAN 协议对波特率精度有严格要求:ISO 11898-1 规定节点之间的时钟偏差必须控制在 1.58% 以内,否则位时间识别就会失准,控制器持续检测到错误帧并最终进入 bus-off 状态。

AutoClaw v2.4.0 固件对整个外设时钟树做了重构,目的是为了配合新引入的 USB HS 高速外设与更高频率的 Ethernet 时钟需求,于是将 APB1 从 48 MHz 调低到 42 MHz。这本来是合理的工程优化,但开发团队在时钟切换后,没有同步更新 `hal_can.c` 中硬编码的分频系数。HAL 层的 500 kbps 波特率计算公式为:

“`
bit_time_quanta = APB1_clk / (Prescaler × (1 + BS1 + BS2))
500000 = 42000000 / (Prescaler × (1 + BS1 + BS2))
“`

而 v2.4.0 仍按 48 MHz 计算 Prescaler = 6,实际切换后真实波特率变成 466.67 kbps,误差约 6.67%,远高于协议容差,导致节点始终处于 bus-off 而无法完成初始化。

## 可能原因

按排查顺序列出三条主线,按出现概率排序:

1. 固件中 CAN 控制器时钟树变更(最常见)
v2.4.0 重构了外设时钟配置,将 APB1 时钟从 48 MHz 调整为 42 MHz,但 `hal_can.c` 中波特率分频系数仍按 48 MHz 硬编码,导致实际波特率偏移约 12.5%,超过 CAN 协议允许的 1.58% 容差,节点始终无法离开 bus-off 状态。

2. 终端电阻未启用或接线错误
AutoClaw HW-3.2 在 v2.4 之后改为出厂默认关闭板载 120 Ω 终端电阻(出于级联多机考虑),但 CAN 总线两端必须各有一个终端电阻才能正常通讯。

3. CAN 收发器型号差异
v2.4.0 固件默认配置适配 TJA1051T/3,部分小批量主板使用了兼容型号 SN65HVD230,二者在显性位输出电压上有约 0.4 V 差异,长线缆场景下可能触发隐性位检测失败。

## 典型案例复盘

案例一:深圳龙华某工业自动化集成商,2026 年 1 月批量部署
该集成商一次性采购 30 台 AutoClaw HW-3.2 用于自动化产线改造,全部统一升级到 v2.4.0 后,首轮上电即有 12 台出现 CAN 初始化失败,故障率高达 40%。集成商最初怀疑是线缆或接插件问题,更换线缆后依旧复现;后经我方远程支持,引导客户在 uboot 中执行 `setenv can_clk_div 7`,12 台设备全部恢复正常,后续升级 v2.4.2 后再无复现。

案例二:东莞松山湖某机器人公司,2026 年 3 月小批量试产
该公司同时使用 AutoClaw 主控与第三方执行器,第三方执行器采用 SN65HVD230 收发器,线缆长度 8 米,接 AutoClaw 后频繁出现间歇性断连。dmesg 显示 CAN 控制器已正常启动,但 `error-passive` 状态反复出现。客户通过在 `/etc/autoclaw/can.conf` 中显式指定 `transceiver = sn65hvd230` 与 `slope_control = rising` 后,丢帧率从 0.7% 下降到 0.02%。

案例三:广州番禺某车载电子后装客户,2026 年 4 月
客户反映升级 v2.4.0 后偶发 CAN 初始化失败,约 10 次启动中复现 1 次。排查发现是终端电阻未启用,板载 R47 位置 0 Ω 电阻出厂未贴,客户在总线远端并联外置 120 Ω 电阻后,故障彻底解决。

## 解决步骤

### 第一步:确认故障范围

进入串口 Shell,执行:

“`bash
dmesg | grep -i can
cat /proc/device-tree/soc/can@40006400/status
“`

若 `status` 为 `disabled`,说明设备树中 CAN 控制器被禁用,问题不在时钟树,继续看第二步。若显示 `okay` 且 dmesg 出现 `clk_apb1 rate mismatch`,则进入时钟树修复流程。还可以进一步执行 `cat /proc/device-tree/soc/can@40006400/clock-frequency`,确认设备树声明的时钟频率是否与 HAL 层一致。

### 第二步:检查终端电阻

断电后用万用表测量 CAN_H(pin 4)与 CAN_L(pin 5)之间的电阻:

– 60 Ω 左右 → 两端终端电阻正常
– 120 Ω 左右 → 仅一端有电阻,需在另一端并联 120 Ω
– 高阻 → 两端均未启用,需要在总线两端各并联 120 Ω 终端电阻

AutoClaw HW-3.2 板载终端电阻启用方法:将主板背面 R47 位置 0 Ω 电阻焊上(出厂未贴),或短接 JP3 跳线(v2.4 之后主板版本)。

### 第三步:时钟树修复(核心)

这是 v2.4.0 的固件 bug,临时绕过方案——手动覆盖分频系数:

“`bash
# 进入 uboot
setenv can_clk_div 7
setenv can_bitrate 500000
saveenv
reset
“`

永久修复需要回滚到 v2.3.7,或升级到 v2.4.2 之后的版本(含修复补丁)。验证补丁版本号:

“`bash
fw_version | grep “patch”
“`

应返回 `patch level: 2` 或更高。

### 第四步:收发器兼容性配置

若硬件确实混用了 SN65HVD230,在 `/etc/autoclaw/can.conf` 中加入:

“`
[driver]
transceiver = sn65hvd230
slope_control = rising
“`

然后重启 CAN 服务:`systemctl restart autoclaw-can`。

### 第五步:完整验证

“`bash
# 启动 CAN 接口
ip link set can0 up type can bitrate 500000 sample-point 0.875

# 发送测试帧
cansend can0 123#DEADBEEF

# 监听总线
candump can0,0:0,#FFFFFFFF
“`

若能看到发送的 `123` 帧被回环接收(前提是总线有回环节点),且无 `bus-off` 告警,则故障排除。

## 深度分析与避坑要点

关于 APB1 时钟树的耦合问题: AutoClaw v2.4.0 的时钟树变更影响范围其实不止 CAN 总线,I2C2、UART5 等同样挂在 APB1 上的外设,在某些对时钟精度敏感的传感器(如 SHT35 温湿度传感器、BMP280 气压计)上也观察到采样率偏移。升级 v2.4.0 后如果发现传感器读数偏大或偏小,先别急着怀疑传感器本身,先确认 APB1 时钟是否真的切到 42 MHz。

关于终端电阻的工程经验: CAN 总线两端各一个 120 Ω 终端电阻是教科书级要求,但工程上最常踩的坑是“级联多机”场景,有些工程师会在每个节点都接 120 Ω,导致总线等效电阻只有 30 Ω,反射反而更严重。正确做法是:无论中间串联多少节点,只在物理总线的最远两端各保留一个 120 Ω。

关于收发器选型: TJA1051T/3 与 SN65HVD230 都是常见 CAN 收发器,前者来自 NXP,后者来自 TI,二者电气参数接近但不完全一致。若硬件设计阶段不锁定型号,采购与生产环节容易混料。建议在 `can.conf` 中显式声明收发器型号,既避免固件自动识别失败,也方便后续维护追溯。

关于固件升级前的预防动作: 升级 AutoClaw 固件前,强烈建议先在单台设备上做小流量验证,重点观察 dmesg 启动日志、CAN 总线 error counter 是否有异常爬升。生产环境批量升级前,先在测试架上连续冷启动 5-10 次,确认无 bus-off 或 error-passive 再批量推送。

## 小结

AutoClaw v2.4.0 的 CAN 初始化失败通常是固件时钟树变更与终端电阻出厂状态变更两个因素叠加。先用 `dmesg` 区分是设备树未启用还是时钟失配,再检查终端电阻,最后处理收发器兼容性。生产环境建议直接升级到 v2.4.2+,避免反复调整硬件。

你在 AutoClaw 升级过程中遇到过哪些坑?欢迎贴出错日志一起讨论。

如需选购适合的笔记本电脑,可参考 Thinkpad深圳报价

相关阅读国行Thinkpad笔记本_深圳报价

AutoClaw 固件升级后 CAN 总线初始化失败排查

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Scroll to top