固件:R2 迁移 R-0 ~ R-6(底板 + 5 片同构刀片)
2026-09-16 完成、当时未提交,这里补提交(原样,不含 09-27 上板的修改)。 - 器件层 / 拓扑层整体从 R1 换到 R2:TCA9548A 分通道、五路同址 INA226 0x40 + 输入侧 0x43、 刀片 PCA9555(VBUS_EN 挪到 P0.4)、CH224A 只读驱动、风扇闭环 t_thermal - 新增 i2cbus(mux 原子事务)、slot(刀片 I/O 门面)、host/qtest.sh - 74HC595 链退役(代码与测试保留) - 判据阈值与时间常量未动;19 个 ctest 全绿,idf.py build 通过 Co-Authored-By: Claude Opus 5.5 <[email protected]>
这个提交包含在:
+71
-22
@@ -1,16 +1,25 @@
|
||||
/* ESP32-S3 引脚分配 —— 全固件唯一一份(设计文档 §8.1,2026-09-06 按 PCB 几何
|
||||
重排的那一版,§26.18)。
|
||||
/* 底板 ESP32-S3 引脚分配 —— 全固件唯一一份(**R2 底板**,计划 §5.1)。
|
||||
|
||||
⚠️ **引脚号是从「板上要去哪儿」倒推的,不是逻辑顺序。** 和 INA226 地址、
|
||||
595 位号一样:查表,不要算。哪怕看上去像顺排(IO9~IO14 那一段),
|
||||
也是巧合 —— `EFUSE_EN` 那五根就一个规律都没有(39 / 48 / 6 / 41 / 8)。
|
||||
PCA9555 位号一样:查表,不要算。
|
||||
|
||||
五路各自的 `EFUSE_ENn` / `VBUS_ENn` **不在这里**,在 `rail_cfg.h` 的那张五路表里
|
||||
(它们是「每路一个」的东西,和 INA 地址、DAC 通道、按键位号是同一类)。
|
||||
本文件只放**全板独一份**的那些脚。`rail_selftest()` 会把两边合起来查重。
|
||||
⚠️ **模组脚号 ≠ GPIO 号。** 下面每一行的注释里都写着模组脚号,那是给对着
|
||||
原理图 / PCB 核对用的;`#define` 的值是 **GPIO 号**,那是给 `hal_gpio_*` 用的。
|
||||
两者在 WROOM-1 上没有任何规律(脚 17 = IO9,脚 34 = IO41)。
|
||||
|
||||
⚠️ 这里的值与 `.claude/pcb1-parts.json` 里 U20(WROOM-1 模组)的真实焊盘网络
|
||||
逐脚核对过(2026-09-07)。改动之前先回去核一遍,别照着记忆改。 */
|
||||
五路各自的 `EFUSE_EN` / `PRSNT#` **不在这里**,在 `rail_cfg.h` 的那张五路表里
|
||||
(它们是「每路一个」的东西)。本文件只放**全板独一份**的那些脚。
|
||||
`rail_selftest()` 会把两边合起来查重。
|
||||
|
||||
⚠️ 这里的值与 `.claude/r2/_base_pcb_nets.json` 里 `U20`(WROOM-1 模组)的真实
|
||||
焊盘网络逐脚核对过(2026-09-16),并与 `.claude/_esp32_pinmap.json` 的
|
||||
`r2_base` 对上。改动之前先回去核一遍,别照着记忆改。
|
||||
|
||||
---- R1 → R2 变了什么(别拿老记忆改这个文件)----------------------------
|
||||
· `VBUS_EN1~5` 五根 GPIO **没有了** —— 挪到刀片的 PCA9555 P0.4(计划 §5.4);
|
||||
· 74HC595 的四根线**没有了** —— 整条链退役(R2 D9);
|
||||
· 新增 `PRSNT#×5` / `MUX_RST#` / `INA_ALERT` / `HUB_RST` / `FAN_EN` / 第二路 TACH;
|
||||
· I²C 从 IO14/15 挪到 IO41/42,NTC 从 IO1/2 挪到 IO4/5。 */
|
||||
#ifndef BOARD_PINS_H
|
||||
#define BOARD_PINS_H
|
||||
|
||||
@@ -20,28 +29,62 @@ extern "C" {
|
||||
|
||||
/* ---- 全板独一份的信号(模组脚号 → GPIO) -------------------------------- */
|
||||
|
||||
#define BOARD_PIN_I2C_SDA 14 /* 模组脚 22 —— 6×INA226 + 2×DAC + PCA9555(+ 载板 LM75) */
|
||||
#define BOARD_PIN_I2C_SCL 15 /* 模组脚 8 */
|
||||
#define BOARD_PIN_FAN_TACH 16 /* 模组脚 9 → R731/R732 分压 */
|
||||
#define BOARD_PIN_FAN_PWM 18 /* 模组脚 11 → R733 */
|
||||
#define BOARD_PIN_UP_VBUS_DET 47 /* 模组脚 24 → J24.25,上游 VBUS 有没有插 */
|
||||
#define BOARD_PIN_NTC1 1 /* 模组脚 39,ADC1_CH0 —— 必须是 IO1~IO10 */
|
||||
#define BOARD_PIN_NTC2 2 /* 模组脚 38,ADC1_CH1 */
|
||||
/* I²C 主干:TCA9548A(0x70) + 输入侧 INA226(0x43) + 两片 DAC63204(0x4A/0x4B)。
|
||||
五片刀片的 INA226/PCA9555 在 mux 的分支上,不直接挂在这条线上。 */
|
||||
#define BOARD_PIN_I2C_SDA 41 /* 模组脚 34 */
|
||||
#define BOARD_PIN_I2C_SCL 42 /* 模组脚 35 */
|
||||
|
||||
/* USB-Serial-JTAG 的 D±。**S3 上是硬连线,动不了**(模组脚 13/14 → J22)。
|
||||
下载 / 调试口就是它,板上没有 JTAG 排针、也没有 USB 转串口芯片。
|
||||
/* TCA9548A 的 `RESET#`:板上 R611 上拉到 +3V3 ⇒ **低有效**。
|
||||
ESP32 复位期间高阻 = mux 正常工作。 */
|
||||
#define BOARD_PIN_MUX_RST_N 40 /* 模组脚 33 → U35.3 */
|
||||
|
||||
/* 五片刀片 PCA9555 的 `INT#` **线或**(R604 上拉)⇒ 低 = 有某一片报中断,
|
||||
**看不出是哪一片**。中断只是加速路径:`t_safety` 每 20 ms 无条件读一圈,
|
||||
因为 PCA9555 的 INT# 要读走输入端口才释放(漏掉一次就再也等不到下一个沿)。 */
|
||||
#define BOARD_PIN_IOEXP_INT_N 39 /* 模组脚 32 → 五个插槽的 B11 */
|
||||
|
||||
/* 底板输入侧 INA226(U13, 0x43)的 ALERT,R605 上拉 ⇒ 低有效。
|
||||
⚠️ R1 里这根是「六片线或进 PCA9555」,R2 只有这一片,而且直连 GPIO。 */
|
||||
#define BOARD_PIN_INA_ALERT_N 38 /* 模组脚 31 → U13.3 */
|
||||
|
||||
/* USB2517I 的复位,上拉到 +3V3_HUB ⇒ 低有效。
|
||||
⛔⛔ **运行期一个字都不许写它**(R2 D13 代价 2):ESP32 自己的控制台与烧录口
|
||||
就挂在这个 Hub 的第 6 个下行口上,误复位 = 自断控制台,而且下一次烧录也进不来。
|
||||
只在启动自检时脉冲一次;真出事的退路是 J33 那个 5P 应急串口。 */
|
||||
#define BOARD_PIN_HUB_RST_N 8 /* 模组脚 12 → U32.43 */
|
||||
|
||||
#define BOARD_PIN_UP_VBUS_DET 6 /* 模组脚 6 → R721/R722 分压,上游 USB-C 插没插 */
|
||||
|
||||
/* 两路 NTC。**必须落在 ADC1(IO1~IO10)**:ADC2 在 WiFi 开着时读不了,
|
||||
而本板 WiFi 常开。挪到 ADC2 不会报错,只会在连上 WiFi 之后开始读失败。 */
|
||||
#define BOARD_PIN_NTC1 4 /* 模组脚 4,ADC1_CH3 → RT601 */
|
||||
#define BOARD_PIN_NTC2 5 /* 模组脚 5,ADC1_CH4 → RT602 */
|
||||
|
||||
/* 风扇:一路 PWM 喂两个座(J26/J27),一个 12V 总开关,两路独立测速。
|
||||
⚠️ `FAN_EN` 复位时高阻 + 下拉 = **风扇不转**,固件必须主动开(Q8 → Q7 两级)。
|
||||
⚠️ 两路 TACH 各经一级开集三极管(Q9/Q10)**反相**后上拉 ⇒ 数边沿没问题,
|
||||
但任何「按电平判它转没转」的写法都是反的。 */
|
||||
#define BOARD_PIN_FAN_PWM 47 /* 模组脚 24 → R733 */
|
||||
#define BOARD_PIN_FAN_EN 48 /* 模组脚 25 → R748 → Q8 */
|
||||
#define BOARD_PIN_FAN_TACH_IN 21 /* 模组脚 23 → Q9 集电极(进风扇) */
|
||||
#define BOARD_PIN_FAN_TACH_OUT 14 /* 模组脚 22 → Q10 集电极(出风扇) */
|
||||
|
||||
/* USB-Serial-JTAG 的 D±。**S3 上是硬连线,动不了**(模组脚 13/14)。
|
||||
R2 里它接的是 **Hub 的第 6 个下行口**(D13:全机只剩一根线到电脑),
|
||||
不再是一个独立的 USB-C 座。下载 / 调试 / 上位机 CDC 都走它。
|
||||
⚠️ 永远别烧 `DIS_USB_JTAG` eFuse —— 烧了引脚 JTAG 和 USB 两边都没有。 */
|
||||
#define BOARD_PIN_USB_DM 19
|
||||
#define BOARD_PIN_USB_DP 20
|
||||
|
||||
/* ---- 不许占用的脚 -------------------------------------------------------- */
|
||||
|
||||
/* strapping:挂负载会影响上电模式(S3 只有这四个是)。 */
|
||||
/* strapping:挂负载会影响上电模式(S3 只有这四个是)。
|
||||
⚠️ IO0 在 R2 上接着 J33 应急口的下载脚,**更加不能当普通 GPIO 用**。 */
|
||||
#define BOARD_PINS_STRAPPING \
|
||||
{ \
|
||||
0, 3, 45, 46 \
|
||||
}
|
||||
/* WROOM-1 的 **R8 版(八线 PSRAM)占用**,留空以便换料。 */
|
||||
/* WROOM-1-**N16R8** 的八线 PSRAM 占用(2026-09-13 定的料号)。 */
|
||||
#define BOARD_PINS_RESERVED \
|
||||
{ \
|
||||
35, 36, 37 \
|
||||
@@ -55,9 +98,15 @@ extern "C" {
|
||||
26, 27, 28, 29, 30, 31, 32 \
|
||||
}
|
||||
|
||||
/* ESP32-S3 的 GPIO 编号上限(IO48 **存在**,`EFUSE_EN2` 就在上面)。
|
||||
/* UART0(J33 应急口)。**不许当 GPIO 用**:它是 Hub 挂掉之后唯一进得来的路。 */
|
||||
#define BOARD_PINS_UART0 \
|
||||
{ \
|
||||
43, 44 \
|
||||
}
|
||||
|
||||
/* ESP32-S3 的 GPIO 编号上限(IO48 **存在**,`FAN_EN` 就在上面)。
|
||||
⚠️ HAL 两侧的边界都写成 `pin <= BOARD_PIN_NUM_MAX`;A7 之前那里写的是
|
||||
`pin < 48`,正好把 IO48 关在门外 —— 现象是 CH2 的 eFuse 既开不了也**关不掉**。 */
|
||||
`pin < 48`,正好把 IO48 关在门外。 */
|
||||
#define BOARD_PIN_NUM_MAX 48
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
在新工单中引用
屏蔽一个用户