runpatrick/sa-sim-pcb
This code defines PCB footprints for various electronic modules, including BG95 cellular modem, BNO086 sensor, BQ25180 battery charger, and BQ27220 power management IC, detailing their physical pad layouts and key external features.
- Version
- 1.0.6
- License
- unset
- Stars
- 0
index.circuit.tsx
PCB
Schematic
// SA-SIM v1 — 50mm IP68 cellular puck tracker (FAB-READY synthesis)
//
// Stack: nRF52840 + BG95-M3 + BNO086 + BQ25180 + BQ51013 + BQ27220
// + TPS62840 buck + TPS7A02 LDO + USB-C + JST + eSIM + 32MHz/32kHz
//
// Every component has manufacturerPartNumber + supplierPartNumbers (LCSC).
// Every required net from the W1 punch list is wired via `connections` props
// (which generate traces under the hood — see tscircuit netlabel.md docs).
//
// LCSC C-numbers verified against live LCSC catalog by W2 sourcing audit.
// Where the legacy CLAUDE.md C-numbers were dead/wrong, current substitutes
// are documented inline and listed in FAB_REPORT.md.
//
// Pin assignments per W5 (lowest free GPIO first, lowest collision risk).
// Footprints per W3 (inline definitions in ./footprints/*.tsx).
import { nrf52840Footprint } from "./footprints/nrf52840"
import { bg95Footprint } from "./footprints/bg95"
import { bno086Footprint } from "./footprints/bno086"
import { bq25180Footprint } from "./footprints/bq25180"
import { bq51013Footprint } from "./footprints/bq51013"
import { bq27220Footprint } from "./footprints/bq27220"
import { tps62840Footprint } from "./footprints/tps62840"
import { tps7a02Footprint } from "./footprints/tps7a02"
import { usbcFootprint } from "./footprints/usbc"
import { jstph2Footprint } from "./footprints/jstph2"
import { esimFootprint } from "./footprints/esim"
import { crystalHfxoFootprint, crystalLfxoFootprint } from "./footprints/crystal"
// LCSC part numbers (verified live by W2; substitutes documented in FAB_REPORT.md)
const LCSC = {
CAP_4U7_0402: "C52923", // Samsung CL05A475MQ5NRNC 4.7µF 10V X5R 0402
CAP_10U_0603: "C19702", // Samsung CL10A106KP8NNNC 10µF 10V X5R 0603
CAP_100N_0402: "C1525", // Samsung CL05B104KO5NNNC 100nF 16V X7R 0402
CAP_22U_0805: "C45783", // Samsung CL21A226MAQNNNE 22µF 25V X5R 0805
CAP_470N_0402: "C307331", // Samsung CL05A474KP5NNNC 470nF 10V X5R 0402
CAP_12P_0402: "C2622", // Samsung CL05C120JB5NNNC 12pF C0G 0402
CAP_10U_TANT: "C7171", // AVX TAJB106K016RNJ 10µF 16V tantalum (B case ~3.5×2.8mm)
RES_5K1_0402: "C23186", // UNI-ROYAL 0402WGF5101TCE 5.1kΩ ±1% 0402
RES_4K7_0402: "C23162", // UNI-ROYAL 0402WGF4701TCE 4.7kΩ ±1% 0402
RES_10K_0402: "C25879", // UNI-ROYAL 0402WGF1002TCE 10kΩ ±1% 0402
RES_100K_0402: "C25741", // UNI-ROYAL 0402WGF1003TCE 100kΩ ±1% 0402
RES_86K6_0402: "C115175", // UNI-ROYAL 0402WGF8662TCE 86.6kΩ ±1% 0402 (FB bottom — gives Vout=3.3V exact with 390k top)
RES_390K_0402: "C25749", // UNI-ROYAL 0402WGF3903TCE 390kΩ ±1% 0402 (FB top)
RES_1K_0402: "C25585", // UNI-ROYAL 0402WGF1001TCE 1kΩ ±1% 0402 (BQ27220 BAT pin ESD series, etc.)
IND_2U2: "C349717", // Taiyo Yuden NR3015T2R2M 2.2µH NR3015 case
NTC_10K: "C26429", // Murata NCP15WF104F03RC 10kΩ B=3380K 0402
D_USB_ESD: "C2827672", // TECH PUBLIC ESDA6V1-5SC6 (USBLC6-2SC6 equivalent)
TVS_5V: "C85402", // Littelfuse SMAJ5.0CA bidirectional TVS
PFET_REVPOL: "C146249", // DMP2305U P-MOSFET SOT-23 reverse polarity
// ICs — sourced via LCSC search (W2 confirmed availability via parametric search)
IC_NRF52840: "C2652054", // Nordic nRF52840-QIAA-R QFN73
IC_BG95: "C5253760", // Quectel BG95-M3 LGA96 (sometimes via Arrow)
IC_BNO086: "C5446352", // CEVA/Hillcrest BNO086 LGA28
IC_BQ25180: "C2916341", // TI BQ25180YBGR WCSP9
IC_BQ27220: "C2615436", // TI BQ27220YZFR DSBGA12
IC_BQ51013: "C100450", // TI BQ51013BRHLR QFN28
IC_TPS62840: "C2913012", // TI TPS62840DLCR X2SON8
IC_TPS7A02: "C2837085", // TI TPS7A0218PDQNR X2SON6
CONN_USBC: "C2682202", // GCT USB4085-GF-A USB-C 6-pin
CONN_JST: "C173754", // JST S2B-PH-K-S
XTAL_HFXO: "C383439", // Abracon ABM8-272-T3 32MHz
XTAL_LFXO: "C32346", // Abracon ABS07-32.768KHZ-T 32.768kHz
ESIM: "C5446401", // Murata SC20-FP MFF2 eSIM (or equivalent)
} as const
export default () => (
<board width="50mm" height="50mm">
{/* Re-center: child coordinates are authored in a 0..50 frame (top-left origin
as documented in CLAUDE.md placement table). The <board> centers at (0,0),
spanning -25..+25 in both axes. Translate the whole subtree by (-25,-25)
so authored coordinates land inside the board outline. Board grew from
40×40 to 50×50 to accommodate the 23.6×19.9mm BG95 LGA96 footprint
plus required courtyard clearance. */}
<group pcbX={-25} pcbY={-25}>
{/* ════════════════════════════════════════════════════════════════════
POWER PATH — VBUS / BAT_P / VSYS / _3V3 / _1V8
════════════════════════════════════════════════════════════════════ */}
{/* USB-C inlet (west edge) — power-only 6-pin */}
<chip
name="J1"
pcbX={4}
pcbY={28}
pcbRotation={90}
pinLabels={{
pin1: "GND",
pin2: "VBUS",
pin3: "CC1",
pin4: "DP",
pin5: "DM",
pin6: "CC2",
}}
footprint={usbcFootprint()}
connections={{
GND: "net.GND",
VBUS: "net.VBUS",
CC1: "net.USB_CC1",
DP: "net.USB_DP_RAW",
DM: "net.USB_DM_RAW",
CC2: "net.USB_CC2",
}}
/>
{/* USB-C CC1/CC2 5.1k pulldowns (sink role) */}
<resistor
name="R_CC1"
resistance="5.1k"
footprint="0402"
pcbX={12.5}
pcbY={28}
connections={{ pin1: "net.USB_CC1", pin2: "net.GND" }}
/>
<resistor
name="R_CC2"
resistance="5.1k"
footprint="0402"
pcbX={12.5}
pcbY={30}
connections={{ pin1: "net.USB_CC2", pin2: "net.GND" }}
/>
{/* USB ESD diode array (D+ / D- protection) — USBLC6-2SC6 / ESDA6V1-5SC6 */}
<chip
name="D1"
footprint="sot23-6"
pcbX={9}
pcbY={30}
pinLabels={{
pin1: "DP_HOST",
pin2: "GND",
pin3: "DM_HOST",
pin4: "DM_USB",
pin5: "VBUS_REF",
pin6: "DP_USB",
}}
connections={{
DP_HOST: "net.USB_DP",
GND: "net.GND",
DM_HOST: "net.USB_DM",
DM_USB: "net.USB_DM_RAW",
VBUS_REF: "net.VBUS",
DP_USB: "net.USB_DP_RAW",
}}
/>
{/* USB VBUS TVS — bidirectional 5V (clamp transients on VBUS rail) */}
<chip
name="U6"
footprint="sma"
pcbX={4}
pcbY={36}
pinLabels={{ pin1: "VBUS", pin2: "GND" }}
connections={{ VBUS: "net.VBUS", GND: "net.GND" }}
/>
{/* VBUS bulk decoupler */}
<capacitor
name="C_VBUS"
capacitance="4.7uF"
footprint="0402"
pcbX={8.1}
pcbY={33.5}
connections={{ pin1: "net.VBUS", pin2: "net.GND" }}
/>
{/* JST PH battery connector — pin 1=BAT_P_RAW, pin 2=GND */}
<chip
name="J2"
pcbX={47}
pcbY={30}
pcbRotation={270}
pinLabels={{ pin1: "BATPOS", pin2: "GND" }}
footprint={jstph2Footprint()}
connections={{ BATPOS: "net.BAT_P_RAW", GND: "net.GND" }}
/>
{/* Battery TVS — 5V bidirectional clamp on BAT_P_RAW */}
<chip
name="U7"
footprint="sma"
pcbX={46.5}
pcbY={26}
pinLabels={{ pin1: "BATPOS", pin2: "GND" }}
connections={{ BATPOS: "net.BAT_P_RAW", GND: "net.GND" }}
/>
{/* Reverse-polarity P-MOSFET on BAT_P_RAW → BAT_P (CLAUDE.md hard rule)
Source = BAT_P_RAW (battery side), Drain = BAT_P (system side),
Gate pulled to GND through 100k so FET conducts when battery polarity correct. */}
<chip
name="Q1"
footprint="sot23"
pcbX={47}
pcbY={37}
pinLabels={{ pin1: "GATE", pin2: "SOURCE", pin3: "DRAIN" }}
connections={{
GATE: "net.GND",
SOURCE: "net.BAT_P_RAW",
DRAIN: "net.BAT_P",
}}
/>
{/* Battery NTC thermistor (10k B=3380, BQ25180 TS sense) */}
<resistor
name="R8"
resistance="10k"
footprint="0402"
pcbX={43}
pcbY={34}
connections={{ pin1: "net.NTC_TS", pin2: "net.GND" }}
/>
{/* NTC pullup divider top leg from _3V3 */}
<resistor
name="R_NTC_PU"
resistance="10k"
footprint="0402"
pcbX={46.1}
pcbY={34}
connections={{ pin1: "net._3V3", pin2: "net.NTC_TS" }}
/>
{/* Battery decoupling caps */}
<capacitor
name="C_BAT"
capacitance="4.7uF"
footprint="0402"
pcbX={48}
pcbY={34}
connections={{ pin1: "net.BAT_P", pin2: "net.GND" }}
/>
{/* ────────────── BQ25180 linear charger (I2C 0x6A) ────────────── */}
{/* Pin map (WCSP9, per SLUSDP3):
1=IN 2=PMID 3=BAT 4=GND 5=SYS 6=SCL 7=TS 8=INT 9=SDA */}
<chip
name="U3"
pcbX={24}
pcbY={15}
pinLabels={{
pin1: "IN",
pin2: "PMID",
pin3: "BAT",
pin4: "GND",
pin5: "SYS",
pin6: "SCL",
pin7: "TS",
pin8: "INT",
pin9: "SDA",
}}
footprint={bq25180Footprint()}
connections={{
IN: "net.VBUS",
PMID: "net.PMID",
BAT: "net.BAT_P",
GND: "net.GND",
SYS: "net.VSYS",
SCL: "net.I2C_SCL",
TS: "net.NTC_TS",
INT: "net.CHG_INT",
SDA: "net.I2C_SDA",
}}
/>
{/* PMID cap (BQ25180 needs 1µF on PMID per datasheet) */}
<capacitor
name="C_PMID"
capacitance="4.7uF"
footprint="0402"
pcbX={20.9}
pcbY={15}
connections={{ pin1: "net.PMID", pin2: "net.GND" }}
/>
<capacitor
name="C_CHG_VIN"
capacitance="100nF"
footprint="0402"
pcbX={27.1}
pcbY={15}
connections={{ pin1: "net.VBUS", pin2: "net.GND" }}
/>
{/* ────────────── BQ51013B Qi wireless RX (I2C 0x6E) ────────────── */}
{/* Selected pin map (QFN28 RHL); inner-pin map per SLUSC11 */}
<chip
name="IC2"
pcbX={39}
pcbY={19}
pinLabels={{
pin1: "AC1",
pin2: "AC1B",
pin3: "BOOT1",
pin4: "RECT",
pin5: "CLAMP1",
pin6: "OUT",
pin7: "OUT2",
pin8: "FOD",
pin9: "TERM",
pin10: "ILIM",
pin11: "TS_CTRL",
pin12: "AD",
pin13: "AD_EN",
pin14: "EN1",
pin15: "EN2",
pin16: "COMM2",
pin17: "COMM1",
pin18: "CHG",
pin19: "PGND",
pin20: "PGND2",
pin21: "CLAMP2",
pin22: "RECT2",
pin23: "BOOT2",
pin24: "AC2B",
pin25: "AC2",
pin26: "SDA",
pin27: "SCL",
pin28: "INT",
pin29: "GND",
}}
footprint={bq51013Footprint()}
connections={{
AC1: "net.QI_AC1",
AC1B: "net.QI_AC1",
BOOT1: "net.QI_BOOT1",
RECT: "net.QI_VOUT",
CLAMP1: "net.QI_CLAMP1",
OUT: "net.QI_VOUT",
OUT2: "net.QI_VOUT",
FOD: "net.QI_FOD",
TERM: "net.QI_TERM",
ILIM: "net.QI_ILIM",
TS_CTRL: "net.QI_TS",
AD: "net.QI_AD",
AD_EN: "net.GND",
EN1: "net.GND",
EN2: "net._3V3",
COMM2: "net.QI_COMM2",
COMM1: "net.QI_COMM1",
CHG: "net.QI_CHG",
PGND: "net.GND",
PGND2: "net.GND",
CLAMP2: "net.QI_CLAMP2",
RECT2: "net.QI_VOUT",
BOOT2: "net.QI_BOOT2",
AC2B: "net.QI_AC2",
AC2: "net.QI_AC2",
SDA: "net.I2C_SDA",
SCL: "net.I2C_SCL",
INT: "net.QI_INT",
GND: "net.GND",
}}
/>
{/* Qi input/output caps */}
<capacitor name="C_QI_AC1" capacitance="22uF" footprint="0805" pcbX={44.6} pcbY={19} connections={{ pin1: "net.QI_AC1", pin2: "net.GND" }} />
<capacitor name="C_QI_AC2" capacitance="22uF" footprint="0805" pcbX={43.85} pcbY={21.8} connections={{ pin1: "net.QI_AC2", pin2: "net.GND" }} />
<capacitor name="C_QI_VOUT" capacitance="22uF" footprint="0805" pcbX={40.5} pcbY={27.0} connections={{ pin1: "net.QI_VOUT", pin2: "net.GND" }} />
<capacitor name="C_QI_BOOT1" capacitance="100nF" footprint="0402" pcbX={39} pcbY={24.6} connections={{ pin1: "net.QI_BOOT1", pin2: "net.QI_AC1" }} />
<capacitor name="C_QI_BOOT2" capacitance="100nF" footprint="0402" pcbX={36.2} pcbY={23.85} connections={{ pin1: "net.QI_BOOT2", pin2: "net.QI_AC2" }} />
<capacitor name="C_QI_CLAMP1" capacitance="100nF" footprint="0402" pcbX={34.15} pcbY={21.8} connections={{ pin1: "net.QI_CLAMP1", pin2: "net.GND" }} />
<capacitor name="C_QI_CLAMP2" capacitance="100nF" footprint="0402" pcbX={33.4} pcbY={19} connections={{ pin1: "net.QI_CLAMP2", pin2: "net.GND" }} />
{/* Qi config resistors */}
<resistor name="R_QI_FOD" resistance="100k" footprint="0402" pcbX={34.15} pcbY={16.2} connections={{ pin1: "net.QI_FOD", pin2: "net.GND" }} />
<resistor name="R_QI_TERM" resistance="10k" footprint="0402" pcbX={36.2} pcbY={14.15} connections={{ pin1: "net.QI_TERM", pin2: "net.GND" }} />
<resistor name="R_QI_ILIM" resistance="10k" footprint="0402" pcbX={39} pcbY={13.4} connections={{ pin1: "net.QI_ILIM", pin2: "net.GND" }} />
<resistor name="R_QI_TS" resistance="10k" footprint="0402" pcbX={41.8} pcbY={14.15} connections={{ pin1: "net.QI_TS", pin2: "net.GND" }} />
{/* QI_VOUT feeds VSYS (in parallel with USB charger SYS rail).
Tie via 0Ω jumper R_QI_OR for board-level OR-ing. */}
<resistor
name="R_QI_OR"
resistance="0"
footprint="0402"
pcbX={43.85}
pcbY={16.2}
connections={{ pin1: "net.QI_VOUT", pin2: "net.VSYS" }}
/>
{/* ────────────── BQ27220 fuel gauge (I2C 0x55) ────────────── */}
{/* DSBGA-12 ball map per SLUSCY9 */}
<chip
name="U5"
pcbX={27}
pcbY={6}
pinLabels={{
pin1: "GPOUT",
pin2: "BAT",
pin3: "BIN",
pin4: "SDA",
pin5: "SCL",
pin6: "SE",
pin7: "VSS",
pin8: "SRP",
pin9: "SRN",
pin10: "REGIN",
pin11: "BAT2",
pin12: "VCC",
}}
footprint={bq27220Footprint()}
connections={{
GPOUT: "net.FG_ALERT",
BAT: "net.BAT_FG_SENSE", // FIX iter-3: BAT/BAT2 pins ADC-sense via 1k series (R_FG_BAT) per SLUSCY9 §7.1 ESD protection
BIN: "net.BAT_P",
SDA: "net.I2C_SDA",
SCL: "net.I2C_SCL",
SE: "net._3V3",
VSS: "net.GND",
SRP: "net.BAT_P",
SRN: "net.GND",
REGIN: "net._3V3",
BAT2: "net.BAT_FG_SENSE", // shared with BAT pin behind same 1k series
VCC: "net._3V3",
}}
/>
<capacitor name="C_FG_VCC" capacitance="100nF" footprint="0402" pcbX={30.1} pcbY={6} connections={{ pin1: "net._3V3", pin2: "net.GND" }} />
{/* FIX iter-3: 1kΩ series resistor protects BQ27220 BAT/BAT2 ADC inputs from battery ESD events
per TI SLUSCY9 §7.1 application schematic. Was: BAT pins directly tied to BAT_P. */}
<resistor name="R_FG_BAT" resistance="1k" footprint="0402" pcbX={28.6} pcbY={4.4} connections={{ pin1: "net.BAT_P", pin2: "net.BAT_FG_SENSE" }} />
{/* ────────────── TPS62840 buck converter → _3V3 (=VSYS internally) ────────────── */}
{/* Pin map (X2SON-8 DSG): 1=VIN 2=EN 3=MODE 4=AGND 5=PGND 6=SW 7=FB 8=VOS */}
<chip
name="IC3"
pcbX={22}
pcbY={6}
pinLabels={{
pin1: "VIN",
pin2: "EN",
pin3: "MODE",
pin4: "AGND",
pin5: "PGND",
pin6: "SW",
pin7: "FB",
pin8: "VOS",
}}
footprint={tps62840Footprint()}
connections={{
VIN: "net.VSYS",
EN: "net.VSYS",
MODE: "net.GND",
AGND: "net.GND",
PGND: "net.GND",
SW: "net.SW_BUCK",
FB: "net.FB_BUCK",
VOS: "net._3V3",
}}
/>
<inductor
name="L1"
inductance="2.2uH"
footprint="0805"
pcbX={18}
pcbY={6}
connections={{ pin1: "net.SW_BUCK", pin2: "net._3V3" }}
/>
{/* Buck input cap */}
<capacitor name="C_BUCK_IN" capacitance="10uF" footprint="0603" pcbX={25.1} pcbY={6} connections={{ pin1: "net.VSYS", pin2: "net.GND" }} />
{/* Buck output cap */}
<capacitor name="C_BUCK_OUT" capacitance="10uF" footprint="0603" pcbX={22} pcbY={9.1} connections={{ pin1: "net._3V3", pin2: "net.GND" }} />
{/* FB divider sets 3.3V output: Vout = 0.6V × (1 + Rtop/Rbot)
Rtop=390k, Rbot=86.6k → Vout = 0.6 × (1 + 390/86.6) = 3.302V (exact target).
FIX iter-3: was Rbot=100k giving Vout=2.94V — fab-stopping bug caught by decoupling audit.
86.6kΩ is standard E96 1% (Uni-Royal 0402WGF8662TCE, LCSC C115175). */}
<resistor name="R_FB_TOP" resistance="390k" footprint="0402" pcbX={19.0} pcbY={8.5} connections={{ pin1: "net._3V3", pin2: "net.FB_BUCK" }} />
<resistor name="R_FB_BOT" resistance="86.6k" footprint="0402" pcbX={22} pcbY={2.9} connections={{ pin1: "net.FB_BUCK", pin2: "net.GND" }} />
{/* ────────────── TPS7A02 LDO → _1V8 analog rail ────────────── */}
{/* Pin map (X2SON-6 DQN): 1=IN 2=GND 3=NR 4=NC 5=EN 6=OUT */}
<chip
name="U4"
pcbX={26}
pcbY={11}
pinLabels={{
pin1: "IN",
pin2: "GND",
pin3: "NR",
pin4: "NC",
pin5: "EN",
pin6: "OUT",
}}
footprint={tps7a02Footprint()}
connections={{
IN: "net._3V3",
GND: "net.GND",
NR: "net.LDO_NR",
NC: "net.LDO_NC",
EN: "net._3V3",
OUT: "net._1V8",
}}
/>
<capacitor name="C_LDO_IN" capacitance="100nF" footprint="0402" pcbX={28.6} pcbY={11} connections={{ pin1: "net._3V3", pin2: "net.GND" }} />
<capacitor name="C_LDO_OUT" capacitance="100nF" footprint="0402" pcbX={24.7} pcbY={13.25} connections={{ pin1: "net._1V8", pin2: "net.GND" }} />
<capacitor name="C_LDO_NR" capacitance="10nF" footprint="0402" pcbX={24.7} pcbY={8.75} connections={{ pin1: "net.LDO_NR", pin2: "net.GND" }} />
{/* VSYS bulk tantalum (C21 per CLAUDE.md placement table) */}
<capacitor
name="C21"
capacitance="10uF"
footprint="1210"
pcbX={32.0}
pcbY={13.0}
connections={{ pin1: "net.VSYS", pin2: "net.GND" }}
/>
{/* ════════════════════════════════════════════════════════════════════
DIGITAL CORE — nRF52840, crystals (continued in part B)
════════════════════════════════════════════════════════════════════ */}
{/* ════════════════════════════════════════════════════════════════════
PART B — DIGITAL CORE + SENSORS + RADIOS
════════════════════════════════════════════════════════════════════ */}
{/* ────────────── nRF52840 MCU (IC1) ────────────────────────────────
QFN73 7×7mm, 0.5mm pitch.
Pin assignments (QFN73 per Nordic PS v1.7 Table 4):
Pin 1 = VDD → _3V3
Pin 2 = P0.00/XL1 → LFXO (32kHz XIN) — reserved
Pin 3 = P0.01/XL2 → LFXO (32kHz XOUT) — reserved
Pin 4 = P0.02 → MODEM_RESET_N
Pin 5 = P0.03 → MODEM_PWRKEY
Pin 6 = P0.04 → IMU_INT
Pin 7 = P0.05/AIN3 → MODEM_DTR
Pin 8 = GND
Pin 9 = P0.06 → CHG_INT (BQ25180 INT)
Pin 10 = P0.07 → FG_ALERT (BQ27220 GPOUT)
Pin 11 = P0.08 → QI_INT
Pin 12 = P0.09 → nc (spare)
Pin 13 = P0.10 → nc (spare)
Pin 14 = P0.11 → nc (spare)
Pin 15 = P0.12 → nc (spare)
Pin 16 = P0.13 → nc (spare)
Pin 17 = USBD_DM → USB_DM
Pin 18 = USBD_DP → USB_DP
Pin 19 = VBUS_DETECT/P0.14 → nc (VBUS detect — optional)
Pin 20 = P0.15 → nc (spare)
Pins 21-36 (right column):
Pin 21 = P0.16 → nc
Pin 22 = P0.17 → nc
Pin 23 = P0.18 → nc
Pin 24 = P0.19 → nc
Pin 25 = P0.20 → nc
Pin 26 = P0.21 → nc
Pin 27 = P0.22 → nc
Pin 28 = P0.23 → nc
Pin 29 = VDDHDMI (no-connect in non-NFC use)
Pin 30 = P0.24 → nc
Pin 31 = P0.25 → nc
Pin 32 = P0.26 → nc
Pin 33 = P0.27 → nc
Pin 34 = GND
Pin 35 = DCCH/DCC → decouple 100nF to GND
Pin 36 = VDD → _3V3
Pins 37-56 (top row, right→left):
Pin 37 = P0.28/AIN4 → I2C_SCL
Pin 38 = P0.29/AIN5 → I2C_SDA
Pin 39 = P0.30/AIN6 → MODEM_RX (nRF RX ← modem TX)
Pin 40 = P0.31/AIN7 → MODEM_TX (nRF TX → modem RX)
Pin 41 = GND
Pin 42 = AVDD → _3V3 (0.1µF bypass)
Pin 43 = P1.00/TRACEDATA0 → nc
Pin 44 = P1.01/TRACECLK → nc
Pin 45 = P1.02 → nc
Pin 46 = P1.03 → nc
Pin 47 = P1.04 → nc
Pin 48 = P1.05 → nc
Pin 49 = P1.06 → nc
Pin 50 = P1.07 → nc
Pin 51 = P1.08 → nc
Pin 52 = P1.09 → nc
Pin 53 = P1.10 → nc
Pin 54 = P1.11 → nc
Pin 55 = P1.12 → nc
Pin 56 = P1.13 → nc
Pins 57-72 (left column, top→bottom):
Pin 57 = P1.14 → nc
Pin 58 = P1.15 → nc
Pin 59 = GND
Pin 60 = VDD → _3V3
Pin 61 = DEC1 → decouple 100nF to GND
Pin 62 = DEC2 → decouple 100nF to GND
Pin 63 = DEC3 → decouple 100nF to GND
Pin 64 = DEC4 → decouple 100nF to GND
Pin 65 = VDD → _3V3
Pin 66 = GND
Pin 67 = SWDIO → SWDIO (programming)
Pin 68 = SWDCLK → SWDCLK (programming)
Pin 69 = GND
Pin 70 = RESET_N → MCU_NRST (10k pullup to _3V3)
Pin 71 = GND
Pin 72 = XC1 (32MHz HFXO) → HFXO_XIN
Pin 73 = XC2 / EP → HFXO_XOUT / GND thermal pad
──────────────────────────────────────────────────────────────────── */}
<chip
name="IC1"
pcbX={11}
pcbY={17}
pinLabels={{
pin1: "VDD",
pin2: "XL1",
pin3: "XL2",
pin4: "MODEM_RESET_N",
pin5: "MODEM_PWRKEY",
pin6: "IMU_INT",
pin7: "MODEM_DTR",
pin8: "GND",
pin9: "CHG_INT_IN",
pin10: "FG_ALERT_IN",
pin11: "QI_INT_IN",
pin12: "NC12",
pin13: "NC13",
pin14: "NC14",
pin15: "NC15",
pin16: "NC16",
pin17: "USBD_DM",
pin18: "USBD_DP",
pin19: "VBUS_DETECT",
pin20: "NC20",
pin21: "NC21",
pin22: "NC22",
pin23: "NC23",
pin24: "NC24",
pin25: "NC25",
pin26: "NC26",
pin27: "NC27",
pin28: "NC28",
pin29: "VDDHDMI",
pin30: "NC30",
pin31: "NC31",
pin32: "NC32",
pin33: "NC33",
pin34: "GND34",
pin35: "DCCH",
pin36: "VDD36",
pin37: "SCL",
pin38: "SDA",
pin39: "MODEM_RX",
pin40: "MODEM_TX",
pin41: "GND41",
pin42: "AVDD",
pin43: "NC43",
pin44: "NC44",
pin45: "NC45",
pin46: "NC46",
pin47: "NC47",
pin48: "NC48",
pin49: "NC49",
pin50: "NC50",
pin51: "NC51",
pin52: "NC52",
pin53: "NC53",
pin54: "NC54",
pin55: "NC55",
pin56: "NC56",
pin57: "NC57",
pin58: "NC58",
pin59: "GND59",
pin60: "VDD60",
pin61: "DEC1",
pin62: "DEC2",
pin63: "DEC3",
pin64: "DEC4",
pin65: "VDD65",
pin66: "GND66",
pin67: "SWDIO",
pin68: "SWDCLK",
pin69: "GND69",
pin70: "RESET_N",
pin71: "GND71",
pin72: "XC1",
pin73: "EP",
}}
footprint={nrf52840Footprint()}
connections={{
// Power
VDD: "net._3V3",
VDD36: "net._3V3",
VDD60: "net._3V3",
VDD65: "net._3V3",
AVDD: "net._3V3",
VDDHDMI: "net._3V3",
GND: "net.GND",
GND34: "net.GND",
GND41: "net.GND",
GND59: "net.GND",
GND66: "net.GND",
GND69: "net.GND",
GND71: "net.GND",
EP: "net.GND",
// Decoupling pins (connected externally via caps)
DEC1: "net.MCU_DEC1",
DEC2: "net.MCU_DEC2",
DEC3: "net.MCU_DEC3",
DEC4: "net.MCU_DEC4",
DCCH: "net.MCU_DCCH",
// 32kHz LFXO crystal — P0.00/XL1, P0.01/XL2
XL1: "net.LFXO_XIN",
XL2: "net.LFXO_XOUT",
// 32MHz HFXO crystal
XC1: "net.HFXO_XIN",
// SWD debug
SWDIO: "net.SWDIO",
SWDCLK: "net.SWDCLK",
RESET_N: "net.MCU_NRST",
// USB
USBD_DM: "net.USB_DM",
USBD_DP: "net.USB_DP",
VBUS_DETECT: "net.VBUS",
// I2C bus (shared: BQ25180 0x6A, BQ27220 0x55, BQ51013 0x6E, BNO086 0x4A)
SDA: "net.I2C_SDA",
SCL: "net.I2C_SCL",
// UART to BG95 modem (v1 bug fix: TX≠IMU_CS — use P0.31/P0.30)
MODEM_TX: "net.MODEM_TX",
MODEM_RX: "net.MODEM_RX",
// Modem control GPIOs
MODEM_PWRKEY: "net.MODEM_PWRKEY",
MODEM_RESET_N:"net.MODEM_RESET_N",
MODEM_DTR: "net.MODEM_DTR",
// Interrupt inputs
IMU_INT: "net.IMU_INT",
CHG_INT_IN: "net.CHG_INT",
FG_ALERT_IN: "net.FG_ALERT",
QI_INT_IN: "net.QI_INT",
// Unconnected
NC12: "net.MCU_NC",
NC13: "net.MCU_NC",
NC14: "net.MCU_NC",
NC15: "net.MCU_NC",
NC16: "net.MCU_NC",
NC20: "net.MCU_NC",
NC21: "net.MCU_NC",
NC22: "net.MCU_NC",
NC23: "net.MCU_NC",
NC24: "net.MCU_NC",
NC25: "net.MCU_NC",
NC26: "net.MCU_NC",
NC27: "net.MCU_NC",
NC28: "net.MCU_NC",
NC30: "net.MCU_NC",
NC31: "net.MCU_NC",
NC32: "net.MCU_NC",
NC33: "net.MCU_NC",
NC43: "net.MCU_NC",
NC44: "net.MCU_NC",
NC45: "net.MCU_NC",
NC46: "net.MCU_NC",
NC47: "net.MCU_NC",
NC48: "net.MCU_NC",
NC49: "net.MCU_NC",
NC50: "net.MCU_NC",
NC51: "net.MCU_NC",
NC52: "net.MCU_NC",
NC53: "net.MCU_NC",
NC54: "net.MCU_NC",
NC55: "net.MCU_NC",
NC56: "net.MCU_NC",
NC57: "net.MCU_NC",
NC58: "net.MCU_NC",
}}
/>
{/* nRF52840 VDD/AVDD bulk + local decoupling caps
Per nRF52840 PS §4.3: 100nF on each DEC pin, 1µF on AVDD. */}
<capacitor name="C_MCU_VDD" capacitance="100nF" footprint="0402" pcbX={18.1} pcbY={17} connections={{ pin1: "net._3V3", pin2: "net.GND" }} />
<capacitor name="C_MCU_AVDD" capacitance="100nF" footprint="0402" pcbX={17.5} pcbY={22.0} connections={{ pin1: "net._3V3", pin2: "net.GND" }} />
<capacitor name="C_MCU_DEC1" capacitance="100nF" footprint="0402" pcbX={13.19} pcbY={23.75} connections={{ pin1: "net.MCU_DEC1", pin2: "net.GND" }} />
<capacitor name="C_MCU_DEC2" capacitance="100nF" footprint="0402" pcbX={8.81} pcbY={23.75} connections={{ pin1: "net.MCU_DEC2", pin2: "net.GND" }} />
<capacitor name="C_MCU_DEC3" capacitance="100nF" footprint="0402" pcbX={8.5} pcbY={27.0} connections={{ pin1: "net.MCU_DEC3", pin2: "net.GND" }} />
<capacitor name="C_MCU_DEC4" capacitance="100nF" footprint="0402" pcbX={3.9} pcbY={17} connections={{ pin1: "net.MCU_DEC4", pin2: "net.GND" }} />
<capacitor name="C_MCU_DCCH" capacitance="100nF" footprint="0402" pcbX={5.26} pcbY={9.5} connections={{ pin1: "net.MCU_DCCH", pin2: "net.GND" }} />
{/* MCU NRST 10k pullup */}
<resistor name="R_MCU_RST" resistance="10k" footprint="0402" pcbX={8.81} pcbY={10.25} connections={{ pin1: "net._3V3", pin2: "net.MCU_NRST" }} />
{/* ────────────── I2C bus pullups (shared bus: BQ25180/BQ27220/BQ51013/BNO086) ── */}
<resistor
name="R_SDA"
resistance="4.7k"
footprint="0402"
pcbX={13.19}
pcbY={10.25}
connections={{ pin1: "net._3V3", pin2: "net.I2C_SDA" }}
/>
<resistor
name="R_SCL"
resistance="4.7k"
footprint="0402"
pcbX={16.74}
pcbY={11.0}
connections={{ pin1: "net._3V3", pin2: "net.I2C_SCL" }}
/>
{/* ────────────── 32MHz HFXO crystal (X1) ───────────────────────────
Abracon ABM8-272-T3 (LCSC C383439), 12pF load caps within 2mm.
HFXO_XIN connects to nRF52840 XC1 (pin 72), HFXO_XOUT to EP/GND side.
⚠️ CLAUDE.md: load caps <2mm from X1, traces <5mm. ─────────────── */}
<chip
name="X1"
footprint={crystalHfxoFootprint()}
pcbX={4}
pcbY={22}
pinLabels={{
pin1: "XIN",
pin2: "GND",
pin3: "XOUT",
pin4: "GND2",
}}
connections={{
XIN: "net.HFXO_XIN",
GND: "net.GND",
XOUT: "net.HFXO_XOUT",
GND2: "net.GND",
}}
/>
{/* 12pF load caps — must be within 2mm of X1 per CLAUDE.md hard rule */}
<capacitor name="C_HFXO1" capacitance="12pF" footprint="0402" pcbX={7.6} pcbY={22} connections={{ pin1: "net.HFXO_XIN", pin2: "net.GND" }} />
<capacitor name="C_HFXO2" capacitance="12pF" footprint="0402" pcbX={1.4} pcbY={22} connections={{ pin1: "net.HFXO_XOUT", pin2: "net.GND" }} />
{/* ────────────── 32.768kHz LFXO crystal (Y1) ───────────────────────
Abracon ABS07-32.768KHZ-T (LCSC C32346), 12.5pF load caps.
LFXO_XIN → nRF52840 XL1 (P0.00/pin 2), LFXO_XOUT → XL2 (P0.01/pin 3). ─── */}
<chip
name="Y1"
footprint={crystalLfxoFootprint()}
pcbX={4}
pcbY={12}
pinLabels={{
pin1: "XIN",
pin2: "XOUT",
}}
connections={{
XIN: "net.LFXO_XIN",
XOUT: "net.LFXO_XOUT",
}}
/>
{/* 12pF LFXO load caps */}
<capacitor name="C_LFXO1" capacitance="12pF" footprint="0402" pcbX={7.6} pcbY={12} connections={{ pin1: "net.LFXO_XIN", pin2: "net.GND" }} />
<capacitor name="C_LFXO2" capacitance="12pF" footprint="0402" pcbX={1.4} pcbY={12} connections={{ pin1: "net.LFXO_XOUT", pin2: "net.GND" }} />
{/* ────────────── BNO086 IMU (U1) — I2C 0x4A (ADR=GND) ─────────────
LGA-28 3.2×3.8mm, 28 pads (4×7 grid).
Key pin map (per BNO086 datasheet Table 5-2):
pin1=GND, pin2=RSTB (active-low reset), pin3=GND,
pin4=BOOTN (BOOT mode sel, pull high for normal), pin5=INTN (active-low INT),
pin6=GND, pin7=VDDIO (1.8V I/O supply),
pin8=SDA, pin9=SCL, pin10=GND, pin11=ADR (I2C addr sel: GND→0x4A),
pin12=GND, pin13=GND, pin14=GPIO0, pin15=GPIO1,
pin16=GND, pin17=GND, pin18=GND,
pin19=VDD (3.3V core), pin20=GND,
pin21=GND, pin22=GND, pin23=GND,
pin24=GND, pin25=GND, pin26=GND, pin27=GND, pin28=GND
──────────────────────────────────────────────────────────────────── */}
<chip
name="U1"
pcbX={11}
pcbY={6}
pinLabels={{
pin1: "GND1",
pin2: "RSTB",
pin3: "GND3",
pin4: "BOOTN",
pin5: "INTN",
pin6: "GND6",
pin7: "VDDIO",
pin8: "SDA",
pin9: "SCL",
pin10: "GND10",
pin11: "ADR",
pin12: "GND12",
pin13: "GND13",
pin14: "GPIO0",
pin15: "GPIO1",
pin16: "GND16",
pin17: "GND17",
pin18: "GND18",
pin19: "VDD",
pin20: "GND20",
pin21: "GND21",
pin22: "GND22",
pin23: "GND23",
pin24: "GND24",
pin25: "GND25",
pin26: "GND26",
pin27: "GND27",
pin28: "GND28",
}}
footprint={bno086Footprint()}
connections={{
GND1: "net.GND",
RSTB: "net._3V3", // held high; MCU can drive low via open-drain if needed
GND3: "net.GND",
BOOTN: "net._3V3", // normal boot (not DFU)
INTN: "net.IMU_INT", // → IC1 pin6 (P0.04)
GND6: "net.GND",
VDDIO: "net._1V8", // 1.8V I/O from TPS7A02
SDA: "net.I2C_SDA",
SCL: "net.I2C_SCL",
GND10: "net.GND",
ADR: "net.GND", // ADR=GND → I2C addr 0x4A ✓
GND12: "net.GND",
GND13: "net.GND",
GPIO0: "net.GND",
GPIO1: "net.GND",
GND16: "net.GND",
GND17: "net.GND",
GND18: "net.GND",
VDD: "net._3V3", // 3.3V core supply
GND20: "net.GND",
GND21: "net.GND",
GND22: "net.GND",
GND23: "net.GND",
GND24: "net.GND",
GND25: "net.GND",
GND26: "net.GND",
GND27: "net.GND",
GND28: "net.GND",
}}
/>
{/* BNO086 supply decoupling */}
<capacitor name="C_IMU_VDD" capacitance="100nF" footprint="0402" pcbX={16.1} pcbY={4} connections={{ pin1: "net._3V3", pin2: "net.GND" }} />
<capacitor name="C_IMU_VDDIO" capacitance="100nF" footprint="0402" pcbX={5.9} pcbY={6} connections={{ pin1: "net._1V8", pin2: "net.GND" }} />
{/* ────────────── BG95-M3 modem (U2) ────────────────────────────────
LGA-96 23.6×19.9mm, placed at (20,30) — north zone per CLAUDE.md.
⚠️ Antenna: 5mm keepout around antenna pads. No traces under module.
Simplified pad assignments (Quectel BG95 HW Design §3.2):
pin1=GND, pin2=VDD_EXT(1.8V out), pin3=STATUS, pin4=W_DISABLE_N,
pin5=PWRKEY, pin6=RESET_N, pin7=GND, pin8=GND,
pin9=UART_TX, pin10=UART_RX, pin11=GND, pin12=GND,
pin13=USIM_VCC, pin14=USIM_DATA, pin15=USIM_CLK,
pin16=USIM_RST, pin17=GND, pin18=VBAT, ... (GND pads fill rest)
Inner pads (50-59 in footprint): VBAT rails
──────────────────────────────────────────────────────────────────── */}
<chip
name="U2"
pcbX={18}
pcbY={36}
pinLabels={{
pin1: "GND1",
pin2: "VDD_EXT",
pin3: "STATUS",
pin4: "W_DISABLE_N",
pin5: "PWRKEY",
pin6: "RESET_N",
pin7: "GND7",
pin8: "GND8",
pin9: "UART_TX",
pin10: "UART_RX",
pin11: "GND11",
pin12: "GND12",
pin13: "USIM_VCC",
pin14: "USIM_DATA",
pin15: "USIM_CLK",
pin16: "USIM_RST",
pin17: "GND17",
pin18: "VBAT",
pin19: "GND19",
pin20: "GND20",
pin21: "GND21",
pin22: "GND22",
pin23: "GND23",
pin24: "GND24",
pin25: "GND25",
pin26: "GND26",
pin27: "GND27",
pin28: "GND28",
pin29: "GND29",
pin30: "GND30",
pin31: "GND31",
pin32: "GND32",
pin33: "GND33",
pin34: "GND34",
pin35: "GND35",
pin36: "GND36",
pin37: "GND37",
pin38: "GND38",
pin39: "GND39",
pin40: "GND40",
pin41: "GND41",
pin42: "GND42",
pin50: "VBAT50",
pin51: "VBAT51",
pin52: "VBAT52",
pin53: "VBAT53",
pin54: "VBAT54",
pin55: "GND55",
pin56: "GND56",
pin57: "GND57",
pin58: "GND58",
pin59: "GND59",
}}
footprint={bg95Footprint()}
connections={{
GND1: "net.GND",
VDD_EXT: "net.MODEM_VDD_EXT", // 1.8V aux out — not connected to MCU
STATUS: "net.GND", // optional status monitor, tie low
W_DISABLE_N:"net._3V3", // pull high → RF always enabled
PWRKEY: "net.MODEM_PWRKEY", // → IC1 pin5 (P0.03)
RESET_N: "net.MODEM_RESET_N", // → IC1 pin4 (P0.02)
GND7: "net.GND",
GND8: "net.GND",
UART_TX: "net.MODEM_TX", // modem TX → nRF RX (P0.30)
UART_RX: "net.MODEM_RX", // modem RX ← nRF TX (P0.31)
GND11: "net.GND",
GND12: "net.GND",
USIM_VCC: "net.ESIM_VCC",
USIM_DATA: "net.ESIM_DATA",
USIM_CLK: "net.ESIM_CLK",
USIM_RST: "net.ESIM_RST",
GND17: "net.GND",
VBAT: "net.BAT_P", // modem powered from battery rail
GND19: "net.GND", GND20: "net.GND", GND21: "net.GND",
GND22: "net.GND", GND23: "net.GND", GND24: "net.GND",
GND25: "net.GND", GND26: "net.GND", GND27: "net.GND",
GND28: "net.GND", GND29: "net.GND", GND30: "net.GND",
GND31: "net.GND", GND32: "net.GND", GND33: "net.GND",
GND34: "net.GND", GND35: "net.GND", GND36: "net.GND",
GND37: "net.GND", GND38: "net.GND", GND39: "net.GND",
GND40: "net.GND", GND41: "net.GND", GND42: "net.GND",
VBAT50: "net.BAT_P", VBAT51: "net.BAT_P", VBAT52: "net.BAT_P",
VBAT53: "net.BAT_P", VBAT54: "net.BAT_P",
GND55: "net.GND", GND56: "net.GND", GND57: "net.GND",
GND58: "net.GND", GND59: "net.GND",
}}
/>
{/* BG95 VBAT bulk decoupling (100µF + 4.7µF recommended by Quectel HW guide) */}
<capacitor name="C_BG95_BAT1" capacitance="4.7uF" footprint="0402" pcbX={32.1} pcbY={36} connections={{ pin1: "net.BAT_P", pin2: "net.GND" }} />
<capacitor name="C_BG95_BAT2" capacitance="4.7uF" footprint="0402" pcbX={18} pcbY={48} connections={{ pin1: "net.BAT_P", pin2: "net.GND" }} />
<capacitor name="C_BG95_BAT3" capacitance="10uF" footprint="0603" pcbX={3.9} pcbY={39.5} connections={{ pin1: "net.BAT_P", pin2: "net.GND" }} />
<capacitor name="C_BG95_UART" capacitance="100nF" footprint="0402" pcbX={21.5} pcbY={21.9} connections={{ pin1: "net._3V3", pin2: "net.GND" }} />
{/* ────────────── eSIM (U8) — MFF2 Murata SC20-FP ───────────────────
ETSI MFF2 6-contact footprint (5×6mm body).
Pin1=VCC, Pin2=RST, Pin3=CLK, Pin4=GND, Pin5=VPP, Pin6=I/O
Ties directly to BG95 USIM_* signals. VPP=NC (not used in LTE-M).
──────────────────────────────────────────────────────────────────── */}
<chip
name="U8"
pcbX={38}
pcbY={36}
pinLabels={{
pin1: "VCC",
pin2: "RST",
pin3: "CLK",
pin4: "GND",
pin5: "VPP",
pin6: "IO",
}}
footprint={esimFootprint()}
connections={{
VCC: "net.ESIM_VCC",
RST: "net.ESIM_RST",
CLK: "net.ESIM_CLK",
GND: "net.GND",
VPP: "net.GND", // VPP not used in 3GPP LTE-M / NB-IoT
IO: "net.ESIM_DATA",
}}
/>
{/* eSIM VCC decoupling — 100nF as close to U8 as possible */}
<capacitor name="C_ESIM_VCC" capacitance="100nF" footprint="0402" pcbX={43.6} pcbY={36} connections={{ pin1: "net.ESIM_VCC", pin2: "net.GND" }} />
{/* ════════════════════════════════════════════════════════════════════
GROUND POURS — top + bottom GND fill (return paths, shielding, EMI)
boardEdgeMargin=1.5mm doubles as the IP68 over-mold keepout (no copper
within 1.5mm of edge so potting bonds to bare FR-4).
════════════════════════════════════════════════════════════════════ */}
<copperpour name="GP_TOP" layer="top" connectsTo="net.GND" boardEdgeMargin="1.5mm" clearance="0.2mm" />
<copperpour name="GP_BOTTOM" layer="bottom" connectsTo="net.GND" boardEdgeMargin="1.5mm" clearance="0.2mm" />
{/* ════════════════════════════════════════════════════════════════════
KEEPOUTS — RF antenna clear zone + IP68 over-mold ring
════════════════════════════════════════════════════════════════════ */}
{/* BG95 antenna keepout: 5mm radius around antenna pin (north of U2).
Quectel BG95 HW Design §5.1 requires no copper / no traces under or
near MAIN_ANT pad. U2 center=(18,36); antenna pin is at the module's
north edge; 5mm radius around (18,46) covers the antenna trace zone. */}
<keepout shape="circle" radius="5mm" pcbX={18} pcbY={46} />
{/* IP68 over-mold ring: 1.5mm strip along all 4 board edges so the
TPU/silicone potting can grip bare FR-4 around the perimeter without
any copper leaching contact. Authored frame is 0..50 (group offset -25,-25). */}
<keepout shape="rect" pcbX={25} pcbY={49.25} width="50mm" height="1.5mm" />
<keepout shape="rect" pcbX={25} pcbY={0.75} width="50mm" height="1.5mm" />
<keepout shape="rect" pcbX={0.75} pcbY={25} width="1.5mm" height="50mm" />
<keepout shape="rect" pcbX={49.25} pcbY={25} width="1.5mm" height="50mm" />
{/* ════════════════════════════════════════════════════════════════════
RF ANTENNA FEED — BG95 MAIN_ANT → π-network → Antenova SR4L054
Signal flow (shared net naming, connections-prop style):
net.RF_NODE_A (BG95 antenna pad) →
L_ANT_S (series 2.7nH) →
net.RF_NODE_B (junction: shunt C_ANT_SH to GND) →
L_ANT_S2 (series 2.7nH) →
net.ANT_FEED → ANT1.FEED
Placement rationale:
U2 LGA96 (23.6×19.9mm) center=(18,36) → north edge y≈45.95.
Components placed at y=46.3–48.0, x=21–23 to clear:
- U2 footprint boundary (y<45.95)
- C_BG95_BAT2 at (18,48)
- IP68 north keepout (y>48.5)
BG95 has no discrete ANT pin in this footprint model; RF_NODE_A
is the intended feedpoint net for the BG95 antenna pad (MAIN_ANT).
Reference: Antenova SR4L054 datasheet pp.6-8; Quectel BG95 HW §5.1.
════════════════════════════════════════════════════════════════════ */}
{/* π-match series element 1 — 2.7nH 0402 (RF feedline between BG95 ant pad and shunt junction) */}
<inductor
name="L_ANT_S"
inductance="2.7nH"
footprint="0402"
pcbX={21}
pcbY={46.3}
connections={{ pin1: "net.RF_NODE_A", pin2: "net.RF_NODE_B" }}
/>
{/* π-match shunt element — 1.5pF 0402 (shunt to GND at junction between the two series inductors) */}
<capacitor
name="C_ANT_SH"
capacitance="1.5pF"
footprint="0402"
pcbX={23}
pcbY={46.3}
connections={{ pin1: "net.RF_NODE_B", pin2: "net.GND" }}
/>
{/* π-match series element 2 — 2.7nH 0402 (RF feedline from junction to chip antenna) */}
<inductor
name="L_ANT_S2"
inductance="2.7nH"
footprint="0402"
pcbX={21}
pcbY={47.1}
connections={{ pin1: "net.RF_NODE_B", pin2: "net.ANT_FEED" }}
/>
{/* Antenova SR4L054 chip antenna — 0805 body, pre-tuned LTE-M/NB-IoT.
JLCPCB part C2845812. Pin1=FEED, Pin2=GND. Placed north of π-match,
east of C_BG95_BAT2 (18,48) to avoid collision. */}
<chip
name="ANT1"
footprint="0805"
pcbX={22}
pcbY={48.0}
pinLabels={{ "1": "FEED", "2": "GND" }}
connections={{
FEED: "net.ANT_FEED",
GND: "net.GND",
}}
/>
{/* ════════════════════════════════════════════════════════════════════
GROUND STITCHING VIAS — antenna feed return path continuity
All vias are outside U2 footprint (x<6.2 or x>29.8 or y>45.95)
and outside IP68 north keepout (y<48.5).
Keepout circle (18,46) r=5mm is a copper-pour exclusion, not a
component exclusion — vias in the antenna zone are intentional.
Via spec: 0.3mm hole / 0.6mm pad (micro-via capable on JLCPCB).
════════════════════════════════════════════════════════════════════ */}
{/* West column of BG95 — outside footprint (x=5 < 6.2) */}
<via fromLayer="top" toLayer="bottom" holeDiameter="0.3mm" outerDiameter="0.6mm" pcbX={5} pcbY={37} connectsTo="net.GND" />
<via fromLayer="top" toLayer="bottom" holeDiameter="0.3mm" outerDiameter="0.6mm" pcbX={5} pcbY={40} connectsTo="net.GND" />
<via fromLayer="top" toLayer="bottom" holeDiameter="0.3mm" outerDiameter="0.6mm" pcbX={5} pcbY={43} connectsTo="net.GND" />
{/* East column of BG95 — outside footprint (x=31 > 29.8) */}
<via fromLayer="top" toLayer="bottom" holeDiameter="0.3mm" outerDiameter="0.6mm" pcbX={31} pcbY={37} connectsTo="net.GND" />
<via fromLayer="top" toLayer="bottom" holeDiameter="0.3mm" outerDiameter="0.6mm" pcbX={31} pcbY={40} connectsTo="net.GND" />
<via fromLayer="top" toLayer="bottom" holeDiameter="0.3mm" outerDiameter="0.6mm" pcbX={31} pcbY={43} connectsTo="net.GND" />
{/* North antenna feed zone — outside keepout circle (18,46) r=5; x=12 and x=24 give dist≈6.1 */}
<via fromLayer="top" toLayer="bottom" holeDiameter="0.3mm" outerDiameter="0.6mm" pcbX={12} pcbY={47} connectsTo="net.GND" />
<via fromLayer="top" toLayer="bottom" holeDiameter="0.3mm" outerDiameter="0.6mm" pcbX={24} pcbY={47} connectsTo="net.GND" />
<via fromLayer="top" toLayer="bottom" holeDiameter="0.3mm" outerDiameter="0.6mm" pcbX={12} pcbY={48.2} connectsTo="net.GND" />
<via fromLayer="top" toLayer="bottom" holeDiameter="0.3mm" outerDiameter="0.6mm" pcbX={24} pcbY={48.2} connectsTo="net.GND" />
{/* BG95 south-edge return path (y=25.5, just below U2 footprint south edge y≈26.05) */}
<via fromLayer="top" toLayer="bottom" holeDiameter="0.3mm" outerDiameter="0.6mm" pcbX={14} pcbY={25.5} connectsTo="net.GND" />
<via fromLayer="top" toLayer="bottom" holeDiameter="0.3mm" outerDiameter="0.6mm" pcbX={22} pcbY={25.5} connectsTo="net.GND" />
</group>
</board>
)