网表脚本,后面可以提前检查硬件的错误

This commit is contained in:
2026-09-16 13:47:59 +08:00
parent e7348c48ba
commit 8d331031d6
4 changed files with 2797 additions and 0 deletions
File diff suppressed because it is too large Load Diff
+265
View File
@@ -0,0 +1,265 @@
# -*- coding: utf-8 -*-
"""gen_kb.py - 生成 pinout_kb.json(V0.0 网表知识库)。
运行: & '.venv\\Scripts\\python.exe' tools/netlist_semantics/gen_kb.py
数据来源:V0.0.tel 实测 + docs/芯片手册 + AGENTS.md 硬件引脚表。
"""
import json
import os
KB = {
"_comment": "V0.0 网表知识库:instances=位号→器件, nets=网络→语义。引脚功能以【网名+本表】为准(KiCad 符号脚号为任意编号,非手册脚号)。",
"instances": {
"U1": {"mpn": "CH395F", "pkg": "QFN-32", "desc": "SPI 以太网控制器 (MAC+PHY);SPI2↔U17,MDI→T1"},
"U2": {"mpn": "RTL8305NBI-CG", "pkg": "QFN-48", "desc": "双口 10/100 以太网交换/PHY;驱动 J1/J2,经 T1 接 U1"},
"U3": {"mpn": "TPAFE5160", "pkg": "LQFP-64", "desc": "16 通道 16-bit ADC;8080/FSMC 并口↔U17"},
"U4": {"mpn": "B0303S", "pkg": "PWRM-TH", "desc": "3.3V→3.3V 隔离 DC-DC(通信域 C3.3V);实际 B0303S,封装误标 B0505S-1WR3(A2,V0.1 更正)"},
"U5": {"mpn": "WINGTAT 9001-15481C00A", "pkg": "CONN-TH 48P", "desc": "48P 子板插座(继电器/告警/ADC/串口/时钟)"},
"U6": {"mpn": "LDO (SOT-223)", "pkg": "SOT-223-4", "desc": "5V→G3.3V LDO(通信 3.3V 域)"},
"U7": {"mpn": "LDO (SOT-223)", "pkg": "SOT-223-4", "desc": "5V→3.3V LDO(主 3.3V 域)"},
"U8": {"mpn": "FOC-817SC-F", "pkg": "SMD-4", "desc": "光耦;隔离 ST_DIR4→DIR4(485 方向控制)"},
"U9": {"mpn": "CA-IS3722HS", "pkg": "SOIC-8", "desc": "双通道数字隔离器;隔离 ST_UART1 → 232 ch1"},
"U10": {"mpn": "CA-IS3722HS", "pkg": "SOIC-8", "desc": "双通道数字隔离器;隔离 ST_UART3 → 232 ch3"},
"U11": {"mpn": "CA-IS3722HS", "pkg": "SOIC-8", "desc": "双通道数字隔离器;隔离 ST_UART4 → RS485"},
"U12": {"mpn": "SuperESD (CDSOT23)", "pkg": "SOT-23-3", "desc": "ESD 保护;RS485 A/B 线"},
"U13": {"mpn": "TPT3232E", "pkg": "SOP-16", "desc": "双路 RS232 电平转换收发器(驱动 RS232_TX1/RX1/TX3/RX3 → CN1/U14)"},
"U14": {"mpn": "C2836689", "pkg": "RJ45-TH", "desc": "RJ45 座(232/CLOCK/CF 通信口,非以太网)"},
"U15": {"mpn": "TP8485E-SR", "pkg": "SOIC-8", "desc": "RS-485 收发器"},
"U16": {"mpn": "SD2506API-G", "pkg": "DIP-6", "desc": "时钟/RTC 芯片(I2C: SD_SDA/SD_SCL)"},
"U17": {"mpn": "STM32F407ZGT6", "pkg": "LQFP-144", "desc": "主 MCU (Cortex-M4 @168MHz)"},
"U18": {"mpn": "AIP74LVC16245TA48", "pkg": "TSSOP-48", "desc": "16 位总线收发器(U17 ↔ 子板 U5)"},
"U19": {"mpn": "GD5F2GQ5UE", "pkg": "WSON-8", "desc": "2Gbit SPI NAND Flash"},
"U20": {"mpn": "钽电容", "pkg": "CAP-TH", "desc": "电源滤波 (GND/PGND)"},
"U21": {"mpn": "钽电容", "pkg": "CAP-TH", "desc": "电源滤波 (GND/PGND)"},
"U22": {"mpn": "钽电容", "pkg": "CAP-TH", "desc": "电源滤波 (CGND/PGND)"},
"J1": {"mpn": "HR911105A", "pkg": "RJ45-TH", "desc": "RJ45+网络变压器一体(端口 A)"},
"J2": {"mpn": "HR911105A", "pkg": "RJ45-TH", "desc": "RJ45+网络变压器一体(端口 B)"},
"H1": {"mpn": "16P 排针", "pkg": "HDR-TH", "desc": "LCD 8080 并口(板外屏)"},
"H2": {"mpn": "3P 排针", "pkg": "HDR-TH", "desc": "SWD 调试(SWDIO/SWCLK/GND)"},
"CN1": {"mpn": "JL15 端子", "pkg": "CONN-TH", "desc": "通信端子(RS485 A/B + RS232 1/3)"},
"X1": {"mpn": "晶振", "pkg": "CRYSTAL-4P", "desc": "→ U2 RTL8305 (RXI/RXO)"},
"X2": {"mpn": "晶振", "pkg": "CRYSTAL-4P", "desc": "→ U1 CH395F (XI/XO)"},
"X3": {"mpn": "晶振", "pkg": "CRYSTAL-4P", "desc": "→ U17 pin23/24(网未命名,推测 HSE 8MHz)"},
"T1": {"mpn": "H1102NLT", "pkg": "XFMR-SMD", "desc": "网络变压器(U1 CH395F ↔ U2 RTL8305)"},
"L1": {"mpn": "磁珠/电感", "pkg": "L0603", "desc": "5V→AVCC 滤波"},
"L2": {"mpn": "磁珠/电感", "pkg": "L0603", "desc": "AGND↔GND 连接"},
"L3": {"mpn": "磁珠/电感", "pkg": "L1206", "desc": "VDD50↔5V"},
"L4": {"mpn": "磁珠/电感", "pkg": "L1206", "desc": "G3.3V 滤波"},
"L6": {"mpn": "磁珠/电感", "pkg": "L0603", "desc": "3.3V→STM_VDDA 滤波"},
"D1": {"mpn": "肖特基/钳位二极管", "pkg": "SMB", "desc": "G3.3V 保护"},
"D2": {"mpn": "肖特基/钳位二极管", "pkg": "SMB", "desc": "3.3V 保护"},
"D3": {"mpn": "ESD 二极管", "pkg": "SMB", "desc": "RS232_RX3 保护"},
"D4": {"mpn": "ESD 二极管", "pkg": "SMB", "desc": "RS232_TX3 保护"},
"D5": {"mpn": "ESD 二极管", "pkg": "SMB", "desc": "RS232_TX1 保护"},
"D6": {"mpn": "ESD 二极管", "pkg": "SMB", "desc": "RS232_RX1 保护"},
"Q1": {"mpn": "MOSFET/三极管", "pkg": "SOT-23", "desc": "LED 驱动"},
},
"nets": {
"GND": {"func": "主数字地"},
"AGND": {"func": "模拟地(ADC/模拟域)"},
"PGND": {"func": "电源/网络地(RJ45 屏蔽)"},
"CGND": {"func": "通信地(隔离侧)"},
"3.3V": {"func": "3.3V 主电源"},
"5V": {"func": "5V 电源(输入)"},
"C3.3V": {"func": "3.3V(通信/隔离侧)"},
"G3.3V": {"func": "3.3V(U6 LDO 输出,通信域)"},
"AVCC": {"func": "模拟 3.3V(ADC 供电,经 L1)"},
"AVDDL": {"func": "PHY 电源(U2 RTL8305)"},
"STM_VDDA": {"func": "STM32 模拟电源 VDDA(经 L6)"},
"VDD50": {"func": "5V(子板/USB 域,经 L3)"},
"XI": {"func": "晶振输入", "note": "X2→U1 CH395F"},
"XO": {"func": "晶振输出", "note": "X2→U1 CH395F"},
"RXI": {"func": "晶振输入", "note": "X1→U2 RTL8305"},
"RXO": {"func": "晶振输出", "note": "X1→U2 RTL8305"},
"CLOCK": {"func": "时钟(子板/232)", "note": "→U5 C8 / U14 pin7"},
"HRST": {"func": "ADC 复位", "note": "U3 reset,经 R16/C31"},
"GD_SCLK": {"func": "SPI1_SCK", "gpio": "PB3", "note": "→U19 SCK"},
"GD_SO": {"func": "SPI1_MISO", "gpio": "PB4", "note": "U19 SO←"},
"GD_SI": {"func": "SPI1_MOSI", "gpio": "PB5", "note": "→U19 SI"},
"GD_CS": {"func": "SPI1_NSS", "gpio": "PE0", "note": "→U19 CS"},
"GD_HOLD": {"func": "HOLD", "gpio": "PE1", "note": "→U19 HOLD"},
"GD_WP": {"func": "写保护", "gpio": "PB8", "note": "→U19 WP"},
"SPI1_SOMI": {"func": "SPI1 MOSI(子板侧)", "note": "经 U18 16245→子板;GPIO 待核"},
"SPI1_SIMO": {"func": "SPI1 MISO(子板侧)", "note": "经 U18 16245←子板;GPIO 待核"},
"CH395F_SCS": {"func": "SPI2_NSS", "gpio": "PB12"},
"CH395F_SCK": {"func": "SPI2_SCK", "gpio": "PB13"},
"CH395F_SDO": {"func": "SPI2_MISO", "gpio": "PB14"},
"CH395F_SDI": {"func": "SPI2_MOSI", "gpio": "PB15"},
"SD_SDA": {"func": "I2C SDA", "note": "→U16 SD2506"},
"SD_SCL": {"func": "I2C SCL", "note": "→U16 SD2506"},
"ST_TX0": {"func": "USART ch0 TX", "note": "→子板 (U5 A10)"},
"ST_RX0": {"func": "USART ch0 RX", "note": "←子板 (U5 B10)"},
"ST_TX1": {"func": "USART ch1 TX", "note": "→U9 隔离→232 ch1"},
"ST_RX1": {"func": "USART ch1 RX", "note": "←U9 隔离←232 ch1"},
"ST_TX2": {"func": "USART ch2 TX", "note": "→子板 (U5 C7)"},
"ST_RX2": {"func": "USART ch2 RX", "note": "←子板 (U5 C6)"},
"ST_TX3": {"func": "USART ch3 TX", "note": "→U10 隔离→232 ch3"},
"ST_RX3": {"func": "USART ch3 RX", "note": "←U10 隔离←232 ch3"},
"ST_TX4": {"func": "UART5_TX(485)", "gpio": "PC12", "note": "→U11 隔离"},
"ST_RX4": {"func": "UART5_RX(485)", "gpio": "PD2", "note": "←U11 隔离"},
"ST_DIR4": {"func": "485 方向 DE", "gpio": "PD0", "note": "→U8 光耦"},
"TX4": {"func": "485 TX(隔离后)", "note": "U11→U15"},
"RX4": {"func": "485 RX(隔离后)", "note": "U15→U11"},
"DIR4": {"func": "485 方向(隔离后)", "note": "U8→U15"},
"RS485_A": {"func": "485 A 线", "note": "U15→U12 ESD→CN1"},
"RS485_B": {"func": "485 B 线", "note": "U15→U12 ESD→CN1"},
"TX1": {"func": "232 ch1 TX(隔离后)", "note": "U9→U13"},
"RX1": {"func": "232 ch1 RX(隔离后)", "note": "U13→U9"},
"TX3": {"func": "232 ch3 TX(隔离后)", "note": "U10→U13"},
"RX3": {"func": "232 ch3 RX(隔离后)", "note": "U13→U10"},
"RS232_TX1": {"func": "232 ch1 总线", "note": "U13→CN1/U14"},
"RS232_RX1": {"func": "232 ch1 总线", "note": "CN1/U14→U13"},
"RS232_TX3": {"func": "232 ch3 总线", "note": "U13→CN1/U14"},
"RS232_RX3": {"func": "232 ch3 总线", "note": "CN1/U14→U13"},
"LCD_DB0": {"func": "8080 数据 D0", "note": "U17 FSMC→H1"},
"LCD_DB1": {"func": "8080 数据 D1", "note": "U17 FSMC→H1"},
"LCD_DB2": {"func": "8080 数据 D2", "note": "U17 FSMC→H1"},
"LCD_DB3": {"func": "8080 数据 D3", "note": "U17 FSMC→H1"},
"LCD_DB4": {"func": "8080 数据 D4", "note": "U17 FSMC→H1"},
"LCD_DB5": {"func": "8080 数据 D5", "note": "U17 FSMC→H1"},
"LCD_DB6": {"func": "8080 数据 D6", "note": "U17 FSMC→H1"},
"LCD_DB7": {"func": "8080 数据 D7", "note": "U17 FSMC→H1"},
"LCD_CS": {"func": "片选", "note": "U17→H1"},
"LCD_CD": {"func": "数据/命令 (ALE)", "note": "U17→H1"},
"LCD_RD": {"func": "读", "note": "U17→H1"},
"LCD_WR": {"func": "写", "note": "U17→H1"},
"LCD_RST": {"func": "复位", "note": "U17→H1"},
"LCD_BK": {"func": "背光", "note": "U17→H1"},
"TP_RD": {"func": "读控制 (FSMC)", "gpio": "PD3"},
"TP_CONVST": {"func": "转换启动", "gpio": "PD4"},
"TP_BUSY": {"func": "忙", "gpio": "PD7"},
"TP_OS0": {"func": "输出选择 OS0"},
"TP_OS1": {"func": "输出选择 OS1"},
"TP_OS2": {"func": "输出选择 OS2"},
"TP_FRSTDATA": {"func": "首数据", "note": "经 R24"},
"DB0": {"func": "FSMC 数据 D0", "gpio": "PG0", "note": "U17↔U3"},
"DB1": {"func": "FSMC 数据 D1", "gpio": "PG1"},
"DB2": {"func": "FSMC 数据 D2", "gpio": "PG2"},
"DB3": {"func": "FSMC 数据 D3", "gpio": "PG3"},
"DB4": {"func": "FSMC 数据 D4", "gpio": "PG4"},
"DB5": {"func": "FSMC 数据 D5", "gpio": "PG5"},
"DB6": {"func": "FSMC 数据 D6", "gpio": "PG6"},
"DB7": {"func": "FSMC 数据 D7", "gpio": "PG7"},
"DB8": {"func": "FSMC 数据 D8", "gpio": "PG8"},
"DB9": {"func": "FSMC 数据 D9", "gpio": "PG9"},
"DB10": {"func": "FSMC 数据 D10", "gpio": "PG10"},
"DB11": {"func": "FSMC 数据 D11", "gpio": "PG11"},
"DB12": {"func": "FSMC 数据 D12", "gpio": "PG12"},
"DB13": {"func": "FSMC 数据 D13", "gpio": "PG13"},
"DB14": {"func": "FSMC 数据 D14", "gpio": "PG14"},
"DB15": {"func": "FSMC 数据 D15", "gpio": "PG15"},
"AIN1": {"func": "子板模拟输入→ADC1"},
"AIN2": {"func": "子板模拟输入→ADC2"},
"AIN3": {"func": "子板模拟输入→ADC3"},
"AIN4": {"func": "子板模拟输入→ADC4"},
"AIN5": {"func": "子板模拟输入→ADC5"},
"AIN6": {"func": "子板模拟输入→ADC6"},
"AIN7": {"func": "子板模拟输入→ADC7"},
"AIN8": {"func": "子板模拟输入→ADC8"},
"AIN9": {"func": "子板模拟输入→ADC9"},
"AIN10": {"func": "子板模拟输入→ADC10"},
"AIN11": {"func": "子板模拟输入→ADC11"},
"AIN12": {"func": "子板模拟输入→ADC12"},
"AIN13": {"func": "子板模拟输入→ADC13"},
"AIN14": {"func": "子板模拟输入→ADC14"},
"AIN15": {"func": "子板模拟输入→ADC15"},
"ADC1": {"func": "TPAFE5160 通道1"},
"ADC2": {"func": "TPAFE5160 通道2"},
"ADC3": {"func": "TPAFE5160 通道3"},
"ADC4": {"func": "TPAFE5160 通道4"},
"ADC5": {"func": "TPAFE5160 通道5"},
"ADC6": {"func": "TPAFE5160 通道6"},
"ADC7": {"func": "TPAFE5160 通道7"},
"ADC8": {"func": "TPAFE5160 通道8"},
"ADC9": {"func": "STM32 ADC 通道9"},
"ADC10": {"func": "STM32 ADC 通道10"},
"ADC11": {"func": "STM32 ADC 通道11"},
"ADC12": {"func": "STM32 ADC 通道12"},
"ADC13": {"func": "STM32 ADC 通道13"},
"ADC14": {"func": "STM32 ADC 通道14"},
"ADC15": {"func": "STM32 ADC 通道15"},
"ADC16": {"func": "STM32 ADC 通道16"},
"ADC17": {"func": "STM32 ADC 通道17"},
"ADC1_GND": {"func": "ADC 通道1 地"},
"ADC2_GND": {"func": "ADC 通道2 地"},
"ADC3_GND": {"func": "ADC 通道3 地"},
"ADC4_GND": {"func": "ADC 通道4 地"},
"ADC5_GND": {"func": "ADC 通道5 地"},
"ADC6_GND": {"func": "ADC 通道6 地"},
"ADC7_GND": {"func": "ADC 通道7 地"},
"ADC8_GND": {"func": "ADC 通道8 地"},
"KEY1": {"func": "按键1", "note": "上拉 3.3V"},
"KEY2": {"func": "按键2", "note": "上拉 3.3V"},
"KEY3": {"func": "按键3", "note": "上拉 3.3V"},
"KEY4": {"func": "按键4", "note": "上拉 3.3V"},
"KEY5": {"func": "按键5", "note": "上拉 3.3V"},
"KEY6": {"func": "按键6", "note": "上拉 3.3V"},
"KEY7": {"func": "按键7", "note": "上拉 3.3V"},
"KEY8": {"func": "按键8", "note": "上拉 3.3V"},
"EXTKI1": {"func": "外部按键输入1", "note": "U5→U18→U17"},
"EXTKI2": {"func": "外部按键输入2", "note": "U5→U18→U17"},
"EXTKI3": {"func": "外部按键输入3", "note": "U5→U18→U17"},
"EXTKO1": {"func": "外部按键输出1", "note": "U17→U18→U5"},
"EXTKO2": {"func": "外部按键输出2", "note": "U17→U18→U5"},
"EXTKO3": {"func": "外部按键输出3", "note": "U17→U18→U5"},
"HT_A23": {"func": "子板信号 HT"},
"HT_A26": {"func": "子板信号 HT"},
"HT_C25": {"func": "子板信号 HT"},
"HT_C26": {"func": "子板信号 HT"},
"HT_C27": {"func": "子板信号 HT"},
"CLZ_LED": {"func": "子板状态 LED(闭锁)"},
"ERT_LED": {"func": "子板状态 LED"},
"TRIP_LED": {"func": "子板状态 LED(跳闸)"},
"RUN_LED": {"func": "子板状态 LED(运行)"},
"RELAY_STO": {"func": "继电器控制", "note": "U17→U18→U5"},
"H16": {"func": "子板信号"},
"V15": {"func": "子板信号"},
"J3": {"func": "子板信号"},
"F3": {"func": "子板信号"},
"K3": {"func": "子板信号"},
"RAS": {"func": "FSMC RAS(子板侧)"},
"DQM0": {"func": "FSMC DQM0(子板侧)"},
"DQM1": {"func": "FSMC DQM1(子板侧)"},
"WAIT1": {"func": "FSMC WAIT(子板侧)"},
"SDCKE": {"func": "FSMC CKE(子板侧)"},
"ST_IN_C3": {"func": "子板输入"},
"ST_IN_D4": {"func": "子板输入"},
"ST_IN_E4": {"func": "子板输入"},
"CF_P": {"func": "CF 通信 P", "note": "U5→U14/CN1"},
"CF_Q": {"func": "CF 通信 Q", "note": "U5→U14/CN1"},
"V_ZL1": {"func": "电压测量1→ADC16"},
"V_ZL2": {"func": "电压测量2→ADC17"},
"R16": {"func": "子板信号"},
"SWCLK": {"func": "SWD 时钟", "note": "U17→H2"},
"SWDIO": {"func": "SWD 数据", "note": "U17↔H2"},
"NRST": {"func": "复位", "note": "U17/U1,经 R40/SW1"},
"LED1": {"func": "板级 LED1", "gpio": "PC4", "note": "低有效;顺序按 AGENTS.md 待核"},
"LED2": {"func": "板级 LED2", "gpio": "PC5", "note": "低有效"},
"LED3": {"func": "板级 LED3", "gpio": "PB1", "note": "低有效"},
"LED4": {"func": "板级 LED4", "gpio": "PB2", "note": "低有效"},
"LED5": {"func": "板级 LED5", "gpio": "PF11", "note": "低有效"},
"LED6": {"func": "板级 LED6", "gpio": "PF12", "note": "低有效"},
"PBLED": {"func": "PHY 活动 LED", "note": "U2→R2→LED"},
"DIS_EEE": {"func": "显示/EEE 指示", "note": "U2→R6→LED1"},
"INT": {"func": "CH395F 中断", "note": "U1→U17"},
"RX_P": {"func": "MDI 差分(U2↔T1)"},
"RX_N": {"func": "MDI 差分(U2↔T1)"},
"TX_P": {"func": "MDI 差分(U2↔T1)"},
"TX_N": {"func": "MDI 差分(U2↔T1)"},
"RXA_P": {"func": "端口A MDI(U2↔J1)"},
"RXA_N": {"func": "端口A MDI(U2↔J1)"},
"TXA_P": {"func": "端口A MDI(U2↔J1)"},
"TXA_N": {"func": "端口A MDI(U2↔J1)"},
"RXB_P": {"func": "端口B MDI(U2↔J2)"},
"RXB_N": {"func": "端口B MDI(U2↔J2)"},
"TXB_P": {"func": "端口B MDI(U2↔J2)"},
"TXB_N": {"func": "端口B MDI(U2↔J2)"},
},
}
if __name__ == "__main__":
out = os.path.join(os.path.dirname(os.path.abspath(__file__)), "pinout_kb.json")
with open(out, "w", encoding="utf-8", newline="\n") as f:
json.dump(KB, f, ensure_ascii=False, indent=1)
f.write("\n")
print("written: %s (instances=%d, nets=%d)" % (
out, len(KB["instances"]), len(KB["nets"])))
+418
View File
@@ -0,0 +1,418 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
r"""netlist_sem.py - KiCad Pcbnew 导出网表 (.tel) 语义化工具
将精简导出网表($PACKAGES/$NETS,无料号、无引脚功能名)结合引脚知识库
(pinout_kb.json) 与规则引擎,生成紧凑的结构化语义图(Markdown),
供 LLM / 工程师快速理解板级连接。
用法(仓库根目录,统一 venv 解释器):
& '.venv\Scripts\python.exe' tools/netlist_semantics/netlist_sem.py dump-pins docs/硬件平台/V0.0.tel
& '.venv\Scripts\python.exe' tools/netlist_semantics/netlist_sem.py semantic docs/硬件平台/V0.0.tel -o docs/硬件平台/V0.0_网表语义图.md
纯标准库实现,无第三方依赖。
"""
import argparse
import json
import os
import re
import sys
from collections import OrderedDict, defaultdict
# ---------------------------------------------------------------- 解析
REF_RE = re.compile(r'^[A-Z]{1,4}\d+$')
def _group_entries(lines, is_start=None):
"""按条目分组。is_start(ln) 判断是否新条目起始行;缺省:非空白起始行=新条目。"""
if is_start is None:
def is_start(ln):
return ln[0] not in ' \t'
entries = []
cur = []
for ln in lines:
if ln.strip() == '':
continue
if is_start(ln):
if cur:
entries.append('\n'.join(cur))
cur = [ln]
else:
if not cur:
cur = [ln.strip()]
else:
cur.append(ln.strip())
if cur:
entries.append('\n'.join(cur))
return entries
def _tokens_after(text, sep=';'):
head, _, tail = text.partition(sep)
tail = tail.replace(',', ' ')
return head.strip(), [t for t in tail.split() if t]
def _parse_package(entry):
"""解析单个 PACKAGE 条目,返回 (fp, value, [refs])。
兼容两种行格式:
单行: FP ! FP ! '{Value}' ; REF1 REF2 ...
多行: FP ! FP ! '{Value}' , 然后续行列 REF
字段(封装/值)取首行按 ! 分割;refs 取首行 ';' 之后 + 所有续行。
"""
lines = entry.split('\n')
first = lines[0].strip()
head = first.split(';', 1)[0] if ';' in first else first
fields = [x.strip() for x in head.split('!')]
fp = fields[0] if fields else ''
value = fields[2].strip().rstrip(',') if len(fields) > 2 else ''
refpart = first.split(';', 1)[1] if ';' in first else ''
if len(lines) > 1:
refpart = (refpart + '\n' if refpart else '') + '\n'.join(lines[1:])
toks = re.split(r'[\s,]+', refpart.replace(',', ' '))
refs = [t for t in toks if t and REF_RE.match(t)]
return fp, value, refs
def parse_netlist(path):
"""解析 .tel。返回 (packages, nets)
packages: {ref: {'fp': 封装, 'value': 值}}
nets: {net: [(ref, pin), ...]}
"""
with open(path, encoding='utf-8', errors='replace') as f:
text = f.read()
sections = {}
name, buf = None, []
for ln in text.splitlines():
if ln.startswith('$'):
if name:
sections[name] = buf
name = ln.strip().lstrip('$')
buf = []
elif name:
buf.append(ln)
if name:
sections[name] = buf
packages = {}
for entry in _group_entries(sections.get('PACKAGES', []),
lambda ln: ' ! ' in ln):
fp, value, refs = _parse_package(entry)
if not fp:
continue
for r in refs:
packages[r] = {'fp': fp, 'value': value}
nets = {}
for entry in _group_entries(sections.get('NETS', [])):
head, toks = _tokens_after(entry)
name = head.strip().strip("'\"")
if not name:
continue
pins = []
for t in toks:
ref, _, pin = t.rpartition('.')
if REF_RE.match(ref) and pin:
pins.append((ref, pin))
if pins:
nets[name] = pins
return packages, nets
def build_pin_index(packages, nets):
"""pin_index[ref][pin] = [net, ...];unused_refs = 有封装无网络的位号"""
pin_index = defaultdict(lambda: defaultdict(list))
seen_refs = set()
for net, pins in nets.items():
for ref, pin in pins:
pin_index[ref][pin].append(net)
seen_refs.add(ref)
for ref in list(pin_index):
if ref not in packages:
pass # 网络中出现但 PACKAGES 缺失(如被 DNP 隐藏),仍保留
unused = [r for r in packages if r not in seen_refs]
return pin_index, sorted(unused)
# ---------------------------------------------------------------- 知识库
def load_kb(path):
"""返回 (instances, nets)
instances: {ref: {mpn, pkg, desc}}
nets: {net: {func, gpio, note}}
说明:本工程 KiCad 符号引脚号为任意编号(非数据手册脚号,如 U17.133=PB3),
故语义标注落在【网络名】与【位号】两级,不做引脚级断言。
"""
with open(path, encoding='utf-8') as f:
kb = json.load(f)
return kb.get('instances', {}), kb.get('nets', {})
# ---------------------------------------------------------------- 分类规则
GROUND_NETS = {'GND', 'AGND', 'PGND', 'CGND'}
RAIL_NETS = {'3.3V', '5V', 'C3.3V', 'G3.3V', 'AVCC', 'AVDDL', 'STM_VDDA', 'VDD50'}
CLOCK_NETS = {'XI', 'XO', 'RXI', 'RXO', 'CLOCK'}
def classify_net(name, pins=None, pin_index=None):
"""返回 (类别, 说明)。类别: GND / POWER / CLOCK / SIGNAL
串行时钟 (SCK/SCL/SCLK) 归 SIGNAL(接口信号),仅系统/晶振时钟归 CLOCK。"""
if name in GROUND_NETS or name.endswith('_GND'):
return 'GND', '地'
if name in RAIL_NETS or re.fullmatch(r'\d+\.\d+V', name) or name.startswith('VDD'):
return 'POWER', '电源轨'
if name in CLOCK_NETS:
return 'CLOCK', '时钟'
return 'SIGNAL', '信号'
# 接口分组规则:按网名匹配(顺序敏感,先匹配先归组)
INTERFACE_RULES = [
('以太网 MDI', 'U2 RTL8305 双口 MDI → T1 网络变压器 + J1/J2 RJ45(端口A/B);U1 CH395F 侧为无名网',
lambda n: n in ('RX_P', 'RX_N', 'TX_P', 'TX_N') or
re.fullmatch(r'RX[AB]_[PN]|TX[AB]_[PN]', n) is not None),
('SPI-NAND (SPI1)', 'U17 SPI1 → U18 74LVC16245 → U19 GD5F2GQ5UE NAND(双向缓冲)',
lambda n: n.startswith('GD_') or n in ('SPI1_SOMI', 'SPI1_SIMO')),
('SPI-ETH (SPI2)', 'U17 SPI2 → U1 CH395F(SPI 以太网)',
lambda n: n.startswith('CH395F_')),
('I2C-时钟', 'U17 I2C → U16 SD2506 时钟/RTC 芯片',
lambda n: n in ('SD_SDA', 'SD_SCL')),
('UART-ST', 'U17 USART → U9/U10/U11 隔离器 → RS232/RS485 通道',
lambda n: re.fullmatch(r'ST_(TX|RX)\d', n) is not None or n == 'ST_DIR4'),
('RS-485', 'U11 信号隔离 + U8 光耦(DIR) → U15 TP8485E → U12 ESD → CN1 485 总线',
lambda n: n in ('RS485_A', 'RS485_B', 'TX4', 'RX4', 'DIR4')),
('RS-232', 'U9/U10 隔离 → U13 双通道 232 收发器 → RS232 总线(CN1 / U14)',
lambda n: re.fullmatch(r'RS232_(TX|RX)\d', n) is not None or
re.fullmatch(r'[TR]X\d', n) is not None),
('LCD 8080 并口', 'U17 FSMC → H1 16P 排针 → 板外 LCD(16bit 8080 并口)',
lambda n: n.startswith('LCD_')),
('ADC 并口', 'U17 FSMC 读 ↔ U3 TPAFE5160(16bit + 控制线)',
lambda n: n.startswith('TP_') or re.fullmatch(r'DB\d+', n) is not None),
('ADC 输入', 'U3 TPAFE5160 8 通道输入(经 R 分压/保护至 AIN)',
lambda n: n.startswith('AIN') or n.startswith('ADC')),
('按键', 'U17 GPIO 按键(上拉 3.3V,低有效)',
lambda n: re.fullmatch(r'KEY\d+', n) is not None),
('子板接口 (U18)', 'U17 ↔ U18 74LVC16245 ↔ U5 WINGTAT 子板(继电器/告警/状态/外键)',
lambda n: n.startswith('EXTK') or n.startswith('HT_') or n.startswith('ST_IN_') or
n.endswith('_LED') or n in ('RELAY_STO', 'H16', 'V15', 'J3', 'F3', 'K3', 'RAS',
'DQM0', 'DQM1', 'WAIT1', 'SDCKE', 'CF_P', 'CF_Q',
'V_ZL1', 'V_ZL2', 'R16')),
('SWD/JTAG 调试', 'U17 调试口 → H2 3P 排针(SWCLK/SWDIO/GND)',
lambda n: n in ('SWCLK', 'SWDIO', 'NRST')),
('状态指示', '板级 LED / PHY 中断 / 显示控制',
lambda n: re.fullmatch(r'LED\d+', n) is not None or
n in ('PBLED', 'DIS_EEE', 'INT')),
]
def group_interfaces(signals):
groups = OrderedDict()
ungrouped = []
for net in signals:
placed = False
for gname, gdesc, pat in INTERFACE_RULES:
if pat(net):
groups.setdefault(gname, {'desc': gdesc, 'nets': []})['nets'].append(net)
placed = True
break
if not placed:
ungrouped.append(net)
return groups, ungrouped
# ---------------------------------------------------------------- 输出
def render_semantic(packages, nets, pin_index, instances, nets_kb):
L = []
ap = L.append
def net_ann(net):
"""网络语义注释(来自知识库 nets 表);无名网($..)返回空。"""
if net.startswith('$'):
return ''
ann = nets_kb.get(net)
if not ann:
return ''
bits = []
if ann.get('func'):
bits.append(ann['func'])
if ann.get('gpio'):
bits.append(ann['gpio'])
if ann.get('note'):
bits.append(ann['note'])
return ' '.join(bits)
ics = sorted((r for r in pin_index if r.startswith('U')),
key=lambda r: int(re.sub(r'\D', '', r) or 0))
oths = sorted((r for r in pin_index if not r.startswith('U')))
ap('# V0.0 网表语义图(自动生成)')
ap('')
ap('> 由 `tools/netlist_semantics/netlist_sem.py` 从 `V0.0.tel` + `pinout_kb.json` 生成。')
ap('> 网表仅含位号/引脚号/网名;MPN 与信号语义由知识库补全。')
ap('> 注意:KiCad 符号引脚号为任意编号(非数据手册脚号,如 U17.133=PB3),引脚功能以【网名+知识库】为准。')
ap('')
ap('## 1. 概览')
ap('')
ap(f'- 元件位号: {len(packages)} 组 / 网络: {len(nets)} 条')
n_gnd = sum(1 for n in nets if n in GROUND_NETS or n.endswith('_GND'))
n_rail = sum(1 for n in nets if n in RAIL_NETS)
n_unnamed = sum(1 for n in nets if n.startswith('$'))
ap(f'- 地网络: {n_gnd} / 电源轨: {n_rail} / 未命名(内部)网: {n_unnamed}')
ap('')
# --- 电源域
ap('## 2. 电源与地')
ap('')
ap('| 网络 | 类别 | 连接引脚数 | 主要去向 |')
ap('|---|---|---|---|')
for net in sorted(nets, key=lambda n: (n not in RAIL_NETS, n not in GROUND_NETS, n)):
cat, _ = classify_net(net, nets[net], pin_index)
if cat not in ('GND', 'POWER'):
continue
pins = nets[net]
ics_hit = sorted(set(r for r, _ in pins if r.startswith('U')))
others = sorted(set(r for r, _ in pins if not r.startswith('U')))
dest = ', '.join(ics_hit[:4] + (['…'] if len(ics_hit) > 4 else []))
if others:
dest += f" / {len(others)}×被动件"
ap(f'| {net} | {cat} | {len(pins)} | {dest} |')
ap('')
# --- 接口
groups, ungrouped = group_interfaces(
[n for n in nets if not n.startswith('$') and
classify_net(n, nets[n], pin_index)[0] == 'SIGNAL'])
ap('## 3. 接口与总线')
ap('')
for gname, g in groups.items():
ap(f'### {gname}')
ap('')
ap(f'{g["desc"]}')
ap('')
ap('| 网络 | 语义(知识库) | 连接 |')
ap('|---|---|---|')
for net in g['nets']:
pins = nets[net]
desc = ', '.join(f'{r}.{p}' for r, p in pins[:8]) + (' …' if len(pins) > 8 else '')
ap(f'| {net} | {net_ann(net) or "—"} | {desc} |')
ap('')
if ungrouped:
ap('### 未归类信号')
ap('')
ap(', '.join(ungrouped))
ap('')
# --- 芯片引脚
ap('## 4. 芯片引脚')
ap('')
for ref in ics:
info = instances.get(ref, {})
mpn = info.get('mpn', '?')
desc = info.get('desc', '')
fp = packages.get(ref, {}).get('fp', '?')
pins = pin_index[ref]
ap(f'### {ref} — {mpn}')
ap('')
if desc:
ap(f'{desc}')
ap('')
ap(f'封装: `{fp}`({len(pins)} 脚入网)')
ap('')
ap('| Pin | 网络 | 语义(知识库) |')
ap('|---|---|---|')
def _key(kv):
p = kv[0]
m = re.fullmatch(r'(\d+)', p)
return (0, int(m.group(1))) if m else (1, p)
for pin, nets_h in sorted(pins.items(), key=_key):
uniq = sorted(set(nets_h))
ann = ';'.join(a for a in (net_ann(n) for n in uniq) if a) or '—'
ap(f'| {pin} | {", ".join(uniq)} | {ann} |')
ap('')
# --- 其余器件
ap('## 5. 连接件/晶振/变压器/无源/分立')
ap('')
ap('| 位号 | 器件(知识库 MPN) | 引脚→网络 |')
ap('|---|---|---|')
for ref in oths:
info = instances.get(ref, {})
mpn = info.get('mpn', '')
fp = packages.get(ref, {}).get('fp', '?')
what = f'{mpn}({fp})' if mpn else fp
pins = pin_index[ref]
desc = '; '.join(f'{p}→{", ".join(sorted(set(ns)))}'
for p, ns in sorted(pins.items(), key=lambda kv: kv[0]))
ap(f'| {ref} | {what} | {desc} |')
ap('')
return '\n'.join(L) + '\n'
def dump_pins(packages, nets):
pin_index, unused = build_pin_index(packages, nets)
print(f'== PACKAGES: {len(packages)} refs; NETS: {len(nets)} ==')
print(f'== refs in packages but on no net: {unused} ==')
ics = sorted((r for r in pin_index if r.startswith('U')),
key=lambda r: int(re.sub(r'\D', '', r) or 0))
oths = sorted(r for r in pin_index if not r.startswith('U'))
for ref in ics + oths:
fp = packages.get(ref, {}).get('fp', '?')
pins = pin_index[ref]
print(f'\n### {ref} [{fp}] ({len(pins)} pins)')
def _key(kv):
p = kv[0]
m = re.fullmatch(r'(\d+)', p)
return (0, int(m.group(1))) if m else (1, p)
for pin, nets_h in sorted(pins.items(), key=_key):
print(f' {pin:>4} {", ".join(sorted(set(nets_h)))}')
# ---------------------------------------------------------------- main
def main():
here = os.path.dirname(os.path.abspath(__file__))
ap = argparse.ArgumentParser(
description='KiCad Pcbnew .tel 网表语义化(解析 + 引脚知识库 + 规则引擎)')
sub = ap.add_subparsers(dest='cmd', required=True)
p1 = sub.add_parser('dump-pins', help='按位号列出 引脚→网络(用于编制知识库)')
p1.add_argument('netlist')
p2 = sub.add_parser('semantic', help='生成语义图 Markdown')
p2.add_argument('netlist')
p2.add_argument('-o', '--out', default=None,
help='输出文件(缺省打印到 stdout)')
p2.add_argument('--kb', default=os.path.join(here, 'pinout_kb.json'))
a = ap.parse_args()
packages, nets = parse_netlist(a.netlist)
if a.cmd == 'dump-pins':
dump_pins(packages, nets)
else:
pin_index, unused = build_pin_index(packages, nets)
instances, nets_kb = load_kb(a.kb)
doc = render_semantic(packages, nets, pin_index, instances, nets_kb)
if a.out:
with open(a.out, 'w', encoding='utf-8', newline='\n') as f:
f.write(doc)
print(f'written: {a.out} ({len(doc)} chars)')
else:
sys.stdout.write(doc)
print(f'[stats] packages={len(packages)} nets={len(nets)} '
f'kb_instances={len(instances)} kb_nets={len(nets_kb)} unused={unused}',
file=sys.stderr)
if __name__ == '__main__':
main()
+942
View File
@@ -0,0 +1,942 @@
{
"_comment": "V0.0 网表知识库:instances=位号→器件, nets=网络→语义。引脚功能以【网名+本表】为准(KiCad 符号脚号为任意编号,非手册脚号)。",
"instances": {
"U1": {
"mpn": "CH395F",
"pkg": "QFN-32",
"desc": "SPI 以太网控制器 (MAC+PHY);SPI2↔U17,MDI→T1"
},
"U2": {
"mpn": "RTL8305NBI-CG",
"pkg": "QFN-48",
"desc": "双口 10/100 以太网交换/PHY;驱动 J1/J2,经 T1 接 U1"
},
"U3": {
"mpn": "TPAFE5160",
"pkg": "LQFP-64",
"desc": "16 通道 16-bit ADC;8080/FSMC 并口↔U17"
},
"U4": {
"mpn": "B0303S",
"pkg": "PWRM-TH",
"desc": "3.3V→3.3V 隔离 DC-DC(通信域 C3.3V);实际 B0303S,封装误标 B0505S-1WR3(A2,V0.1 更正)"
},
"U5": {
"mpn": "WINGTAT 9001-15481C00A",
"pkg": "CONN-TH 48P",
"desc": "48P 子板插座(继电器/告警/ADC/串口/时钟)"
},
"U6": {
"mpn": "LDO (SOT-223)",
"pkg": "SOT-223-4",
"desc": "5V→G3.3V LDO(通信 3.3V 域)"
},
"U7": {
"mpn": "LDO (SOT-223)",
"pkg": "SOT-223-4",
"desc": "5V→3.3V LDO(主 3.3V 域)"
},
"U8": {
"mpn": "FOC-817SC-F",
"pkg": "SMD-4",
"desc": "光耦;隔离 ST_DIR4→DIR4(485 方向控制)"
},
"U9": {
"mpn": "CA-IS3722HS",
"pkg": "SOIC-8",
"desc": "双通道数字隔离器;隔离 ST_UART1 → 232 ch1"
},
"U10": {
"mpn": "CA-IS3722HS",
"pkg": "SOIC-8",
"desc": "双通道数字隔离器;隔离 ST_UART3 → 232 ch3"
},
"U11": {
"mpn": "CA-IS3722HS",
"pkg": "SOIC-8",
"desc": "双通道数字隔离器;隔离 ST_UART4 → RS485"
},
"U12": {
"mpn": "SuperESD (CDSOT23)",
"pkg": "SOT-23-3",
"desc": "ESD 保护;RS485 A/B 线"
},
"U13": {
"mpn": "TPT3232E",
"pkg": "SOP-16",
"desc": "双路 RS232 电平转换收发器(驱动 RS232_TX1/RX1/TX3/RX3 → CN1/U14)"
},
"U14": {
"mpn": "C2836689",
"pkg": "RJ45-TH",
"desc": "RJ45 座(232/CLOCK/CF 通信口,非以太网)"
},
"U15": {
"mpn": "TP8485E-SR",
"pkg": "SOIC-8",
"desc": "RS-485 收发器"
},
"U16": {
"mpn": "SD2506API-G",
"pkg": "DIP-6",
"desc": "时钟/RTC 芯片(I2C: SD_SDA/SD_SCL)"
},
"U17": {
"mpn": "STM32F407ZGT6",
"pkg": "LQFP-144",
"desc": "主 MCU (Cortex-M4 @168MHz)"
},
"U18": {
"mpn": "AIP74LVC16245TA48",
"pkg": "TSSOP-48",
"desc": "16 位总线收发器(U17 ↔ 子板 U5)"
},
"U19": {
"mpn": "GD5F2GQ5UE",
"pkg": "WSON-8",
"desc": "2Gbit SPI NAND Flash"
},
"U20": {
"mpn": "钽电容",
"pkg": "CAP-TH",
"desc": "电源滤波 (GND/PGND)"
},
"U21": {
"mpn": "钽电容",
"pkg": "CAP-TH",
"desc": "电源滤波 (GND/PGND)"
},
"U22": {
"mpn": "钽电容",
"pkg": "CAP-TH",
"desc": "电源滤波 (CGND/PGND)"
},
"J1": {
"mpn": "HR911105A",
"pkg": "RJ45-TH",
"desc": "RJ45+网络变压器一体(端口 A)"
},
"J2": {
"mpn": "HR911105A",
"pkg": "RJ45-TH",
"desc": "RJ45+网络变压器一体(端口 B)"
},
"H1": {
"mpn": "16P 排针",
"pkg": "HDR-TH",
"desc": "LCD 8080 并口(板外屏)"
},
"H2": {
"mpn": "3P 排针",
"pkg": "HDR-TH",
"desc": "SWD 调试(SWDIO/SWCLK/GND)"
},
"CN1": {
"mpn": "JL15 端子",
"pkg": "CONN-TH",
"desc": "通信端子(RS485 A/B + RS232 1/3)"
},
"X1": {
"mpn": "晶振",
"pkg": "CRYSTAL-4P",
"desc": "→ U2 RTL8305 (RXI/RXO)"
},
"X2": {
"mpn": "晶振",
"pkg": "CRYSTAL-4P",
"desc": "→ U1 CH395F (XI/XO)"
},
"X3": {
"mpn": "晶振",
"pkg": "CRYSTAL-4P",
"desc": "→ U17 pin23/24(网未命名,推测 HSE 8MHz)"
},
"T1": {
"mpn": "H1102NLT",
"pkg": "XFMR-SMD",
"desc": "网络变压器(U1 CH395F ↔ U2 RTL8305)"
},
"L1": {
"mpn": "磁珠/电感",
"pkg": "L0603",
"desc": "5V→AVCC 滤波"
},
"L2": {
"mpn": "磁珠/电感",
"pkg": "L0603",
"desc": "AGND↔GND 连接"
},
"L3": {
"mpn": "磁珠/电感",
"pkg": "L1206",
"desc": "VDD50↔5V"
},
"L4": {
"mpn": "磁珠/电感",
"pkg": "L1206",
"desc": "G3.3V 滤波"
},
"L6": {
"mpn": "磁珠/电感",
"pkg": "L0603",
"desc": "3.3V→STM_VDDA 滤波"
},
"D1": {
"mpn": "肖特基/钳位二极管",
"pkg": "SMB",
"desc": "G3.3V 保护"
},
"D2": {
"mpn": "肖特基/钳位二极管",
"pkg": "SMB",
"desc": "3.3V 保护"
},
"D3": {
"mpn": "ESD 二极管",
"pkg": "SMB",
"desc": "RS232_RX3 保护"
},
"D4": {
"mpn": "ESD 二极管",
"pkg": "SMB",
"desc": "RS232_TX3 保护"
},
"D5": {
"mpn": "ESD 二极管",
"pkg": "SMB",
"desc": "RS232_TX1 保护"
},
"D6": {
"mpn": "ESD 二极管",
"pkg": "SMB",
"desc": "RS232_RX1 保护"
},
"Q1": {
"mpn": "MOSFET/三极管",
"pkg": "SOT-23",
"desc": "LED 驱动"
}
},
"nets": {
"GND": {
"func": "主数字地"
},
"AGND": {
"func": "模拟地(ADC/模拟域)"
},
"PGND": {
"func": "电源/网络地(RJ45 屏蔽)"
},
"CGND": {
"func": "通信地(隔离侧)"
},
"3.3V": {
"func": "3.3V 主电源"
},
"5V": {
"func": "5V 电源(输入)"
},
"C3.3V": {
"func": "3.3V(通信/隔离侧)"
},
"G3.3V": {
"func": "3.3V(U6 LDO 输出,通信域)"
},
"AVCC": {
"func": "模拟 3.3V(ADC 供电,经 L1)"
},
"AVDDL": {
"func": "PHY 电源(U2 RTL8305)"
},
"STM_VDDA": {
"func": "STM32 模拟电源 VDDA(经 L6)"
},
"VDD50": {
"func": "5V(子板/USB 域,经 L3)"
},
"XI": {
"func": "晶振输入",
"note": "X2→U1 CH395F"
},
"XO": {
"func": "晶振输出",
"note": "X2→U1 CH395F"
},
"RXI": {
"func": "晶振输入",
"note": "X1→U2 RTL8305"
},
"RXO": {
"func": "晶振输出",
"note": "X1→U2 RTL8305"
},
"CLOCK": {
"func": "时钟(子板/232)",
"note": "→U5 C8 / U14 pin7"
},
"HRST": {
"func": "ADC 复位",
"note": "U3 reset,经 R16/C31"
},
"GD_SCLK": {
"func": "SPI1_SCK",
"gpio": "PB3",
"note": "→U19 SCK"
},
"GD_SO": {
"func": "SPI1_MISO",
"gpio": "PB4",
"note": "U19 SO←"
},
"GD_SI": {
"func": "SPI1_MOSI",
"gpio": "PB5",
"note": "→U19 SI"
},
"GD_CS": {
"func": "SPI1_NSS",
"gpio": "PE0",
"note": "→U19 CS"
},
"GD_HOLD": {
"func": "HOLD",
"gpio": "PE1",
"note": "→U19 HOLD"
},
"GD_WP": {
"func": "写保护",
"gpio": "PB8",
"note": "→U19 WP"
},
"SPI1_SOMI": {
"func": "SPI1 MOSI(子板侧)",
"note": "经 U18 16245→子板;GPIO 待核"
},
"SPI1_SIMO": {
"func": "SPI1 MISO(子板侧)",
"note": "经 U18 16245←子板;GPIO 待核"
},
"CH395F_SCS": {
"func": "SPI2_NSS",
"gpio": "PB12"
},
"CH395F_SCK": {
"func": "SPI2_SCK",
"gpio": "PB13"
},
"CH395F_SDO": {
"func": "SPI2_MISO",
"gpio": "PB14"
},
"CH395F_SDI": {
"func": "SPI2_MOSI",
"gpio": "PB15"
},
"SD_SDA": {
"func": "I2C SDA",
"note": "→U16 SD2506"
},
"SD_SCL": {
"func": "I2C SCL",
"note": "→U16 SD2506"
},
"ST_TX0": {
"func": "USART ch0 TX",
"note": "→子板 (U5 A10)"
},
"ST_RX0": {
"func": "USART ch0 RX",
"note": "←子板 (U5 B10)"
},
"ST_TX1": {
"func": "USART ch1 TX",
"note": "→U9 隔离→232 ch1"
},
"ST_RX1": {
"func": "USART ch1 RX",
"note": "←U9 隔离←232 ch1"
},
"ST_TX2": {
"func": "USART ch2 TX",
"note": "→子板 (U5 C7)"
},
"ST_RX2": {
"func": "USART ch2 RX",
"note": "←子板 (U5 C6)"
},
"ST_TX3": {
"func": "USART ch3 TX",
"note": "→U10 隔离→232 ch3"
},
"ST_RX3": {
"func": "USART ch3 RX",
"note": "←U10 隔离←232 ch3"
},
"ST_TX4": {
"func": "UART5_TX(485)",
"gpio": "PC12",
"note": "→U11 隔离"
},
"ST_RX4": {
"func": "UART5_RX(485)",
"gpio": "PD2",
"note": "←U11 隔离"
},
"ST_DIR4": {
"func": "485 方向 DE",
"gpio": "PD0",
"note": "→U8 光耦"
},
"TX4": {
"func": "485 TX(隔离后)",
"note": "U11→U15"
},
"RX4": {
"func": "485 RX(隔离后)",
"note": "U15→U11"
},
"DIR4": {
"func": "485 方向(隔离后)",
"note": "U8→U15"
},
"RS485_A": {
"func": "485 A 线",
"note": "U15→U12 ESD→CN1"
},
"RS485_B": {
"func": "485 B 线",
"note": "U15→U12 ESD→CN1"
},
"TX1": {
"func": "232 ch1 TX(隔离后)",
"note": "U9→U13"
},
"RX1": {
"func": "232 ch1 RX(隔离后)",
"note": "U13→U9"
},
"TX3": {
"func": "232 ch3 TX(隔离后)",
"note": "U10→U13"
},
"RX3": {
"func": "232 ch3 RX(隔离后)",
"note": "U13→U10"
},
"RS232_TX1": {
"func": "232 ch1 总线",
"note": "U13→CN1/U14"
},
"RS232_RX1": {
"func": "232 ch1 总线",
"note": "CN1/U14→U13"
},
"RS232_TX3": {
"func": "232 ch3 总线",
"note": "U13→CN1/U14"
},
"RS232_RX3": {
"func": "232 ch3 总线",
"note": "CN1/U14→U13"
},
"LCD_DB0": {
"func": "8080 数据 D0",
"note": "U17 FSMC→H1"
},
"LCD_DB1": {
"func": "8080 数据 D1",
"note": "U17 FSMC→H1"
},
"LCD_DB2": {
"func": "8080 数据 D2",
"note": "U17 FSMC→H1"
},
"LCD_DB3": {
"func": "8080 数据 D3",
"note": "U17 FSMC→H1"
},
"LCD_DB4": {
"func": "8080 数据 D4",
"note": "U17 FSMC→H1"
},
"LCD_DB5": {
"func": "8080 数据 D5",
"note": "U17 FSMC→H1"
},
"LCD_DB6": {
"func": "8080 数据 D6",
"note": "U17 FSMC→H1"
},
"LCD_DB7": {
"func": "8080 数据 D7",
"note": "U17 FSMC→H1"
},
"LCD_CS": {
"func": "片选",
"note": "U17→H1"
},
"LCD_CD": {
"func": "数据/命令 (ALE)",
"note": "U17→H1"
},
"LCD_RD": {
"func": "读",
"note": "U17→H1"
},
"LCD_WR": {
"func": "写",
"note": "U17→H1"
},
"LCD_RST": {
"func": "复位",
"note": "U17→H1"
},
"LCD_BK": {
"func": "背光",
"note": "U17→H1"
},
"TP_RD": {
"func": "读控制 (FSMC)",
"gpio": "PD3"
},
"TP_CONVST": {
"func": "转换启动",
"gpio": "PD4"
},
"TP_BUSY": {
"func": "忙",
"gpio": "PD7"
},
"TP_OS0": {
"func": "输出选择 OS0"
},
"TP_OS1": {
"func": "输出选择 OS1"
},
"TP_OS2": {
"func": "输出选择 OS2"
},
"TP_FRSTDATA": {
"func": "首数据",
"note": "经 R24"
},
"DB0": {
"func": "FSMC 数据 D0",
"gpio": "PG0",
"note": "U17↔U3"
},
"DB1": {
"func": "FSMC 数据 D1",
"gpio": "PG1"
},
"DB2": {
"func": "FSMC 数据 D2",
"gpio": "PG2"
},
"DB3": {
"func": "FSMC 数据 D3",
"gpio": "PG3"
},
"DB4": {
"func": "FSMC 数据 D4",
"gpio": "PG4"
},
"DB5": {
"func": "FSMC 数据 D5",
"gpio": "PG5"
},
"DB6": {
"func": "FSMC 数据 D6",
"gpio": "PG6"
},
"DB7": {
"func": "FSMC 数据 D7",
"gpio": "PG7"
},
"DB8": {
"func": "FSMC 数据 D8",
"gpio": "PG8"
},
"DB9": {
"func": "FSMC 数据 D9",
"gpio": "PG9"
},
"DB10": {
"func": "FSMC 数据 D10",
"gpio": "PG10"
},
"DB11": {
"func": "FSMC 数据 D11",
"gpio": "PG11"
},
"DB12": {
"func": "FSMC 数据 D12",
"gpio": "PG12"
},
"DB13": {
"func": "FSMC 数据 D13",
"gpio": "PG13"
},
"DB14": {
"func": "FSMC 数据 D14",
"gpio": "PG14"
},
"DB15": {
"func": "FSMC 数据 D15",
"gpio": "PG15"
},
"AIN1": {
"func": "子板模拟输入→ADC1"
},
"AIN2": {
"func": "子板模拟输入→ADC2"
},
"AIN3": {
"func": "子板模拟输入→ADC3"
},
"AIN4": {
"func": "子板模拟输入→ADC4"
},
"AIN5": {
"func": "子板模拟输入→ADC5"
},
"AIN6": {
"func": "子板模拟输入→ADC6"
},
"AIN7": {
"func": "子板模拟输入→ADC7"
},
"AIN8": {
"func": "子板模拟输入→ADC8"
},
"AIN9": {
"func": "子板模拟输入→ADC9"
},
"AIN10": {
"func": "子板模拟输入→ADC10"
},
"AIN11": {
"func": "子板模拟输入→ADC11"
},
"AIN12": {
"func": "子板模拟输入→ADC12"
},
"AIN13": {
"func": "子板模拟输入→ADC13"
},
"AIN14": {
"func": "子板模拟输入→ADC14"
},
"AIN15": {
"func": "子板模拟输入→ADC15"
},
"ADC1": {
"func": "TPAFE5160 通道1"
},
"ADC2": {
"func": "TPAFE5160 通道2"
},
"ADC3": {
"func": "TPAFE5160 通道3"
},
"ADC4": {
"func": "TPAFE5160 通道4"
},
"ADC5": {
"func": "TPAFE5160 通道5"
},
"ADC6": {
"func": "TPAFE5160 通道6"
},
"ADC7": {
"func": "TPAFE5160 通道7"
},
"ADC8": {
"func": "TPAFE5160 通道8"
},
"ADC9": {
"func": "STM32 ADC 通道9"
},
"ADC10": {
"func": "STM32 ADC 通道10"
},
"ADC11": {
"func": "STM32 ADC 通道11"
},
"ADC12": {
"func": "STM32 ADC 通道12"
},
"ADC13": {
"func": "STM32 ADC 通道13"
},
"ADC14": {
"func": "STM32 ADC 通道14"
},
"ADC15": {
"func": "STM32 ADC 通道15"
},
"ADC16": {
"func": "STM32 ADC 通道16"
},
"ADC17": {
"func": "STM32 ADC 通道17"
},
"ADC1_GND": {
"func": "ADC 通道1 地"
},
"ADC2_GND": {
"func": "ADC 通道2 地"
},
"ADC3_GND": {
"func": "ADC 通道3 地"
},
"ADC4_GND": {
"func": "ADC 通道4 地"
},
"ADC5_GND": {
"func": "ADC 通道5 地"
},
"ADC6_GND": {
"func": "ADC 通道6 地"
},
"ADC7_GND": {
"func": "ADC 通道7 地"
},
"ADC8_GND": {
"func": "ADC 通道8 地"
},
"KEY1": {
"func": "按键1",
"note": "上拉 3.3V"
},
"KEY2": {
"func": "按键2",
"note": "上拉 3.3V"
},
"KEY3": {
"func": "按键3",
"note": "上拉 3.3V"
},
"KEY4": {
"func": "按键4",
"note": "上拉 3.3V"
},
"KEY5": {
"func": "按键5",
"note": "上拉 3.3V"
},
"KEY6": {
"func": "按键6",
"note": "上拉 3.3V"
},
"KEY7": {
"func": "按键7",
"note": "上拉 3.3V"
},
"KEY8": {
"func": "按键8",
"note": "上拉 3.3V"
},
"EXTKI1": {
"func": "外部按键输入1",
"note": "U5→U18→U17"
},
"EXTKI2": {
"func": "外部按键输入2",
"note": "U5→U18→U17"
},
"EXTKI3": {
"func": "外部按键输入3",
"note": "U5→U18→U17"
},
"EXTKO1": {
"func": "外部按键输出1",
"note": "U17→U18→U5"
},
"EXTKO2": {
"func": "外部按键输出2",
"note": "U17→U18→U5"
},
"EXTKO3": {
"func": "外部按键输出3",
"note": "U17→U18→U5"
},
"HT_A23": {
"func": "子板信号 HT"
},
"HT_A26": {
"func": "子板信号 HT"
},
"HT_C25": {
"func": "子板信号 HT"
},
"HT_C26": {
"func": "子板信号 HT"
},
"HT_C27": {
"func": "子板信号 HT"
},
"CLZ_LED": {
"func": "子板状态 LED(闭锁)"
},
"ERT_LED": {
"func": "子板状态 LED"
},
"TRIP_LED": {
"func": "子板状态 LED(跳闸)"
},
"RUN_LED": {
"func": "子板状态 LED(运行)"
},
"RELAY_STO": {
"func": "继电器控制",
"note": "U17→U18→U5"
},
"H16": {
"func": "子板信号"
},
"V15": {
"func": "子板信号"
},
"J3": {
"func": "子板信号"
},
"F3": {
"func": "子板信号"
},
"K3": {
"func": "子板信号"
},
"RAS": {
"func": "FSMC RAS(子板侧)"
},
"DQM0": {
"func": "FSMC DQM0(子板侧)"
},
"DQM1": {
"func": "FSMC DQM1(子板侧)"
},
"WAIT1": {
"func": "FSMC WAIT(子板侧)"
},
"SDCKE": {
"func": "FSMC CKE(子板侧)"
},
"ST_IN_C3": {
"func": "子板输入"
},
"ST_IN_D4": {
"func": "子板输入"
},
"ST_IN_E4": {
"func": "子板输入"
},
"CF_P": {
"func": "CF 通信 P",
"note": "U5→U14/CN1"
},
"CF_Q": {
"func": "CF 通信 Q",
"note": "U5→U14/CN1"
},
"V_ZL1": {
"func": "电压测量1→ADC16"
},
"V_ZL2": {
"func": "电压测量2→ADC17"
},
"R16": {
"func": "子板信号"
},
"SWCLK": {
"func": "SWD 时钟",
"note": "U17→H2"
},
"SWDIO": {
"func": "SWD 数据",
"note": "U17↔H2"
},
"NRST": {
"func": "复位",
"note": "U17/U1,经 R40/SW1"
},
"LED1": {
"func": "板级 LED1",
"gpio": "PC4",
"note": "低有效;顺序按 AGENTS.md 待核"
},
"LED2": {
"func": "板级 LED2",
"gpio": "PC5",
"note": "低有效"
},
"LED3": {
"func": "板级 LED3",
"gpio": "PB1",
"note": "低有效"
},
"LED4": {
"func": "板级 LED4",
"gpio": "PB2",
"note": "低有效"
},
"LED5": {
"func": "板级 LED5",
"gpio": "PF11",
"note": "低有效"
},
"LED6": {
"func": "板级 LED6",
"gpio": "PF12",
"note": "低有效"
},
"PBLED": {
"func": "PHY 活动 LED",
"note": "U2→R2→LED"
},
"DIS_EEE": {
"func": "显示/EEE 指示",
"note": "U2→R6→LED1"
},
"INT": {
"func": "CH395F 中断",
"note": "U1→U17"
},
"RX_P": {
"func": "MDI 差分(U2↔T1)"
},
"RX_N": {
"func": "MDI 差分(U2↔T1)"
},
"TX_P": {
"func": "MDI 差分(U2↔T1)"
},
"TX_N": {
"func": "MDI 差分(U2↔T1)"
},
"RXA_P": {
"func": "端口A MDI(U2↔J1)"
},
"RXA_N": {
"func": "端口A MDI(U2↔J1)"
},
"TXA_P": {
"func": "端口A MDI(U2↔J1)"
},
"TXA_N": {
"func": "端口A MDI(U2↔J1)"
},
"RXB_P": {
"func": "端口B MDI(U2↔J2)"
},
"RXB_N": {
"func": "端口B MDI(U2↔J2)"
},
"TXB_P": {
"func": "端口B MDI(U2↔J2)"
},
"TXB_N": {
"func": "端口B MDI(U2↔J2)"
}
}
}