背景
在绞车控制系统中,控制板(aed_winch_control v1.1)通过 CAN 总线驱动AK60-6 v1.1 KV80智能伺服电机实现正反转控制。操作员通过控制板上的装载开关(P6)和卸载开关(P7)触发 MCU,MCU 将开关量转换为 CAN 命令发给电机。
现象
- 控制板第一次上电后,与电机的 CAN 通信概率性失败(无响应、无应答)。
- 将电机 CAN 通信线(P14)插拔一次后,通信即恢复正常。
- 再次断电重新上电,问题可能再次复现。
电路结构梳理
| 节点 | 说明 |
|---|---|
| P14 | 电机 CAN 接口:pin1 = GND,pin2 = CAN_H,pin3 = CAN_L |
| U6 | CAN 收发器 TJA1042T/3/1J;VCC = input_5V,VIO = 3V3 |
| R19 | 120 Ω 终端电阻,硬接在 CANH/CANL 之间 |
| U6 STB | 直接接 GND(常驻 Normal 模式,无需软件控制) |
| MCU | CAN_TX / CAN_RX → U6 TXD / RXD |
| P6 / P7 | 装/卸开关输入,1 kΩ 限流 + PESD3V3 ESD 保护 + 100 nF 滤波 + 4.7 kΩ 上拉,连接 MCU GPIO |
P6 / P7 是开关量输入,由固件翻译成 CAN 指令,不直接操作 CAN 总线。
根本原因分析
核心判断:上电时序竞争 → CAN 控制器进入 Bus-Off → 固件无自恢复
触发路径
控制板上电 │ ├─ MCU 启动完成(< 100 ms)─→ 立即开始发 CAN 帧 │ └─ AK60-6 上电自检(需 数百 ms)─→ 尚未就绪,无法响应 ACK │ ↓ 发送帧得不到 ACK TEC(发送错误计数)快速递增 │ TEC ≥ 128 → Error-Passive │ TEC ≥ 256 → Bus-Off(CAN 控制器停止收发) │ 若固件未启用 ABOM 自动恢复 │ ↓ 控制器永久锁死在 Bus-Off 即使电机随后就绪,通信也无法建立插拔为何有效
插拔电机 CAN 线的本质:
- 拔出瞬间:移除总线上驱动显性的来源(或切断错误帧的物理路径),总线回到隐性空闲状态。
- MCU CAN 控制器检测到连续128 × 11 个隐性位→ 自动退出 Bus-Off(如果硬件支持);或者拔出期间 MCU 侧总线干净,重启 CAN 外设后恢复正常。
- 重新插入时:电机已完成自检、进入工作模式,握手成功 → 通信正常。
这与"规律性上电失败、插拔即恢复"的现象完全吻合。
次要风险:CAN_TX 上电初期可能为低
STM32 等 MCU 在 boot 阶段 GPIO 默认为输入/浮空,CAN_TX 引脚若短暂为低,将通过 U6 把总线强制拉成显性,导致总线被锁死。此时另一方同样无法通信。
复现条件
| 条件 | 说明 |
|---|---|
| 控制板与电机同时上电 | 概率最高 |
| 控制板先于电机上电 | 必然复现(电机还没就绪) |
| 电机先上电、完成自检后控制板再上电 | 一般不复现 |
修复方案
优先级 1 — 固件(无需改板)
开启 ABOM 自动 Bus-Off 恢复
STM32 bxCAN 初始化时设置:
hcan.Init.ABOM=ENABLE;// 自动 Bus-Off 恢复FDCAN:
hfdcan.Init.AutoRetransmission=ENABLE;hfdcan.Init.TransmitPause=ENABLE;上电握手 + 重试机制
不要上电后立即发业务帧,先做"等待 + 心跳 + 重试":
// 上电延时,等待电机就绪HAL_Delay(1000);// 带超时的握手循环for(intretry=0;retry<5;retry++){if(CAN_SendHeartbeat()==OK)break;// Bus-Off 检测:重新初始化 CANif(CAN_IsBusOff()){HAL_CAN_Stop(&hcan);HAL_Delay(200);HAL_CAN_Start(&hcan);}HAL_Delay(500);}保证 CAN_TX 上电期间为隐性(高)
在 CAN 初始化之前,先将 CAN_TX 对应 GPIO 配置为推挽输出并置高,避免浮空拉低总线。
优先级 2 — 硬件确认
| 检查项 | 方法 | 预期值 |
|---|---|---|
| 总线终端电阻 | 断电测 CANH-CANL | ≈ 60 Ω(两端各 120 Ω 并联) |
| AK60-6 是否自带终端电阻 | 查电机手册或实测 | 确认是否需要移除一端 |
| P14 连接器焊接 | 目视 + 万用表 | 无虚焊,导通正常 |
| 上电时序示波器验证 | 抓 CANH/CANL 上电波形 | 是否长时间停在显性(差分 ~2 V 不回隐性) |
结论
首要原因:上电时序竞争触发 CAN 控制器 Bus-Off,固件缺少 ABOM 自动恢复与重试导致通信永久锁死。
优先从固件层修复(ABOM + 上电延时 + 重试),成本最低、无需改板,大概率一次性解决问题。同时建议用示波器验证上电瞬间总线波形,排除终端电阻配置和接触不良的叠加影响。