文件
zhou yang和Claude Opus 5 efcba30a0c R2 底板改 4 层(D15):规则 / 几何 / 背面摆位 / 4 层布线与铺铜,已下发
- 规则:铜层 2→4,差分 0.28/0.18,间距 0.15,过孔 0.3/0.2(rules_base)
- 几何:98×98 板框 + 4×M3,槽阵居中,L1 12V 大铜 + 指头(pcb_base)
- 摆位:五插槽留 L1,其余 133 件翻到 L4;背面镜像规则实测;Hub 放走廊 2、
  东移 2.5 mm;扇出圈 / 小件间距 1.5(去耦例外)/ 9 A 过孔阵禁区(place_base)
- 叠层按用户决定改为 L1 槽面 / L2 整层 +3V3 / L3 整层 GND / L4 器件面
- 布线:D± 七对按构造布通(USB3 掉头、USB1/2 北去掉头、USB4/5 东绕、
  J23 桥),+3V3 / GND / +12V 平面网每脚一孔,0.125 网格 + PathFinder
  开关(route_base、remote_route.ps1);剩 37 个网待手工补
- 铺铜:4 层重写,入口链自南向北切段 + 断面校核(pour_base);
  已下发布线 / 缝合孔 / 铜面轮廓,填铜未成功(待查)
- 工具:plot_base / plot_routes / shot_base,board_check 通孔两层都算

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_0168Bu6SEx3cXXCJLkdnE6zB
2026-09-10 21:02:10 +08:00

12 KiB

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
SDA1SDA5 / SCL1SCL5 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 的骨架:

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. 交叉点清单(如果有),说明为什么可接受。