固件:首次上板修三处(Hub 复位 / 空槽不走总线 / 关 I²C 驱动日志)+ I²C 扫描工具

2026-09-27 底板上板(未插刀片)发现:

- HUB_RST 只在上电复位(ESP_RST_POWERON)时脉冲。原先每次重启都脉冲,
  esptool 经 USB 复位芯片即把自己的 COM 口断掉,只能走 J33 手动下载。
  实测:USB 复位(原因 11)后日志「不动 HUB_RST#」,COM 口全程不掉。
- t_safety 空槽不走总线。原先五路无条件读,空槽 NAK 每次十几 ms,
  槽 1 就吃光 10 ms 整圈预算,槽 2~5 与主干输入侧 0x43 一圈都没读到。
  新用例 test_empty_slots_are_never_touched_and_the_input_still_reads(去掉修复即红)。
- 关掉 i2c.master 驱动日志:NAK 日志在持锁期间同步打印,拖垮 20 ms 节拍。
  失败仍计入 t_safety 的 i2c_err。
- 上板结果:空机 skipped=0 i2c_err=0 过载 0 最迟 0 ms。

tools/i2c_scan:独立的只读扫描固件(主干 + mux 8 通道,读身份寄存器,不写任何输出)。
实测主干 0x22/0x23/0x43/0x4A/0x4B/0x70 全在,另有 0x47 应答(推测 DAC63204 广播地址)。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
这个提交包含在:
zhou yang
2026-09-27 10:26:55 +08:00
共同撰写人 Claude Opus 5.5
父节点 b8ad69681f
当前提交 dc0395fde0
共修改 10 个文件,包含 334 行新增和 4 行删除
+12
查看文件
@@ -330,8 +330,20 @@ hal_err_t t_safety_step(safety_snap_t *s)
返回 0 表示预算用完了 —— 剩下的路这一圈不读了。 */
const uint32_t t0 = now;
/* ⛔ 空槽**不走总线**(2026-09-27 上板实测)。原来五路无条件各读一次:空槽的 INA226 /
PCA9555 必然 NAK,而 IDF 驱动每次 NAK 要十几 ms(含它自己的错误日志),
槽 1 那两次就把 10 ms 整圈预算吃光 ⇒ 槽 2~5 **和主干上的输入侧 0x43** 一圈都没读到,
现象是 `txns=2`、每圈 skipped、「最迟 57 ms」—— 空机时输入侧的监控整个是瞎的。
在位脚是纯 GPIO,先 poll 再按它挑。`check_present()` 在后面照旧再 poll 一次、照旧负责断电。 */
slot_prsnt_poll();
/* 五路,一路一次 `xact`(通道查表,**不许算** —— rail_cfg.h 那条禁令)。 */
for (int rail = 1; rail <= PHONERAIL_RAIL_COUNT; rail++) {
if (!slot_present(rail)) {
s->rail_ok[rail - 1] = false; /* 没读 ≠ 读到了:别让上一圈的旧值冒充新鲜 */
s->io_ok[rail - 1] = false;
continue;
}
const uint32_t budget = lock_budget_left(t0);
if (budget == 0) {
skipped = true; /* 整圈预算用完:剩下的路本圈作废,下一拍重来 */