固件 0.1.4-c5:整片刀片不应答(INA226 + PCA9555 同时 NAK 200 ms)⇒ 关这一路
- t_safety:eFuse 开着、本路两颗都 NAK 连续 10 圈 ⇒ abort + 关 eFuse,新事件 20 BLADE_MUTE; 只关 eFuse,不再写刚 NAK 过的 PCA9555。只有一颗不答应仍按 §10.10 盲跑、保持供电 - 起因:板 B 第 2 槽 PRSNT2# 卡低,刀片挪走后空槽 eFuse 开了约 4 h,原判据一条没响 - 需求 §10.10 加一行 + 表后第 3 条;rack 事件 20 命名并标红 - 宿主机 26 ctest 全绿(test_t_safety_rules +4 例) Co-Authored-By: Claude Opus 5.5 <[email protected]>
这个提交包含在:
@@ -118,6 +118,16 @@ extern "C" {
|
||||
在拿旧数据跑判据。判定成立之后**先脉冲一次 `MUX_RST#`**,再不行才全断。 */
|
||||
#define T_SAFETY_MUX_FAIL_N 3
|
||||
|
||||
/* ⭐ 0.1.4:**整片刀片不应答**(本路 INA226 与 PCA9555 **同时** NAK)连续多少圈就关这一路。
|
||||
与 §10.10 第一行「INA226 无应答 → 盲跑、保持供电」不冲突:那一行是**一颗**器件坏了,
|
||||
刀片上的另一颗还答应;两颗都不答应而 mux 是好的(选不中的话本路读函数根本不会被调,
|
||||
计不进来),只剩两种可能 ——
|
||||
· 刀片根本不在,是 `PRSNT#` 假在位(2026-09-28 板 B 第 2 槽:卡低之后空槽 eFuse 开了约 4 h);
|
||||
· 刀片在,但这一路完全失控:看不到 V/I、看不到 PG/FLT、**连 VBUS 都断不了**。
|
||||
两种都是「继续供电但看不见」,和 mux 失联全断同一个道理,只是范围是一路。
|
||||
10 圈 = 200 ms:本板实测单路 9 万圈 0 次 NAK,连续 10 次不是毛刺;空槽带 12 V 多 200 ms 无所谓。 */
|
||||
#define T_SAFETY_BLADE_MUTE_N 10
|
||||
|
||||
/* ---- A10:事件(§10.7 的「单条」形状) -----------------------------------
|
||||
A11 把这条记录塞进环形缓冲,这里只负责**产生**它。 */
|
||||
|
||||
@@ -130,6 +140,8 @@ typedef enum {
|
||||
/* ⭐ R2 新增两条(计划 §5.8)。放在**末尾**:`evlog` 那边的数字是 flash 格式。 */
|
||||
SAFETY_EV_MUX_LOST, /* TCA9548A 连续选不中 ⇒ 五路全部断电(单点) */
|
||||
SAFETY_EV_SLOT_EMPTY, /* `PRSNT#` 为高(刀片不在位)⇒ 这一路不许带电 */
|
||||
/* 0.1.4,同样只许加在末尾。 */
|
||||
SAFETY_EV_BLADE_MUTE, /* 本路 INA226 + PCA9555 连续 T_SAFETY_BLADE_MUTE_N 圈都不应答 ⇒ 关这一路 */
|
||||
} safety_ev_t;
|
||||
|
||||
typedef struct {
|
||||
@@ -153,6 +165,7 @@ typedef struct {
|
||||
bool en_on; /* 上一圈看到的 `EFUSE_EN` 影子,用来认它的上升沿 */
|
||||
uint32_t en_ms; /* 上升沿的时刻,缓启动窗口从这里算(这个是真按毫秒的) */
|
||||
uint8_t dev_n; /* 连着几圈越界了。回到范围内 / 这一路被关掉就清零 */
|
||||
uint8_t mute_n; /* 开着电、整片刀片连着几圈不应答。任一颗答应了 / 这一路关着就清零 */
|
||||
|
||||
/* 本圈锁内判据留给锁外的两件事(规矩 3:VBUS 锁内断,eFuse 锁外关)。 */
|
||||
uint8_t pend_ev; /* safety_ev_t,0 = 没有 */
|
||||
|
||||
在新工单中引用
屏蔽一个用户