固件 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]>
这个提交包含在:
+23
-1
@@ -43,6 +43,8 @@ const char *t_safety_ev_str(safety_ev_t ev)
|
||||
return "mux失联全断";
|
||||
case SAFETY_EV_SLOT_EMPTY:
|
||||
return "刀片不在位";
|
||||
case SAFETY_EV_BLADE_MUTE:
|
||||
return "刀片不应答关路";
|
||||
default:
|
||||
return "?";
|
||||
}
|
||||
@@ -183,7 +185,27 @@ static hal_err_t cycle_rail(void *arg)
|
||||
}
|
||||
}
|
||||
|
||||
/* 判据就在这里跑:断 VBUS 要在本路通道选好、锁还持着的此刻(规矩 3)。 */
|
||||
/* 整片刀片不应答(T_SAFETY_BLADE_MUTE_N 的理由)。**不走 `trip_rail_locked()`**:
|
||||
它要先写这片 PCA9555 断 VBUS,而这片刚刚 NAK 过 —— 再发一次只是白等十几 ms 的
|
||||
IDF NAK 超时、把本圈预算吃光(规矩 4)。只关 eFuse(锁外,GPIO 直连,永远关得掉)。
|
||||
判据本身不发任何事务:两个 ok 位是上面刚读出来的。 */
|
||||
safety_rail_t *st = &s->st[rail - 1];
|
||||
if (rail_efuse_is_on(rail) && !s->rail_ok[rail - 1] && !s->io_ok[rail - 1]) {
|
||||
if (st->mute_n < 0xFF) {
|
||||
st->mute_n++;
|
||||
}
|
||||
if (st->mute_n >= T_SAFETY_BLADE_MUTE_N) {
|
||||
st->pend_abort = true;
|
||||
st->pend_efuse = true;
|
||||
st->pend_ev = (uint8_t)SAFETY_EV_BLADE_MUTE;
|
||||
/* 同 SR-5:不清零。关掉之后下一圈 en 为 false 自然清;写引脚失败的话下一圈立刻再关。 */
|
||||
}
|
||||
} else {
|
||||
st->mute_n = 0;
|
||||
}
|
||||
|
||||
/* 判据就在这里跑:断 VBUS 要在本路通道选好、锁还持着的此刻(规矩 3)。
|
||||
rail_ok 为 false 时它第一道闸就返回,不会盖掉上面攒下的 BLADE_MUTE。 */
|
||||
judge_locked(s, rail, a->now);
|
||||
return first;
|
||||
}
|
||||
|
||||
在新工单中引用
屏蔽一个用户