# -*- coding: utf-8 -*- """P3-CONTROL 网表(ESP32-S3 + USB-C 调试口 + I2C/开漏上拉 + NTC)。 用法:cd .claude && python -c "import p3_nets" —— 见 build_p3.py""" import json, sys, os sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), 'skills', 'easyeda-sch-geometry', 'scripts')) os.environ.setdefault('PINS_JSON', '') import local_netcheck as N # 需要当前目录有 pins.json w, gnd, pwr, port, txt = N.w, N.gnd, N.pwr, N.port, N.txt P = N.pin # ── 【A】ESP32-S3 供电 / EN / GND ──────────────────────────────── w('+3V3', (205,615), (120,615)) # U20.3V3 横向母线 w('+3V3', (160,615), (160,700)) # 竖直母线 pwr('+3V3', 160, 700) w('+3V3', (135,690), (160,690)) # C601 22uF w('+3V3', (140,635), (160,635)) # C602 100nF w('+3V3', (120,615), (120,590)) # -> R601.1(EN 上拉) w('GND', (105,690), (80,690)) w('GND', (100,635), (80,635)) w('GND', (80,450), (80,690)) # GND 母线 gnd(80, 450) w('EN', (205,605), (190,605), (190,530), (120,530), (120,550)) # U20.EN -> R601.2 w('EN', (120,530), (120,510)) # -> C603.1 w('GND', (120,470), (120,450), (80,450)) w('GND', (295,440), (320,440)) w('GND', (295,430), (320,430)) w('GND', (295,400), (320,400)) w('GND', (320,440), (320,380)) gnd(320, 380) # ── 【A】ESP32 GPIO 引出(3 级错开 340/420/500)──────────────── GPIO = [ (790, 'NTC1'), (780, 'NTC2'), (760, 'EFUSE_EN1'), (750, 'EFUSE_EN2'), (740, 'EFUSE_EN3'), (730, 'EFUSE_EN4'), (720, 'EFUSE_EN5'), (710, 'VBUS_EN1'), (700, 'VBUS_EN2'), (690, 'VBUS_EN3'), (680, 'VBUS_EN4'), (670, 'VBUS_EN5'), (660, 'SDA'), (650, 'SCL'), (640, 'KEY_SER'), (630, 'KEY_SRCLK'), (620, 'KEY_RCLK'), (610, 'USB_DM'), (600, 'USB_DP'), (590, 'KEY_OE#'), (550, 'IOEXP_INT#'), ] LVL = {0: 340, 1: 420, 2: 500} for y, net in GPIO: x = LVL[((790 - y) // 10) % 3] w(net, (295, y), (x, y)) port(net, x, y, 0) # ── 【B】USB-C 调试口 ─────────────────────────────────────────── w('GND', (65,345), (65,225)) # 外壳 4 脚 w('GND', (45,225), (135,225)) # 底部地轨 w('GND', (45,225), (45,375)) w('GND', (45,375), (160,375)) w('GND', (160,375), (160,345), (135,345)) # 上侧 GND 脚绕回 w('GND', (135,235), (135,225)) # 下侧 GND 脚 gnd(45, 225) w('USB_DP', (135,285), (330,285)) # DP1 w('USB_DP', (135,305), (310,305), (310,285)) # DP2 汇合(与 DM 交叉 1 处) w('USB_DP', (310,305), (310,320)) # 端口向上引,避开 DM 横线 port('USB_DP', 310, 320, 0) w('USB_DM', (135,295), (390,295)) # DN1 w('USB_DM', (135,275), (370,275), (370,295)) # DN2 汇合 port('USB_DM', 390, 295, 0) w('CC1', (135,265), (180,265)) w('CC2', (135,325), (180,325)) w('GND', (220,265), (450,265)) # R602 -> 地轨 w('GND', (220,325), (450,325)) # R603 -> 地轨 w('GND', (450,240), (450,325)) gnd(450, 240) # ── 【C】I2C 上拉 + 开漏上拉 ──────────────────────────────────── for x, net in ((650,'SDA'), (730,'SCL'), (810,'BUCK_PG'), (890,'INA_ALERT'), (980,'IOEXP_INT#')): w('+3V3', (x,620), (x,650)); pwr('+3V3', x, 650) w(net, (x,580), (x,550)); port(net, x, 550, 0) # ── 【D】NTC 温度采样 ×2 ─────────────────────────────────────── for xr, xc, xp, net in ((660, 720, 790, 'NTC1'), (880, 940, 1010, 'NTC2')): w('+3V3', (xr,400), (xr,430)); pwr('+3V3', xr, 430) w(net, (xr,360), (xr,320)) # R618/R619 -> RT601/RT602 w('GND', (xr,280), (xr,250)); gnd(xr, 250) w(net, (xr,340), (xc,340), (xc,330)) # -> 滤波电容 w('GND', (xc,290), (xc,260)); gnd(xc, 260) w(net, (xc,340), (xp,340)); port(net, xp, 340, 0) # ── 文字 ──────────────────────────────────────────────────────── txt('【A】ESP32-S3 主控', 45, 806) txt('【B】USB-C 调试口', 45, 390) txt('【C】I2C 上拉 4.7k + 三路开漏上拉', 645, 700) txt('【D】NTC 温度采样(10k B3380 + 10k 分压 + 100nF)', 645, 470) txt('3V3 来自 P1 的 U19,不依赖任何一路输出。', 45, 195) txt('EN: 10k 上拉 + 100nF 到地,上电复位。', 45, 185) txt('调试口走 ESP32-S3 原生 USB-Serial-JTAG。', 45, 175) txt('VBUS 故意不接:板子由 12V 供电,杜绝反灌。', 45, 165) txt('CC1/CC2 各 5.1k 下拉,对外表现为 UFP。', 45, 155) txt('不接的脚:IO0/IO3、IO45/IO46 是 strapping;', 45, 145) txt('IO35~IO37 留 PSRAM;IO39~IO42 留 JTAG;', 45, 135) txt('IO47/IO48 备用;RXD0/TXD0 引到 PCB 测试点。', 45, 125) NC = { 'U20': ['27','15','28','29','30','32','33','34','35','26','16','24','25','36','37'], 'J22': ['A4B9','B4A9','A8','B8'], }