fix: recover CAN bus-off and expire stalled transmissions
This commit is contained in:
@@ -74,6 +74,12 @@ ADC=12300mV WheelSpeed=LF:0.289m/s RF:0.577m/s
|
||||
|
||||
CAN1 和 CAN2 使用相同协议,所有主动上报均分别发送到两条总线。使用 11 位标准数据帧、低字节在前(little-endian)。CAN 正常发帧必须存在至少一个其他节点 ACK;单独接 CAN 分析仪且未开启 ACK 时,发送邮箱可能不会完成。
|
||||
|
||||
两路 CAN 均开启硬件自动 Bus-Off 恢复(ABOM)。总线重新满足恢复条件后,无需 MCU RESET 或整车断电即可重新通信;恢复功能不能消除线束、终端、节点或位时序造成的错误。
|
||||
|
||||
主循环分别维护两路发送邮箱:Bus-Off 时停止入队并请求取消未完成帧;正常状态下超过 100 ms 仍未完成的帧也会被异步取消,避免未连接的 CAN2 或缺少 ACK 时积压旧上报和 DAC 应答。邮箱满或入队失败的帧直接丢弃并统计,不阻塞另一条 CAN,也不等待取消完成。周期上报在后续周期重新生成;DAC 应答不保证重发。
|
||||
|
||||
可通过 STLINK/GDB 读取 `can_diagnostics[0]`(CAN1)和 `[1]`(CAN2):`last_esr` 为最近的硬件错误状态,`bus_off_events` / `recovery_events` / `passive_events` 为主循环观察到的状态转换次数,`tx_queued` 为入队数,`tx_completed` 为硬件 TXOK 完成数,`tx_failed` 为未成功完成数(含取消),`tx_unobserved` 为在邮箱重新分配前未能采到完成结果的帧数,`tx_dropped` 为未入队数,`abort_requests` / `abort_failures` 为取消请求成功/失败次数。计数上电清零,按 uint32 回绕;轮询可能漏掉短暂状态转换。ESR 的 TEC 字段只有发送错误计数的低 8 位,Bus-Off 时不能将它当作完整计数。TXOK 仍需外部抓包验证报文内容和持续通信。
|
||||
|
||||
| ID | 名称 | 周期/触发 | 数据 |
|
||||
|---:|---|---|---|
|
||||
| `0x6A0` | 心跳 | 每 100 ms | `A1 01 seq_L seq_H uptime_0..3` |
|
||||
|
||||
Reference in New Issue
Block a user