A3:INA226 驱动 + 六片地址表

地址表按设计文档 §8.2 钉死(0x40/41/44/45/42 + 输入侧 0x43),只走
ina226_rail_addr(),并有一条测试专门拦「ina_addr = 0x40 + ch」这一手
(CH3/CH4/CH5 三路全错,需求 §10.4)。

驱动只经 hal_i2c_*:认件(MFG/DIE ID)、写 Config 0x4327 + CAL 2048 并
回读校验、读 V/I/分流/功率。电流有符号,反灌为负(SW-8 判据)。
巡检走 read_vi(),每片两次事务,对应 §10.3 的 8% I²C 占用。

两条留给下次的坑:寄存器指针不依赖自增(sim 会自增、真件不会,靠自增
在宿主机上测不出来);CAL 丢了不报错只让 Current/Power 恒读 0,所以
有 ina226_check()。

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01QYuExfgyYa6DzRRcUso8M8
这个提交包含在:
zhou yang
2026-09-06 18:43:34 +08:00
共同撰写人 Claude Opus 5
父节点 cac6ce47ce
当前提交 ceadf08345
共修改 8 个文件,包含 595 行新增和 38 行删除
+7
查看文件
@@ -403,6 +403,13 @@ typedef struct {
> ⚠️ **`ina_addr = 0x40 + ch` 这行代码一定会被写出来,而且只有 CH3/CH4/CH5 是错的。**
> 实际地址是 `0x40 / 0x41 / 0x44 / 0x45 / 0x42`。查表,不要算。
> **A3 已落地**:表在 `firmware/components/drv/include/ina226.h`,取值只走
> `ina226_rail_addr(rail)`(rail 是 1~5,越界 abort),
> `test_channel_index_is_not_the_address_low_bits` 专门拦「改回算式」这一手。
> 同处还记了两条 INA226 的实现约定:**寄存器指针不自增**(每次读前重写指针,
> sim 会自增、真件不会,靠自增在宿主机上测不出来);**Calibration 丢了不报错、
> 只让 Current/Power 恒读 0**,所以巡检要定期 `ina226_check()`。
同理,**PCA9555 的方向寄存器只能配成全输入**:备用脚 Port0[7] / Port1[7:5] 在硬件上
直接接地,配成输出并写 1 就是对地短路(设计文档 §17.2 已在图纸上注明)。