# R2 底板(BASE)剩余四页的**跨页契约** — 2026-09-08 `A1-INPUT` / `A2-AUX` 已画完。本文件钉死 `A3-CTRL` / `A4-HUB` / `A5-SLOTS` / `A6-FAN` 四页之间的**网络名、方向、器件归属、位号区段**。四页由四个子代理并行设计, **只有主代理能下发到 EasyEDA**(全机只有一个 EDA 客户端,`openDocument` 是全局状态, 两个人同时推必然把图元放到别人的页上)。 ⛔ **子代理绝对不许**:跑 `.claude/eda.py`、`dump_page.py`、`xpage.py`、`shot.py`、 `verify_sch.py`、任何带 `--push` 的脚本,或任何会连 `127.0.0.1:4962x` 的东西。 你的交付物是**一个能本地自检通过的 Python 脚本**,主代理负责下发与几何验证。 --- ## 0. 已经存在的东西(不要重画,也不要改名) | 页 | 内容 | 对外端口 / 旗 | |---|---|---| | `A1-INPUT` | J1 DC-005 → F1 → Q1 反接 → C2~C6 → Rs6 → 12V 母线;U13 INA226(0x43);U29 TL431 泄放 | `+12V`(旗) `GND`(旗) `+3V3`(旗) `SDA` `SCL` `INA_ALERT`(端口) | | `A2-AUX` | U19 12V→3V3(0.5A);U30 12V→5V(2A) | `+12V` `+3V3` `GND`(旗) `+5V`(端口,OUT) | `xpage` 现在的 4 个单实例 `+5V` / `SDA` / `SCL` / `INA_ALERT` 就是等你们补对端的。 --- ## 1. 网络名总表(**唯一事实来源**) ### 1.1 电源 | 网络 | 图元类型 | 说明 | |---|---|---| | `+12V` | **Power 旗** | 全板 12V 母线 | | `+3V3` | **Power 旗** | U19 出来的控制轨(0.5A),给 ESP32 / mux / DAC / 刀片逻辑 | | `+5V` | **端口** | U30 出来的 5V(2A)。A2 已发 OUT,A4/A5 用 **IN** | | `+3V3_HUB` | **Power 旗**(仅 A4 页内) | U31 AMS1117 给 U32 专用,**不许**和 `+3V3` 并 | | `FAN_12V_SW` | **Power 旗**(仅 A6 页内) | Q7 高边开关之后的风扇 12V | | `GND` | **Ground 旗** | — | ### 1.2 跨页信号(发出方 → 接收方) | 网络 | 发出 | 接收 | 说明 | |---|---|---|---| | `SDA` / `SCL` | A1(U13) | **A3**(上拉 + ESP32 + U35 上游 + U6/U7 DAC) | I²C **主干**,不经 mux | | `INA_ALERT` | A1(U13) | **A3**(ESP32 GPIO) | 开漏,上拉放在 A3 | | `SDA1`~`SDA5` / `SCL1`~`SCL5` | **A3**(U35 通道 0~4) | **A5**(槽 1~5) | mux 分支,**上拉在刀片上**(B2-CTRL 的 R40/R41),底板这一侧不加 | | `VDAC1`~`VDAC5` | **A3**(U6/U7) | **A5** | 模拟量,跨金手指进刀片 | | `EFUSE_EN1`~`EFUSE_EN5` | **A3**(ESP32 直驱) | **A5** | 不经 IO 扩展 | | `PRSNT1#`~`PRSNT5#` | **A5**(槽 **B31** 一针) | **A3**(ESP32 输入 + 上拉) | ⚠️ **2026-09-08 修正**:底板是**主板侧**,`A1` 与 `B31` 必须是**两个节点** —— `A1 → GND`、`B31 → PRSNT{n}#`。短接 A1↔B31 的是**刀片**(`b4_edge.py`,PCIe add-in card 的标准做法),插上刀片才把 B31 拉到地。若底板也照字面「镜像」把两针并成一个网,回路里一个对地通路都没有 ⇒ **插不插都读「未插入」,而 DRC/ERC/几何验证/跨页对账四道全过**。见 `a5_slots.py` 表头的对照表 | | `INT#` | **A5**(五槽 B11 并联) | **A3**(ESP32 + **唯一一颗 10k 上拉到 +3V3**) | 开漏 wire-OR,五槽共一个网络 | | `HUB_RST` | **A3**(ESP32) | **A4**(U32) | ⚠ 见 §3 的保命约束 | | `UP_VBUS_DET` | **A4** | **A3**(ESP32) | 电脑在不在 | | `USB1_DP/DM` ~ `USB5_DP/DM` | **A4**(U32 下行口 1~5) | **A5**(槽 B14/B15) | | | `USB6_DP` / `USB6_DM` | **A4**(U32 下行口 6) | **A3**(ESP32 原生 USB,IO19=D−/IO20=D+) | D13 | | `FAN_EN` | **A3**(ESP32) | **A6** | 高边总开关,复位态必须**关电** | | `FAN_PWM` | **A3**(ESP32) | **A6** | 两只风扇共用(A6 里经反相成 `FAN_PWM_L`) | | `FAN_TACH_IN` / `FAN_TACH_OUT` | **A6** | **A3**(ESP32) | 两路独立测速 | | `NTC1` / `NTC2` | **A6**(RT601/RT602 分压节点) | **A3**(ESP32 **ADC1** 脚) | ⚠ 必须 ADC1(IO1~IO10),ADC2 与 WiFi 冲突 | ### 1.3 页内网络(不跨页,别在别的页上用这些名字) - A3:`MUX_RST#`(U35 的 RESET#,10k 上拉 + 一个 ESP32 GPIO)、`EN` / `IO0` / `TXD0` / `RXD0`(J33) - A4:`UP_DP` `UP_DM` `VBUS_UP` `VBUS_DET` `XTAL1` `XTAL2` `RBIAS` `VDD18` `VDD18PLL` `CFGSEL0` `CFGSEL1` `NONREM0` `NONREM1`(全部沿用 R1 `C2-HUB` 的名字) - A6:`FAN_PWM_L` `FAN_IN_TACH_RAW` `FAN_OUT_TACH_RAW` - A5:无(全是 §1.2 的网络 + 电源 + 地) ### 1.4 **明确不存在**的网络(R1 有、R2 没有,写了就是错) `BUCK_PG`(A2 的 U19 没引 PG)、`IOEXP_INT#`(改叫 `INT#`)、 `EFUSE_PG*` / `EFUSE_FLT*`(eFuse 在刀片上,状态走刀片自己的 PCA9555)、 `VBUS_EN*`(在刀片 B2-CTRL 上)、`KEY_*`(74HC595 已作废,D9)、 `USB_DP` / `USB_DM` 不带编号的形式(那是刀片页内的名字)。 --- ## 2. 位号区段(防撞) | 页 | 允许使用 | |---|---| | A1(已画) | `J1` `F1` `Q1` `Q3` `DZ1` `D1` `R1` `R4` `R5` `R6` `R9A~R9E` `C1~C6` `C11` `Rs6` `U13` `U29` | | A2(已画) | `U19` `U30` `L2` `L3` `R2` `R3` `R706` `R707` `C7~C10` `C731~C735` | | **A3-CTRL** | `U20` `U35` `U6` `U7` `J33`,新增无源件用 `R601~R650` / `C601~C650` | | **A4-HUB** | `U31` `U32` `Y1` `J23`,无源件 `R708~R730` / `C737` `C740~C759` | | **A5-SLOTS** / **A5B-SLOTS** | 插槽 `J34~J38`(槽 1~5)、D± 退路座 `J39~J43`,无源件 `R760~R790` / `C761~C790` | | **A6-FAN** | `Q6~Q10` `D2` `DZ3` `J26` `J27` `RT601` `RT602`,电容 `C736` `C738` `C739`,电阻 `R733` `R734` `R746~R757` + 新增 `R660~R699` | > ⚠️ **2026-09-08 修订**:原表里 A4 的 `C740~C760` 与 A5 的 `C760~C790` 在 `C760` 上撞车(A6 代理发现), > 已改成 `C740~C759` / `C761~C790`。A6 原来只点名了 `C738`,现补 `C736` / `C739`(全表仅剩的两个无主号)。 > `A5B-SLOTS` 是 2026-09-08 新开的第七页(`e493f8bce3a51aae`),与 A5 共用同一段号。 --- ## 3. 三条会烧板 / 会自断后路的硬约束 1. **`HUB_RST` 必须外部上拉到 `+3V3_HUB`(10k),且 ESP32 复位期间 Hub 保持工作。** ESP32 的控制台就挂在这颗 Hub 后面(D13),误复位 = 自断控制台 + 下次烧不进去。 固件侧只在启动自检脉冲一次 —— 硬件侧要保证「不驱动 = 不复位」。 2. **`FAN_EN` 复位态必须是关电。** Q7 是 P-MOS 高边,栅极靠 Q6 拉低才导通; Q6 栅极要有 100k 下拉,ESP32 高阻时风扇不转(R1 P6 已经是这个拓扑,照抄)。 3. **`+3V3_HUB` 与 `+3V3` 是两条轨**(U32 满载 ≈420 mA,挂不进 U19 那条 0.5A 轨)。 两者只共地。A4 页上不许出现把它们并起来的导线或同名旗。 --- ## 4. 器件与引脚几何(全部实测,直接用,不要自己猜) `.claude/eda-parts.json` 是器件表;下面是**这四页要用到的新器件**的引脚相对坐标(rot 0,相对元件中心): ``` TCA9548APWR (C130026) 左列 x=-50,右列 x=+50 1 A0 (-50, 55) 13 SD4 (50,-55) 2 A1 (-50, 45) 14 SC4 (50,-45) 3 RESET#(-50, 35) 15 SD5 (50,-35) 4 SD0 (-50, 25) 16 SC5 (50,-25) 5 SC0 (-50, 15) 17 SD6 (50,-15) 6 SD1 (-50, 5) 18 SC6 (50, -5) 7 SC1 (-50, -5) 19 SD7 (50, 5) 8 SD2 (-50,-15) 20 SC7 (50, 15) 9 SC2 (-50,-25) 21 A2 (50, 25) 10 SD3 (-50,-35) 22 SCL (50, 35) 11 SC3 (-50,-45) 23 SDA (50, 45) 12 GND (-50,-55) 24 VCC (50, 55) NCP18XH103F03RB (C13564) 1 (-20,0) 2 (+20,0) 无极性 2.54mm 1*5P 直排针 (C50951) 1(-20,20) 2(-20,10) 3(-20,0) 4(-20,-10) 5(-20,-20) 全部朝左 AMS1117-3.3 (C6186) 1 GND(-45,10) 2 VOUT(-45,0) 3 VIN(-45,-10) 4 VOUT(+45,0) PCIE-064-02-F-D-TH (C4597619) A1~A32: x=-35, y=155-10*(n-1) B1~B32: x=+35, y=155-10*(n-1) ``` 其余器件(ESP32-S3-WROOM-1 / DAC63204 / USB2517I / Y1 / AO3400A / AO3401A / SS34 / BZT52C8V2 / TYPE-C-31-M-12 / 2510-4A / A1251WV-S-4P / 各种 0402)的引脚坐标 **从 R1 的实测 dump 里直接读**,见 §5。 --- ## 5. R1 参照版图(已 dump 成 JSON,直接读,**不要连 EDA**) | 文件 | 是哪一页 | 给谁用 | |---|---|---| | `.claude/r2/_p3_live.json` | R1 `P3-CONTROL`(U20 ESP32 + J22 + RT601/602) | **A3**(ESP32 那一块整块搬)、**A6**(NTC 分压那一小块搬走) | | `.claude/r2/_p3b_live2.json` | R1 `P3B-EXPAND`(U6/U7 DAC + U23 PCA9555) | **A3**(两颗 DAC 整块搬,U23 不要) | | `.claude/r2/_c2hub_live.json` | R1 `C2-HUB`(U32 + Y1 + J23 + 一堆去耦) | **A4**(整页搬,加第 6 个下行口) | | `.claude/r2/_p6_live.json` | R1 `P6-FAN-EDL`(风扇部分 + EDL 部分) | **A6**(**只要风扇部分**,EDL 已挪去刀片 B3-PHONE) | | `.claude/r2/b4_edge.py` | R2 刀片 `B4-EDGE`(金手指 64 针分配) | **A5**(针位表照抄并做**逐脚对账**) | JSON 结构见 `.claude/r2/dump_page.py` 的文档串: `parts` = `[位号, 器件名, 子部件, x, y, rot, mirror, uuid, libraryUuid, [[脚号,脚名,x,y],...]]`, `wires` = **端点对**(不是折线),`flags` = `[种类, 网名, x, y, rot]`, `ports` = `[dir, 网名, x, y, rot]`,`texts` = `[x, y, 内容, rot, 字号]`。 ⚠️ **搬版图时引脚坐标是绝对坐标**:算出 `(引脚x - 元件x, 引脚y - 元件y)` 得到相对量, 再加上你的新元件中心。**不要相信任何"方向表"**(skill §6c:同一个 `rot` 在不同型号上语义相反)。 --- ## 6. 每页交付物 一个 `.claude/r2/aN_xxx.py`,**照抄 `a1_input.py` / `a2_aux.py` 的骨架**: ```python HERE = os.path.dirname(os.path.abspath(__file__)) sys.path.insert(0, HERE) from schcheck import Sheet, by_rel, two_pin, pins_of, _on # 按需 PAGE, NAME = '<页uuid>', '<页名>' def placement(): ... # [[位号, eda-parts的键, x, y, rot], ...] def expect(): ... # {位号: {脚号: (绝对x, 绝对y)}} 放件后逐脚回读比对用 def build(): ... # 返回填好 W/F/PT/TX 的 Sheet def main(): s = build(); s.assert_grid() errs = s.netcheck(PINS, NC, ALLOW_SPLIT) s.report(len(placement()), errs) if '--push' in sys.argv: s.clear(); s.place(placement(), expect()); s.push_geometry() ``` **页 uuid**(`.claude/r2/r2-uuids.json` 的 `boards.BASE.pages`): | 页 | uuid | |---|---| | A3-CTRL | `38327f806bc13133` | | A4-HUB | `09d583ff95cd35d9` | | A5-SLOTS | `2c73c5bf77f34053` | | A6-FAN | `68c9ffaa578572d3` | 跑 `/c/Python314/python .claude/r2/aN_xxx.py`(**不带 `--push`**)必须打印出: ``` 元件 N 导线 N 旗 N 端口 N 文字 N 交叉点(不相连,供人工确认): N 本地自检通过(短路 0 / 漏连 0 / 悬空 0 / 旗端口全在端点) ``` --- ## 7. 画图硬规矩(全部来自 `.claude/skills/easyeda-sch-geometry/SKILL.md`,**先读它**) 1. **Y 轴向上**(§1)。 2. 所有坐标必须是 **5 的倍数**(§3、§8a-2b)—— 否则旗/端口静默不连。 3. 导线只能**横平竖直**,用 `s.w(net, p1, p2, p3...)` 逐段声明。 4. 旗 / 端口的锚点必须落在**某段导线的端点**上,不能压在中段(§8a-2), 也不能和元件引脚**同坐标**(§8a:那会变成零长度导线,验证过得去、重画就断)。 5. 同一个锚点上如果有两段**共线**的导线,合并后就成了中段 —— `netcheck` 会报。 6. 页面范围 `x 20~1145` / `y 10~812`;**标题栏**在 `x>455 且 y<192`,文字不许伸进去(§8c)。 7. 文字宽度经验值:`右边界 ≈ x + 字号 × (中文字数 + 0.5×其余字符数)`。 8. **叠字是这个项目的常见事故**:端口的符号+标签往锚点**左边**伸出去约 70 个单位, `flag_clash` 那种「横向 <20」的判据够不着。排版时给端口左边留 ≥80 的空白。 9. 电源/地旗的 `rot`:`0` = 符号朝上(往上挂),`180` = 朝下。极性件别信方向表,按**脚号**断言。 10. `ALLOW_SPLIT` 只放行「靠同名旗/端口成网、导线上天然分块」的网络(`GND` `+12V` `+3V3` `+5V` 这类)。 信号网络出现「被拆成 N 块」就是真漏连,不许往 `ALLOW_SPLIT` 里加来消错。 --- ## 8. 汇报格式 做完后回报(**不要贴整段脚本**): 1. 脚本路径 + dry-run 的那三行统计输出(原样贴)。 2. 本页画了什么(一句话一块)。 3. **你发出/接收的端口清单**(网名 + dir),主代理要拿它对账。 4. 你做的**设计决定**与依据(尤其是 GPIO 分配、strap 电平、上下拉取值)。 5. 你发现的**风险 / 与方案文档不一致的地方**(B3=+12V 那种错就是这么揪出来的)。 6. 交叉点清单(如果有),说明为什么可接受。