- 规则:铜层 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
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_DPUP_DMVBUS_UPVBUS_DETXTAL1XTAL2RBIASVDD18VDD18PLLCFGSEL0CFGSEL1NONREM0NONREM1(全部沿用 R1C2-HUB的名字) - A6:
FAN_PWM_LFAN_IN_TACH_RAWFAN_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. 三条会烧板 / 会自断后路的硬约束
HUB_RST必须外部上拉到+3V3_HUB(10k),且 ESP32 复位期间 Hub 保持工作。 ESP32 的控制台就挂在这颗 Hub 后面(D13),误复位 = 自断控制台 + 下次烧不进去。 固件侧只在启动自检脉冲一次 —— 硬件侧要保证「不驱动 = 不复位」。FAN_EN复位态必须是关电。 Q7 是 P-MOS 高边,栅极靠 Q6 拉低才导通; Q6 栅极要有 100k 下拉,ESP32 高阻时风扇不转(R1 P6 已经是这个拓扑,照抄)。+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,先读它)
- Y 轴向上(§1)。
- 所有坐标必须是 5 的倍数(§3、§8a-2b)—— 否则旗/端口静默不连。
- 导线只能横平竖直,用
s.w(net, p1, p2, p3...)逐段声明。 - 旗 / 端口的锚点必须落在某段导线的端点上,不能压在中段(§8a-2), 也不能和元件引脚同坐标(§8a:那会变成零长度导线,验证过得去、重画就断)。
- 同一个锚点上如果有两段共线的导线,合并后就成了中段 ——
netcheck会报。 - 页面范围
x 20~1145/y 10~812;标题栏在x>455 且 y<192,文字不许伸进去(§8c)。 - 文字宽度经验值:
右边界 ≈ x + 字号 × (中文字数 + 0.5×其余字符数)。 - 叠字是这个项目的常见事故:端口的符号+标签往锚点左边伸出去约 70 个单位,
flag_clash那种「横向 <20」的判据够不着。排版时给端口左边留 ≥80 的空白。 - 电源/地旗的
rot:0= 符号朝上(往上挂),180= 朝下。极性件别信方向表,按脚号断言。 ALLOW_SPLIT只放行「靠同名旗/端口成网、导线上天然分块」的网络(GND+12V+3V3+5V这类)。 信号网络出现「被拆成 N 块」就是真漏连,不许往ALLOW_SPLIT里加来消错。
8. 汇报格式
做完后回报(不要贴整段脚本):
- 脚本路径 + dry-run 的那三行统计输出(原样贴)。
- 本页画了什么(一句话一块)。
- 你发出/接收的端口清单(网名 + dir),主代理要拿它对账。
- 你做的设计决定与依据(尤其是 GPIO 分配、strap 电平、上下拉取值)。
- 你发现的风险 / 与方案文档不一致的地方(B3=+12V 那种错就是这么揪出来的)。
- 交叉点清单(如果有),说明为什么可接受。