diff --git a/PCB/GPIO_table.md b/PCB/GPIO_table.md index b762ec0..49ca17f 100644 --- a/PCB/GPIO_table.md +++ b/PCB/GPIO_table.md @@ -45,13 +45,12 @@ don't need hardware debugging): |---|---| | 32 (GPIO39) | MTCK | | 33 (GPIO40) | MTDO | -| 34 (GPIO41) | MTDI | | 35 (GPIO42) | MTMS | ## XBee Auxiliary Pins | Pin | Reason | |---|---| -| 22 (GPIO18) | XBee ON_SLEEP status input | +| 22 (GPIO14) | XBee ON_SLEEP status input | | 8 (GPIO15) | XBee SPI_ATTN — data-ready interrupt, needed for reliable SPI transfers | Pulled directly from Amidala's actual AmidalaShield netlist (IPC-2581 @@ -68,7 +67,7 @@ board now, so the pin roles map over conceptually). | XBee MOSI | 19 (GPIO11) | | XBee MISO | 20 (GPIO12) | | XBee CS | 21 (GPIO13) | -| XBee ON_SLEEP | 22 (GPIO18) | +| XBee ON_SLEEP | 22 (GPIO14) | | XBee SPI_ATTN | 8 (GPIO15) | ## I2C (OLED) @@ -102,6 +101,7 @@ board now, so the pin roles map over conceptually). | Macro button 1-6 | 24, 25, 28, 29, 30, 31 (GPIO47, 48, 35, 36, 37, 38) | Internal pull-up, active low — direct-wired, no scan matrix | | Power button sense | 38 (GPIO2) | Input, monitors for 3-second hold | | Charge status STAT1 (bq25185) | 39 (GPIO1) | Open-drain input, 10kΩ pull-up to 3V3 | +| Charge status STAT2 (bq25185) | 34 (GPIO41) | Open-drain input, 10kΩ pull-up to 3V3 — with STAT1, fully decodes charging/done/fault | | Power latch hold | 36 (GPIO44) | Output, driven HIGH on boot to hold soft latch | | RGB LED (WS2812/SK6812) | 37 (GPIO43) | RMT-driven, data line | @@ -167,6 +167,7 @@ a real layout-stage requirement, not just a schematic one. | Signal | Value | Notes | |---|---|---| | bq25185 STAT1 pin | 10kΩ | Open-drain, pull up to 3V3 | +| bq25185 STAT2 pin | 10kΩ | Open-drain, pull up to 3V3 | | I2C SDA/SCL | 4.7kΩ | **DNP for prototyping** — Adafruit #938 has onboard pull-ups. Populate only on final PCB with bare OLED panel | ### Series Resistors @@ -205,7 +206,9 @@ very first instruction in firmware or power will cut on button release. Pin 7 (ADC1_CH6) reads VSYS/3 via an external R_VSYS1/R_VSYS2 divider — same role as the RP2350 design's divider, still needed since ESP32-S3-WROOM-1 has no VSYS-style pin of its own either. bq25185 STAT1 -on pin 39 provides charge state (HIGH=idle/done, LOW=charging or fault). +(pin 39) and STAT2 (pin 34) together fully decode the charger's state: +charging, done, recoverable fault, or latched fault — see the bq25185 +datasheet's status pin table. No firmware ADC-gating workaround needed here (unlike the old bit-banged RP2350+CYW43439 design) — WiFi is fully on-die and doesn't share any @@ -214,7 +217,8 @@ exposed GPIO/ADC path with this sense pin. --- ## Spare GPIO -Pins 34-35 (GPIO41-42, default JTAG) — clean, no caveats. Pins 32/33 from -the same JTAG group are now used by BTN_VOL_DN/BTN_VOL_UP. +Pins 32/33 (GPIO39/40, default JTAG) — used by BTN_VOL_DN/BTN_VOL_UP. +Pin 34 (GPIO41, default JTAG) — used by bq25185 STAT2. +Pin 35 (GPIO42, default JTAG) — clean, no caveats, still free. Pins 15, 16, 26 (GPIO3/46/45) — usable, but strapping pins, best for a static/non-boot-critical signal. diff --git a/PCB/analysis/manifest.json b/PCB/analysis/manifest.json index b3000b5..61c01b0 100644 --- a/PCB/analysis/manifest.json +++ b/PCB/analysis/manifest.json @@ -1,7 +1,7 @@ { "version": 1, "project": "snips_controller.kicad_pro", - "current": "2026-08-23_1900-2", + "current": "2026-08-23_1949", "runs": { "2026-08-23_1553": { "source_hashes": { @@ -48,6 +48,22 @@ }, "generated": "2026-08-23T19:00:26-07:00", "pinned": false + }, + "2026-08-23_1949": { + "source_hashes": { + "snips_controller.kicad_sch": "sha256:cf90c4f3c03b85f10092538646e2b66c9e4240d9a6e33c719814f62294ab58b1", + "snips_controller.kicad_pcb": "sha256:38c2f50bd36a7de1d25692288cb3c082d2b346ac6ec2648f3e86d284d8836024" + }, + "outputs": { + "schematic": "schematic.json", + "pcb": "pcb.json", + "cross_analysis": "cross_analysis.json" + }, + "scripts": { + "schematic": "analyze_schematic.py snips_controller.kicad_sch" + }, + "generated": "2026-08-23T19:49:53-07:00", + "pinned": false } } } diff --git a/PCB/battery.kicad_sch b/PCB/battery.kicad_sch index 6382927..c797caa 100644 --- a/PCB/battery.kicad_sch +++ b/PCB/battery.kicad_sch @@ -272,20 +272,26 @@ ) ) ) - (property "MF" "JST" (at 0 0 0) + (property "MF" "JST" + (at 0 0 0) + (hide yes) + (show_name no) + (do_not_autoplace no) (effects (font (size 1.27 1.27) ) - (hide yes) ) ) - (property "Manufacturer_Part_Number" "S2B-PH-K" (at 0 0 0) + (property "Manufacturer_Part_Number" "S2B-PH-K" + (at 0 0 0) + (hide yes) + (show_name no) + (do_not_autoplace no) (effects (font (size 1.27 1.27) ) - (hide yes) ) ) (pin "1" diff --git a/PCB/buttons_direct.kicad_sch b/PCB/buttons_direct.kicad_sch index ed895c6..acb081d 100644 --- a/PCB/buttons_direct.kicad_sch +++ b/PCB/buttons_direct.kicad_sch @@ -607,20 +607,26 @@ ) ) ) - (property "MF" "Hongyuan Precision" (at 0 0 0) + (property "MF" "Hongyuan Precision" + (at 0 0 0) + (hide yes) + (show_name no) + (do_not_autoplace no) (effects (font (size 1.27 1.27) ) - (hide yes) ) ) - (property "Manufacturer_Part_Number" "1TS009A-1800-5000-CT" (at 0 0 0) + (property "Manufacturer_Part_Number" "1TS009A-1800-5000-CT" + (at 0 0 0) + (hide yes) + (show_name no) + (do_not_autoplace no) (effects (font (size 1.27 1.27) ) - (hide yes) ) ) (pin "1" @@ -701,20 +707,26 @@ ) ) ) - (property "MF" "Hongyuan Precision" (at 0 0 0) + (property "MF" "Hongyuan Precision" + (at 0 0 0) + (hide yes) + (show_name no) + (do_not_autoplace no) (effects (font (size 1.27 1.27) ) - (hide yes) ) ) - (property "Manufacturer_Part_Number" "1TS009A-1800-5000-CT" (at 0 0 0) + (property "Manufacturer_Part_Number" "1TS009A-1800-5000-CT" + (at 0 0 0) + (hide yes) + (show_name no) + (do_not_autoplace no) (effects (font (size 1.27 1.27) ) - (hide yes) ) ) (pin "1" @@ -795,20 +807,26 @@ ) ) ) - (property "MF" "Hongyuan Precision" (at 0 0 0) + (property "MF" "Hongyuan Precision" + (at 0 0 0) + (hide yes) + (show_name no) + (do_not_autoplace no) (effects (font (size 1.27 1.27) ) - (hide yes) ) ) - (property "Manufacturer_Part_Number" "1TS009A-1800-5000-CT" (at 0 0 0) + (property "Manufacturer_Part_Number" "1TS009A-1800-5000-CT" + (at 0 0 0) + (hide yes) + (show_name no) + (do_not_autoplace no) (effects (font (size 1.27 1.27) ) - (hide yes) ) ) (pin "1" @@ -889,20 +907,26 @@ ) ) ) - (property "MF" "Alps Alpine" (at 0 0 0) + (property "MF" "Alps Alpine" + (at 0 0 0) + (hide yes) + (show_name no) + (do_not_autoplace no) (effects (font (size 1.27 1.27) ) - (hide yes) ) ) - (property "Manufacturer_Part_Number" "SKRTLAE010" (at 0 0 0) + (property "Manufacturer_Part_Number" "SKRTLAE010" + (at 0 0 0) + (hide yes) + (show_name no) + (do_not_autoplace no) (effects (font (size 1.27 1.27) ) - (hide yes) ) ) (pin "1" @@ -983,20 +1007,26 @@ ) ) ) - (property "MF" "Alps Alpine" (at 0 0 0) + (property "MF" "Alps Alpine" + (at 0 0 0) + (hide yes) + (show_name no) + (do_not_autoplace no) (effects (font (size 1.27 1.27) ) - (hide yes) ) ) - (property "Manufacturer_Part_Number" "SKRTLAE010" (at 0 0 0) + (property "Manufacturer_Part_Number" "SKRTLAE010" + (at 0 0 0) + (hide yes) + (show_name no) + (do_not_autoplace no) (effects (font (size 1.27 1.27) ) - (hide yes) ) ) (pin "1" @@ -1077,20 +1107,26 @@ ) ) ) - (property "MF" "Hongyuan Precision" (at 0 0 0) + (property "MF" "Hongyuan Precision" + (at 0 0 0) + (hide yes) + (show_name no) + (do_not_autoplace no) (effects (font (size 1.27 1.27) ) - (hide yes) ) ) - (property "Manufacturer_Part_Number" "1TS009A-1800-5000-CT" (at 0 0 0) + (property "Manufacturer_Part_Number" "1TS009A-1800-5000-CT" + (at 0 0 0) + (hide yes) + (show_name no) + (do_not_autoplace no) (effects (font (size 1.27 1.27) ) - (hide yes) ) ) (pin "1" @@ -1171,20 +1207,26 @@ ) ) ) - (property "MF" "Alps Alpine" (at 0 0 0) + (property "MF" "Alps Alpine" + (at 0 0 0) + (hide yes) + (show_name no) + (do_not_autoplace no) (effects (font (size 1.27 1.27) ) - (hide yes) ) ) - (property "Manufacturer_Part_Number" "SKRTLAE010" (at 0 0 0) + (property "Manufacturer_Part_Number" "SKRTLAE010" + (at 0 0 0) + (hide yes) + (show_name no) + (do_not_autoplace no) (effects (font (size 1.27 1.27) ) - (hide yes) ) ) (pin "1" @@ -1265,20 +1307,26 @@ ) ) ) - (property "MF" "Hongyuan Precision" (at 0 0 0) + (property "MF" "Hongyuan Precision" + (at 0 0 0) + (hide yes) + (show_name no) + (do_not_autoplace no) (effects (font (size 1.27 1.27) ) - (hide yes) ) ) - (property "Manufacturer_Part_Number" "1TS009A-1800-5000-CT" (at 0 0 0) + (property "Manufacturer_Part_Number" "1TS009A-1800-5000-CT" + (at 0 0 0) + (hide yes) + (show_name no) + (do_not_autoplace no) (effects (font (size 1.27 1.27) ) - (hide yes) ) ) (pin "1" @@ -1359,20 +1407,26 @@ ) ) ) - (property "MF" "Alps Alpine" (at 0 0 0) + (property "MF" "Alps Alpine" + (at 0 0 0) + (hide yes) + (show_name no) + (do_not_autoplace no) (effects (font (size 1.27 1.27) ) - (hide yes) ) ) - (property "Manufacturer_Part_Number" "SKRTLAE010" (at 0 0 0) + (property "Manufacturer_Part_Number" "SKRTLAE010" + (at 0 0 0) + (hide yes) + (show_name no) + (do_not_autoplace no) (effects (font (size 1.27 1.27) ) - (hide yes) ) ) (pin "1" @@ -1453,20 +1507,26 @@ ) ) ) - (property "MF" "Alps Alpine" (at 0 0 0) + (property "MF" "Alps Alpine" + (at 0 0 0) + (hide yes) + (show_name no) + (do_not_autoplace no) (effects (font (size 1.27 1.27) ) - (hide yes) ) ) - (property "Manufacturer_Part_Number" "SKRTLAE010" (at 0 0 0) + (property "Manufacturer_Part_Number" "SKRTLAE010" + (at 0 0 0) + (hide yes) + (show_name no) + (do_not_autoplace no) (effects (font (size 1.27 1.27) ) - (hide yes) ) ) (pin "1" @@ -1547,20 +1607,26 @@ ) ) ) - (property "MF" "Hongyuan Precision" (at 0 0 0) + (property "MF" "Hongyuan Precision" + (at 0 0 0) + (hide yes) + (show_name no) + (do_not_autoplace no) (effects (font (size 1.27 1.27) ) - (hide yes) ) ) - (property "Manufacturer_Part_Number" "1TS009A-1800-5000-CT" (at 0 0 0) + (property "Manufacturer_Part_Number" "1TS009A-1800-5000-CT" + (at 0 0 0) + (hide yes) + (show_name no) + (do_not_autoplace no) (effects (font (size 1.27 1.27) ) - (hide yes) ) ) (pin "1" diff --git a/PCB/datasheets/BQ25185DLHR_1-Cell_Standalone_Linear_Battery_Charger.pdf b/PCB/datasheets/BQ25185DLHR_1-Cell_Standalone_Linear_Battery_Charger.pdf new file mode 100644 index 0000000..f091305 Binary files /dev/null and b/PCB/datasheets/BQ25185DLHR_1-Cell_Standalone_Linear_Battery_Charger.pdf differ diff --git a/PCB/datasheets/DMG2305UX-7_PMOS.pdf b/PCB/datasheets/DMG2305UX-7_PMOS.pdf new file mode 100644 index 0000000..2488f4d Binary files /dev/null and b/PCB/datasheets/DMG2305UX-7_PMOS.pdf differ diff --git "a/PCB/datasheets/DRV5055A2QLPGM_50_mV_mT_\302\26142-mT_20-kHz_3.3_5V_TO-92.pdf" "b/PCB/datasheets/DRV5055A2QLPGM_50_mV_mT_\302\26142-mT_20-kHz_3.3_5V_TO-92.pdf" new file mode 100644 index 0000000..4c9ef18 Binary files /dev/null and "b/PCB/datasheets/DRV5055A2QLPGM_50_mV_mT_\302\26142-mT_20-kHz_3.3_5V_TO-92.pdf" differ diff --git a/PCB/datasheets/ESP32-S3-WROOM-1-N8_WiFi_BT_module_integrated_flash+crystal+antenna_ESP32-S3_(Xtensa.pdf b/PCB/datasheets/ESP32-S3-WROOM-1-N8_WiFi_BT_module_integrated_flash+crystal+antenna_ESP32-S3_(Xtensa.pdf new file mode 100644 index 0000000..b163c4c Binary files /dev/null and b/PCB/datasheets/ESP32-S3-WROOM-1-N8_WiFi_BT_module_integrated_flash+crystal+antenna_ESP32-S3_(Xtensa.pdf differ diff --git a/PCB/datasheets/PESD5V0S1BA_Bidirectional_ESD_protection_diode.pdf b/PCB/datasheets/PESD5V0S1BA_Bidirectional_ESD_protection_diode.pdf new file mode 100644 index 0000000..affa909 Binary files /dev/null and b/PCB/datasheets/PESD5V0S1BA_Bidirectional_ESD_protection_diode.pdf differ diff --git a/PCB/datasheets/SK6812MINI-E_RGB_LED_with_integrated_controller.pdf b/PCB/datasheets/SK6812MINI-E_RGB_LED_with_integrated_controller.pdf new file mode 100644 index 0000000..ee0e3ce Binary files /dev/null and b/PCB/datasheets/SK6812MINI-E_RGB_LED_with_integrated_controller.pdf differ diff --git a/PCB/datasheets/SRN4018-2R2M_Power_Inductor.pdf b/PCB/datasheets/SRN4018-2R2M_Power_Inductor.pdf new file mode 100644 index 0000000..60265b4 Binary files /dev/null and b/PCB/datasheets/SRN4018-2R2M_Power_Inductor.pdf differ diff --git a/PCB/datasheets/TLV62569DBV_High_Efficiency_Synchronous_Buck_Converter_Adjustable_Output_0.6V-5.5V_2A.pdf b/PCB/datasheets/TLV62569DBV_High_Efficiency_Synchronous_Buck_Converter_Adjustable_Output_0.6V-5.5V_2A.pdf new file mode 100644 index 0000000..38151b9 Binary files /dev/null and b/PCB/datasheets/TLV62569DBV_High_Efficiency_Synchronous_Buck_Converter_Adjustable_Output_0.6V-5.5V_2A.pdf differ diff --git a/PCB/datasheets/XB3-24Z8UT-J_Zigbee_Modules_(802.15.4)_XBee3_2.4_Ghz_ZB_3.0_U.FL_Ant_TH_MT.pdf b/PCB/datasheets/XB3-24Z8UT-J_Zigbee_Modules_(802.15.4)_XBee3_2.4_Ghz_ZB_3.0_U.FL_Ant_TH_MT.pdf new file mode 100644 index 0000000..9d35500 Binary files /dev/null and b/PCB/datasheets/XB3-24Z8UT-J_Zigbee_Modules_(802.15.4)_XBee3_2.4_Ghz_ZB_3.0_U.FL_Ant_TH_MT.pdf differ diff --git a/PCB/datasheets/manifest.json b/PCB/datasheets/manifest.json new file mode 100644 index 0000000..466e6e3 --- /dev/null +++ b/PCB/datasheets/manifest.json @@ -0,0 +1,446 @@ +{ + "schematic": "snips_controller.kicad_sch", + "last_sync": "2026-08-24T03:08:34.440045+00:00", + "parts": { + "CC0402JRNPO9BN390": { + "manufacturer": "", + "description": "Unpolarized capacitor", + "value": "39pF", + "references": [ + "C_3V3_3" + ], + "status": "failed", + "error": "No datasheet URL or all download methods failed", + "last_attempt": "2026-08-24T03:08:22.346489+00:00" + }, + "CC0805KRX5R7BB106": { + "manufacturer": "", + "description": "Unpolarized capacitor", + "value": "10\u00b5F", + "references": [ + "C_BUCK_IN1", + "C_SYS_1", + "C_BAT1", + "C_VIN_1", + "C_OLED_1" + ], + "status": "not_found", + "error": "No LCSC results for 'CC0805KRX5R7BB106'", + "last_attempt": "2026-08-24T03:08:22.346615+00:00" + }, + "S2B-PH-K": { + "manufacturer": "", + "description": "Generic connector, single row, 01x02, script generated (kicad-library-utils/schlib/autogen/connector/)", + "value": "JST-PH_2Pin_Battery", + "references": [ + "BT1" + ], + "status": "failed", + "error": "No datasheet URL or all download methods failed", + "last_attempt": "2026-08-24T03:08:22.346236+00:00" + }, + "CC0805KRX5R7BB226": { + "manufacturer": "", + "description": "Unpolarized capacitor", + "value": "22\u00b5F", + "references": [ + "C_BUCK_OUT1" + ], + "status": "not_found", + "error": "No LCSC results for 'CC0805KRX5R7BB226'", + "last_attempt": "2026-08-24T03:08:23.329360+00:00" + }, + "CC0402KRX7R9BB104": { + "manufacturer": "", + "description": "Unpolarized capacitor", + "value": "100nF", + "references": [ + "C_DBNC1", + "C_HALL1", + "C_STICK1", + "C_XBEE_RC1", + "C_XBEE_VCC1", + "C_3V3_2", + "C_SYS_2", + "C_VIN_2", + "C_OLED_2", + "C_RGB1" + ], + "status": "failed", + "error": "No datasheet URL or all download methods failed", + "last_attempt": "2026-08-24T03:08:24.559449+00:00" + }, + "CC0603KRX5R7BB105": { + "manufacturer": "", + "description": "Unpolarized capacitor", + "value": "1\u00b5F", + "references": [ + "C_XBEE_VCC2" + ], + "status": "failed", + "error": "No datasheet URL or all download methods failed", + "last_attempt": "2026-08-24T03:08:24.560429+00:00" + }, + "CC0402JRNPO9BN470": { + "manufacturer": "", + "description": "Unpolarized capacitor", + "value": "47pF", + "references": [ + "C_XBEE_VCC3" + ], + "status": "failed", + "error": "No datasheet URL or all download methods failed", + "last_attempt": "2026-08-24T03:08:24.560398+00:00" + }, + "1N4148W-7-F": { + "manufacturer": "", + "description": "Diode, small symbol", + "value": "1N4148W", + "references": [ + "D_OR2", + "D_OR1" + ], + "status": "failed", + "error": "No datasheet URL or all download methods failed", + "last_attempt": "2026-08-24T03:08:25.585855+00:00" + }, + "SK6812MINI-E": { + "file": "SK6812MINI-E_RGB_LED_with_integrated_controller.pdf", + "manufacturer": "", + "description": "RGB LED with integrated controller", + "value": "SK6812MINI-E", + "datasheet_url": "https://cdn-shop.adafruit.com/product-files/1138/SK6812+LED+datasheet+.pdf", + "downloaded_date": "2026-08-24T03:08:25.840572+00:00", + "source": "schematic", + "status": "ok", + "references": [ + "D_RGB1" + ], + "size_bytes": 451375, + "verification": "likely" + }, + "CC0603KRX5R7BB106": { + "manufacturer": "", + "description": "Unpolarized capacitor", + "value": "10\u00b5F", + "references": [ + "C_XBEE_VCC4", + "C_3V3_1" + ], + "status": "failed", + "error": "No datasheet URL or all download methods failed", + "last_attempt": "2026-08-24T03:08:25.460805+00:00" + }, + "PESD5V0S1BA,115": { + "manufacturer": "", + "description": "Bidirectional transient-voltage-suppression diode", + "value": "PESD5V0S1BA", + "references": [ + "D_VBUS_TVS1" + ], + "status": "failed", + "error": "No datasheet URL or all download methods failed", + "last_attempt": "2026-08-24T03:08:26.322390+00:00" + }, + "2N7002LT1G": { + "manufacturer": "", + "description": "N-MOSFET transistor, gate/source/drain", + "value": "2N7002", + "references": [ + "Q_LATCH1" + ], + "status": "failed", + "error": "No datasheet URL or all download methods failed", + "last_attempt": "2026-08-24T03:08:27.043526+00:00" + }, + "TYPE-C-31-M-12": { + "manufacturer": "", + "description": "USB 2.0-only 16P Type-C Receptacle connector", + "value": "USB-C", + "references": [ + "J_USB1" + ], + "status": "failed", + "error": "No datasheet URL or all download methods failed", + "last_attempt": "2026-08-24T03:08:26.435767+00:00" + }, + "SRN4018-2R2M": { + "manufacturer": "", + "description": "Inductor", + "value": "2.2\u00b5H", + "references": [ + "L_BUCK1" + ], + "status": "failed", + "error": "No datasheet URL or all download methods failed", + "last_attempt": "2026-08-24T03:08:26.610270+00:00" + }, + "RC0402FR-07100KL": { + "manufacturer": "", + "description": "Resistor", + "value": "100k\u03a9", + "references": [ + "R_BTN_PU1", + "R_GATE1", + "R_PWR_SENSE1", + "R_VSYS2" + ], + "status": "failed", + "error": "No datasheet URL or all download methods failed", + "last_attempt": "2026-08-24T03:08:27.898173+00:00" + }, + "DMG2305UX-7": { + "manufacturer": "", + "description": "P-MOSFET transistor, gate/source/drain", + "value": "DMG2305UX", + "references": [ + "Q_PWR1" + ], + "status": "failed", + "error": "No datasheet URL or all download methods failed", + "last_attempt": "2026-08-24T03:08:27.755972+00:00" + }, + "RC0402FR-075K1L": { + "manufacturer": "", + "description": "Resistor", + "value": "5.1k\u03a9", + "references": [ + "R_CC1", + "R_CC2" + ], + "status": "not_found", + "error": "No LCSC results for 'RC0402FR-075K1L'", + "last_attempt": "2026-08-24T03:08:28.282848+00:00" + }, + "RC0402FR-07255KL": { + "manufacturer": "", + "description": "Resistor", + "value": "255k\u03a9", + "references": [ + "R_FB1" + ], + "status": "failed", + "error": "No datasheet URL or all download methods failed", + "last_attempt": "2026-08-24T03:08:28.603506+00:00" + }, + "RC0402FR-0756K2L": { + "manufacturer": "", + "description": "Resistor", + "value": "56.2k\u03a9", + "references": [ + "R_FB2" + ], + "status": "failed", + "error": "No datasheet URL or all download methods failed", + "last_attempt": "2026-08-24T03:08:28.742413+00:00" + }, + "RC0402FR-0710KL": { + "manufacturer": "", + "description": "Resistor", + "value": "10k\u03a9", + "references": [ + "R_LATCH_G1", + "R_XBEE_RST1", + "R_BOOT_PU1", + "R_EN_PU1", + "R_STAT1", + "R_TS1" + ], + "status": "failed", + "error": "No datasheet URL or all download methods failed", + "last_attempt": "2026-08-24T03:08:29.583038+00:00" + }, + "RC0402FR-07330RL": { + "manufacturer": "", + "description": "Resistor", + "value": "330\u03a9", + "references": [ + "R_RGB1" + ], + "status": "failed", + "error": "No datasheet URL or all download methods failed", + "last_attempt": "2026-08-24T03:08:29.724727+00:00" + }, + "RC0402FR-0727RL": { + "manufacturer": "", + "description": "Resistor", + "value": "27\u03a9", + "references": [ + "R_USB_DP1", + "R_USB_DM1" + ], + "status": "failed", + "error": "No datasheet URL or all download methods failed", + "last_attempt": "2026-08-24T03:08:30.281466+00:00" + }, + "RC0402FR-0718KL": { + "manufacturer": "", + "description": "Resistor", + "value": "18k\u03a9", + "references": [ + "R_VSET1" + ], + "status": "failed", + "error": "No datasheet URL or all download methods failed", + "last_attempt": "2026-08-24T03:08:30.459227+00:00" + }, + "RC0402FR-07600RL": { + "manufacturer": "", + "description": "Resistor", + "value": "600\u03a9", + "references": [ + "R_ISET1" + ], + "status": "not_found", + "error": "No LCSC results for 'RC0402FR-07600RL'", + "last_attempt": "2026-08-24T03:08:28.973473+00:00" + }, + "RC0402FR-07200KL": { + "manufacturer": "", + "description": "Resistor", + "value": "200k\u03a9", + "references": [ + "R_VSYS1" + ], + "status": "failed", + "error": "No datasheet URL or all download methods failed", + "last_attempt": "2026-08-24T03:08:31.029805+00:00" + }, + "RC0402FR-07100RL": { + "manufacturer": "", + "description": "Resistor", + "value": "100\u03a9", + "references": [ + "R_XBEE_RC1" + ], + "status": "failed", + "error": "No datasheet URL or all download methods failed", + "last_attempt": "2026-08-24T03:08:31.232314+00:00" + }, + "EVQP2T02M": { + "manufacturer": "", + "description": "Push button switch, generic, two pins", + "value": "Panasonic_EVQP2", + "references": [ + "SW_BOOT1" + ], + "status": "failed", + "error": "No datasheet URL or all download methods failed", + "last_attempt": "2026-08-24T03:08:31.411919+00:00" + }, + "SKRTLAE010": { + "manufacturer": "", + "description": "Push button switch, generic, two pins", + "value": "Alps_SKRTLAE010", + "references": [ + "SW_PWR1", + "SW_TRIG_DIG1", + "SW_VOL_DN1", + "SW_THR_UP1", + "SW_VOL_UP1", + "SW_THR_DN1" + ], + "status": "failed", + "error": "No datasheet URL or all download methods failed", + "last_attempt": "2026-08-24T03:08:31.957065+00:00" + }, + "TLV62569DBV": { + "file": "TLV62569DBV_High_Efficiency_Synchronous_Buck_Converter_Adjustable_Output_0.6V-5.5V_2A.pdf", + "manufacturer": "", + "description": "High Efficiency Synchronous Buck Converter, Adjustable Output 0.6V-5.5V, 2A, SOT-23-5", + "value": "TLV62569", + "datasheet_url": "http://www.ti.com/lit/ds/symlink/tlv62569.pdf", + "downloaded_date": "2026-08-24T03:08:32.646942+00:00", + "source": "schematic", + "status": "ok", + "references": [ + "U_BUCK1" + ], + "size_bytes": 1357133, + "verification": "verified" + }, + "1TS009A-1800-5000-CT": { + "manufacturer": "", + "description": "Push button switch, generic, two pins", + "value": "6x6x5mm SMD Tactile", + "references": [ + "SW_MACRO1", + "SW_MACRO2", + "SW_MACRO5", + "SW_MACRO3", + "SW_MACRO4", + "SW_MACRO6" + ], + "status": "failed", + "error": "No datasheet URL or all download methods failed", + "last_attempt": "2026-08-24T03:08:31.787112+00:00" + }, + "BQ25185DLHR": { + "manufacturer": "Texas Instruments", + "description": "1-cell, 1-A stand-alone linear battery charger with power path and solar input support", + "value": "bq25185", + "references": [ + "U_CHG1" + ], + "status": "failed", + "error": "No datasheet URL or all download methods failed", + "last_attempt": "2026-08-24T03:08:32.726786+00:00" + }, + "ESP32-S3-WROOM-1-N8": { + "file": "ESP32-S3-WROOM-1-N8_WiFi_BT_module_integrated_flash+crystal+antenna_ESP32-S3_(Xtensa.pdf", + "manufacturer": "", + "description": "WiFi/BT module, integrated flash+crystal+antenna, ESP32-S3 (Xtensa dual-core, native USB)", + "value": "ESP32-S3-WROOM-1-N8", + "datasheet_url": "https://www.espressif.com/sites/default/files/documentation/esp32-s3-wroom-1_wroom-1u_datasheet_en.pdf", + "downloaded_date": "2026-08-24T03:08:33.382326+00:00", + "source": "schematic", + "status": "ok", + "references": [ + "U_MCU1" + ], + "size_bytes": 1280501, + "verification": "verified" + }, + "DRV5055A2QLPGM": { + "file": "DRV5055A2QLPGM_50_mV_mT_\u00b142-mT_20-kHz_3.3_5V_TO-92.pdf", + "manufacturer": "", + "description": "50 mV/mT,\u00b142-mT, 20-kHz, 3.3/5V, TO-92", + "value": "DRV5055A2", + "datasheet_url": "https://www.ti.com/lit/ds/symlink/drv5055-q1.pdf", + "downloaded_date": "2026-08-24T03:08:33.333686+00:00", + "source": "schematic", + "status": "ok", + "references": [ + "U_HALL1" + ], + "size_bytes": 1322741, + "verification": "likely" + }, + "SM04B-SRSS-TB": { + "manufacturer": "", + "description": "Generic 4-pin I2C SSD1306 OLED breakout module (VCC, GND, SCL, SDA). Hand-authored project-local symbol, no vendor-specific pinout assumed.", + "value": "JST-SH_4Pin_OLED", + "references": [ + "U_OLED1" + ], + "status": "failed", + "error": "No datasheet URL or all download methods failed", + "last_attempt": "2026-08-24T03:08:33.518185+00:00" + }, + "XB3-24Z8UT-J": { + "file": "XB3-24Z8UT-J_Zigbee_Modules_(802.15.4)_XBee3_2.4_Ghz_ZB_3.0_U.FL_Ant_TH_MT.pdf", + "manufacturer": "", + "description": "Zigbee Modules (802.15.4) XBee3,2.4 Ghz ZB 3.0, U.FL Ant, TH MT", + "value": "XBee3", + "datasheet_url": "https://componentsearchengine.com/Datasheets/1/XB3-24Z8UT-J.pdf", + "downloaded_date": "2026-08-24T03:08:33.567713+00:00", + "source": "schematic", + "status": "ok", + "references": [ + "U_XBEE1" + ], + "size_bytes": 302985, + "verification": "verified" + } + } +} \ No newline at end of file diff --git a/PCB/design-review-2026-08-23.md b/PCB/design-review-2026-08-23.md index 05fc747..60a4481 100644 --- a/PCB/design-review-2026-08-23.md +++ b/PCB/design-review-2026-08-23.md @@ -1,161 +1,179 @@ -# SnipsControllers PCB — Design Review (Updated) -**Date:** 2026-08-23 (rev 2) | **Analyzer:** kicad-happy v2.2.0 | **Run:** 2026-08-23_1900 / 2026-08-23_1900-2 | **Prior run:** 2026-08-23_1553 - -## Delta Since Prior Review - -| # | Item | Status | -|---|---|---| -| BUG-001 | R_FB1 100kΩ→255kΩ — buck now outputs **3.322V** | ✅ Fixed | -| HIGH-001 | VBUS TVS added (PESD5V0S1BA, SOD-323, B.Cu) | ✅ Fixed | -| HIGH-003 | Fiducials added — FD-001 cleared on both faces | ✅ Fixed | -| HIGH-004 | Via in pad U_MCU1:4 — VP-001 gone | ✅ Fixed | -| HIGH-005 | SW_BOOT1 moved inboard (0.0mm→0.5mm, now warning) | ✅ Improved | -| MED-003 | SPI_SCK stitching vias added — SPI_SCK gone from GP-001/RP-001 | ✅ Fixed | -| INFO-013 | C_3V3_3 39pF added near MCU for 955MHz PDN gap | ✅ Fixed | -| — | SW_BOOT1 now overlaps XBee courtyard after inboard move | ⚠ New | -| — | SPI_MOSI now appears in GP-001 (91%, 75mm) | ⚠ New | - ---- +# SnipsControllers PCB — Design Review +**Date:** 2026-08-23 | **Analyzer:** kicad-happy v2.2.0 | **Run:** 2026-08-23_1949 ## Overview | | | |---|---| | **Board** | 35.0 × 99.9mm, 4-layer | -| **Stackup** | F.Cu (signal) / In1.Cu (3V3 plane, 83%) / In2.Cu (GND plane, 85%) / B.Cu (signal) | -| **Components** | 71 schematic, 81 PCB footprints (10 mechanical/fiducials) | -| **Routing** | Complete (111 vias, 0 unrouted) | -| **Verification basis** | Internal consistency only — **0 datasheets, 70/71 parts missing MPN** | +| **Stackup** | F.Cu (signal) / In1.Cu (3V3 plane, 83% fill) / In2.Cu (GND plane, 85% fill) / B.Cu (signal) | +| **Components** | 71 schematic, 81 PCB footprints (includes fiducials and mechanical) | +| **Routing** | Complete — 109 vias, 0 unrouted nets | +| **MPN coverage** | 70/71 (J_STICK1 is a custom part with no standard MPN — expected) | +| **Verification basis** | MPN-level consistency — no datasheets synced yet, so no pin-level or value verification against manufacturer specs | --- -## Remaining Blockers +## Schematic -### BUG-002 · Missing MPNs on 70 of 71 components (SS-001) +**No errors.** 10 warnings — all either false positives or accepted design decisions (detailed below). -Pre-fab gate: cannot order. Note — D_VBUS_TVS1 was placed with value `PESD5V0S1BA` but the MPN property in the KiCad symbol is not populated; the part counter still shows 1/71 with MPN. Populate the `MPN` field in the schematic symbol to close this. +### False positives ---- +**PU-001 — XBee RESET pull-up:** The analyzer flags U_XBEE1 pin RESET for a missing pull-up. This is incorrect — R_XBEE_RST1 pulls XBEE_RESET to 3V3 through XBEE_RST_PU, with R_XBEE_RC1/C_XBEE_RC1 forming a 159Hz debounce RC. Pull-up is present. -## High +**PU-001 — BQ25185 TS/MR:** R_TS1 = 10kΩ to GND is intentional. This disables the NTC thermistor function on the charger. If a battery NTC is added later, replace R_TS1 with a 10kΩ NTC. -### HIGH-002 · BQ25185 STAT2 pin floating (PU-001) +**RS-001 — PWR_GATE, PWR_LATCH_G, PWR_BTN_SENSE, PWR_EN, PWR_HOLD, VSYS_SENSE:** These rails are driven by discrete logic (FETs, diodes) or MCU GPIO. The analyzer cannot trace sourcing through passive topology for these nets. Add `PWR_FLAG` symbols if ERC cleanliness is important; no functional issue. -Unchanged. STAT2 (pin 3) → NO_CONNECT. If not monitoring charging state via STAT2, add a DNP pull-up (4.7kΩ to 3V3) so the open-drain output isn't left floating. +### Accepted open items ---- +**PU-001 — BQ25185 STAT2:** STAT2 (open-drain) → NO_CONNECT. Acceptable if STAT2 status monitoring is not needed. If it causes noise concerns later, add a DNP 4.7kΩ pull-up to 3V3. -## Medium +**DS-002 — No datasheets synced:** 70/71 MPNs are now populated. Syncing datasheets (via DigiKey/LCSC scripts) would enable pin-level verification and decoupling adequacy checks against manufacturer specs. Not blocking for prototype. -### MED-001 · XBee courtyard overlaps — now 8 components (PM-001) +--- -One new overlap added this revision: SW_BOOT1 (1.562mm²) now overlaps U_XBEE1's courtyard after being moved inboard. This is the root-cause problem — the XBee courtyard is very large (likely includes the RF keepout zone). **The fix is to correct the footprint courtyard** to the physical module outline only (not the RF keepout), then enforce the keepout separately with a rule area. Once that's done, all 8 overlaps should clear. +## Power Tree -Affected: C_XBEE_RC1, C_XBEE_VCC1–4, R_XBEE_RC1, R_XBEE_RST1, SW_BOOT1, REF** (fiducial, 0mm² — effectively touching). +``` +VBUS (USB-C J_USB1) + ├─ D_VBUS_TVS1 (PESD5V0S1BA, SOD-323) → GND [ESD clamp] + └─ U_CHG1 (BQ25185DLHR) + IN=VBUS → SYS=VSYS | BAT=VBAT ← BT1 (Li-Ion battery) + R_ISET1=600Ω (charge current — verify against BQ25185 datasheet) + R_VSET1=18kΩ (charge voltage set — verify against datasheet) + R_TS1=10kΩ→GND (NTC disabled) + STAT1 → R_STAT1 (10kΩ) → 3V3, read by MCU GPIO1 + STAT2 → NO_CONNECT + +VSYS → Power latch + SW_PWR1 (button) → D_OR1 → PWR_LATCH_G → Q_LATCH1.G (2N7002 NMOS) + MCU GPIO44 (PWR_HOLD) → D_OR2 → PWR_LATCH_G + Q_LATCH1.D → PWR_GATE → Q_PWR1.G (DMG2305UX PMOS) + Q_PWR1: S=VSYS, D=PWR_EN → U_BUCK1.EN + R_GATE1=100kΩ VSYS→PWR_GATE (pull-up, keeps PMOS off by default) + R_LATCH_G1=10kΩ PWR_LATCH_G→GND (pull-down, keeps NMOS off by default) + +VSYS → U_BUCK1 (TLV62569, switching 500kHz) → 3V3 + R_FB1=255kΩ / R_FB2=56.2kΩ → Vout = 3.322V (Vref=0.6V) + L_BUCK1=2.2µH (Bourns SRN4018) + Cin: 10µF + 10µF + 100nF (VSYS rail) + Cout: 22µF + 3×10µF + 1µF + 5×100nF + 47pF (3V3 rail) + Tj=64°C at 25°C ambient, margin 61°C to Tj_max ✓ thermal OK + +3V3 load estimate: + ESP32-S3-WROOM-1-N8 (U_MCU1) 240mA + XBee 3 (U_XBEE1) 10mA + DRV5055A2 (U_HALL1) 5mA + OLED connector (U_OLED1) 10mA + ───────────────────────────────────── + Total 265mA +``` -### MED-002 · Edge-mounted switch overhang (PM-002) +### Firmware notes -Unchanged. SW_PWR1 (0.35mm), SW_THR_DN1 / SW_THR_UP1 / SW_TRIG_DIG1 (0.55mm), SW_VOL_DN1 / SW_VOL_UP1 (0.5mm), U_HALL1 (0.27mm). If intentionally edge-mounted for a controller form factor, suppress these in KiCad's DRC configuration. C_OLED_1 (0.8mm) and D_RGB1 (0.5mm) remain close to edge as warnings. +- **PWR_HOLD must be asserted immediately on boot.** GPIO44 defaults to high-impedance. While it floats, D_OR2 does not conduct and the system stays powered only while the button is physically held via D_OR1. Firmware must drive PWR_HOLD high in `app_main()` before yielding to the RTOS scheduler. +- **GPIO44 = U0RXD conflict.** The ESP32-S3 uses GPIO44 as UART0 RX during serial flashing. Configure GPIO44 as a push-pull output only after the UART boot window has closed to avoid conflicting with the programmer's TX line. -### MED-003 · SPI_MOSI reference plane coverage 91%, 75mm (GP-001) — new this revision +--- -SPI_SCK is fully resolved. SPI_MOSI is a new (softer) appearance in GP-001 at 91% coverage over 74.9mm. At 91% the gap is small, but given SPI_MOSI runs nearly the full board length, add a stitching via near any F.Cu↔B.Cu layer transition on this net. Priority is lower than SPI_SCK was. +## Signal Analysis -### MED-004 · No test points (TE-001) +**USB-C:** CC1/CC2 pull-downs R_CC1=R_CC2=5.1kΩ to GND — correct sink identification. D+/D- connected to MCU GPIO19/20 (native USB PHY) through 27Ω series resistors — appropriate for USB FS. -Unchanged — 0% coverage. Add test points on: GND, 3V3, VSYS, VBAT, VBUS, USB_DP_MCU/DM_MCU, SPI_SCK/MOSI/MISO, I2C_SDA/SCL, MCU_EN. +**SPI (XBee):** MOSI/MISO/SCK/CS on ESP32-S3 hardware SPI pins (GPIO10–13). XBee decoupling: 4×VCC caps (100nF×2, 1µF, 10µF), RC reset filter (159Hz), SPI attention line to MCU GPIO15. ---- +**I2C (OLED):** GPIO8=SDA, GPIO9=SCL. Analyzer did not detect I2C pull-up resistors — verify pull-ups are present (typically 4.7kΩ to 3V3 for 400kHz operation). -## Power Tree +**Analog:** TRIG_ANALOG (DRV5055A2 hall sensor) → GPIO4/ADC1_CH3. STICK_X/Y (GuliKit thumbstick) → GPIO5–6/ADC1_CH4–5. VSYS_SENSE (R_VSYS1=200kΩ / R_VSYS2=100kΩ divider, VSYS/3) → GPIO7/ADC1_CH6. -``` -VBUS (USB-C J_USB1) - ├─ D_VBUS_TVS1 (PESD5V0S1BA) → GND ✅ new ESD clamp - └─ BQ25185 (U_CHG1) → VSYS - R_ISET1=600Ω R_VSET1=18kΩ R_TS1=10kΩ→GND (NTC disabled) - STAT1 → 10kΩ pull-up → MCU GPIO1 | STAT2 → NC (open-drain floating) - VBAT ← BT1 (battery) - -VSYS → U_BUCK1 (TLV62569) → 3V3 ✅ corrected - R_FB1=255kΩ / R_FB2=56.2kΩ → Vout=3.322V (Vref=0.6V, heuristic) - L=2.2µH SRN4018, f=500kHz - Tj=64°C, margin 61°C to Tj_max ✅ thermal OK - Estimated load: ESP32-S3 (240mA) + XBee3 (10mA) + DRV5055A2 (5mA) + OLED (10mA) = 265mA -``` +**RGB LED:** D_RGB1 data in from GPIO43 via R_RGB1. + +**RC filters:** R_XBEE_RC1/C_XBEE_RC1 at 15.9kHz (SPI line filter), R_XBEE_RST1/C_XBEE_RC1 at 159Hz (reset debounce). --- ## PCB Layout -| Metric | Prior | Now | Status | -|---|---|---|---| -| Routing | Complete | Complete | OK | -| Vias | 110 | 111 | OK (+1 SPI_SCK stitch) | -| Fiducials F.Cu | 0 | ≥1 | ✅ | -| Fiducials B.Cu | 0 | ≥1 | ✅ | -| Via in pad U_MCU1:4 | Untented | Resolved | ✅ | -| SW_BOOT1 edge clearance | 0.0mm (error) | 0.5mm (warning) | Improved | -| XBee courtyard overlaps | 7 | 8 | ⚠ +SW_BOOT1 | -| Test points | 0% | 0% | Open | +| Metric | Value | Status | +|---|---|---| +| Board dimensions | 35.0 × 99.9mm | — | +| Copper layers | 4 | — | +| Routing | 100% complete | ✓ | +| DFM tier | Standard | ✓ | +| DRC violations | 0 | ✓ | +| Min track width | 0.2mm | ✓ | +| Min drill | 0.3mm | ✓ | +| Min annular ring | 0.15mm | ✓ | +| Fiducials | ≥1 per face | ✓ | +| Test points | 0% coverage | Open | +| XBee courtyard overlaps | 8 components | Accepted (see below) | +| Edge switch overhangs | 7 instances | Accepted (see below) | ---- +### Accepted placement findings -## EMC Assessment +**XBee courtyard overlaps (PM-001):** C_XBEE_RC1, C_XBEE_VCC1–4, R_XBEE_RC1, R_XBEE_RST1, SW_BOOT1, and REF** (fiducial) all overlap the U_XBEE1 courtyard. Root cause: the XBee footprint courtyard encompasses the RF keepout zone rather than just the physical module outline. The decoupling components are correctly positioned for the module; the courtyard definition is the inaccuracy. If fab-submitted as-is, assembly will not be affected. **Suppress these in DRC** or correct the footprint courtyard to the physical module boundary and enforce the RF keepout separately as a rule area. + +**Edge-mounted switches (PM-002):** SW_PWR1 (0.35mm overhang), SW_THR_DN1 / SW_THR_UP1 / SW_TRIG_DIG1 (0.55mm), SW_VOL_DN1 / SW_VOL_UP1 (0.5mm), U_HALL1 (0.27mm from edge), SW_BOOT1 (0.5mm from edge) are all intentionally placed at or near the board edge for a handheld controller form factor. C_OLED_1 (0.8mm) and D_RGB1 (0.5mm) are near-edge warnings. **Suppress these in DRC** with a board-edge clearance exception. -| Signal | Coverage | Length | Severity | Notes | -|---|---|---|---|---| -| XBEE_RESET | 25% | 2.6mm | Error | Short; low absolute risk | -| BTN_THR_UP | 68% | 24mm | Error | Button line; low speed | -| I2C_SCL | 73% | 19mm | Error | Low speed; tolerable | -| BTN_MACRO1 | 75% | 38mm | Error | Button line | -| TRIG_ANALOG | 77% | 27mm | Error | ADC; low frequency | -| SPI_SCK | — | — | ✅ Resolved | Stitching vias added | -| SPI_MOSI | 91% | 75mm | Warning | New; add stitch via | -| SU-001 stackup | — | — | False positive | Inner layers are 3V3+GND planes | -| U_BUCK1 harmonics 30–88MHz | — | — | Info | Inherent; add ferrite if needed | +**REF** in PCB not in schematic (XV-001):** Expected — fiducial markers are PCB-only. No action needed. -**Stackup note:** SU-001 "adjacent signal layers" errors are false positives. In1.Cu is a 3V3 copper pour (83% fill), In2.Cu is a GND copper pour (85% fill). Standard 4-layer stackup: signal / power / ground / signal. +### Open item + +**Test points (TE-001):** 0% net coverage. Recommend adding test points before production on: GND, 3V3, VSYS, VBAT, VBUS, USB_DP_MCU / USB_DM_MCU, SPI_SCK / MOSI / MISO, I2C_SDA / SCL, MCU_EN. --- -## Thermal +## EMC Assessment -U_BUCK1 (TLV62569): Tj = **64°C** at 25°C ambient, 61°C margin to Tj_max. No other components flagged. Thermal is clean. +This is a handheld consumer device with no FCC/CE certification requirement indicated. EMC findings are noted for awareness; none are blocking for prototype. ---- +**Stackup (SU-001 — false positive):** The analyzer flags F.Cu, In1.Cu, In2.Cu, and B.Cu as all "signal" type and reports adjacent signal layer crosstalk. In reality In1.Cu is a 3V3 copper pour (83% fill) and In2.Cu is a GND copper pour (85% fill). The stackup is correct: signal / power plane / ground plane / signal. KiCad stores copper-pour planes as "signal" type, which confuses the EMC analyzer. These three SU-001 findings can be disregarded. -## Schematic Quality +**Ground plane coverage (GP-001):** Several signals cross areas where the In1.Cu (3V3) and In2.Cu (GND) planes don't fully overlap, creating return current detours. The affected signals are all low-speed (button GPIO, I2C at 400kHz, analog ADC inputs) — radiated risk is low in practice. -| Finding | Status | -|---|---| -| PWR_FLAG missing on VBAT, VBUS, PWR_* rails (RS-001) | Open | -| STAT2 floating (HIGH-002 above) | Open | -| D_VBUS_TVS1 MPN field not populated | Open | -| XBee RESET pull-up PU-001 | False positive (R_XBEE_RST1 to 3V3 provides pull-up) | -| BQ25185 TS/MR PU-001 | False positive (R_TS1=10kΩ to GND intentionally disables NTC) | +| Signal | Coverage | Length | Risk | +|---|---|---|---| +| XBEE_RESET | 25% | 2.6mm | Low (very short trace) | +| BTN_THR_UP | 68% | 24mm | Low (slow GPIO) | +| I2C_SCL | 73% | 19mm | Low (400kHz) | +| BTN_MACRO1 | 75% | 38mm | Low (slow GPIO) | +| TRIG_ANALOG | 77% | 27mm | Low (ADC, slow) | +| STICK_X, BTN_STICK | 80–81% | 20–24mm | Low | +| BTN_THR_DN through BTN_MACRO6 | 82–93% | 33–65mm | Low | +| XBEE_SPI_ATTN, XBee_CS, STAT1 | 86–89% | 81–103mm | Low–Medium | +| STICK_Y, XBEE_ON_SLEEP | 91–93% | 42–93mm | Low | + +**Return path stitching (RP-001):** 20+ nets have F.Cu↔B.Cu via transitions without adjacent ground stitching vias. Same root cause as GP-001 — affects the same slow signals. For a non-certified handheld, these can be accepted. If EMC pre-compliance becomes a concern, add a GND stitching via near each layer-transition via on the signals with the lowest coverage. + +**SPI_SCK (CK-001, CK-003):** SPI_SCK is fully routed on outer layers (microstrip) and passes within 8.5–9mm of J_STICK1 and J_USB1. At typical SPI frequencies (≤20MHz) this is unlikely to cause coupling issues, but if signal integrity becomes a concern, route SPI_SCK on an inner layer. + +**Buck converter harmonics (SW-001):** U_BUCK1 switching at 500kHz produces 117 harmonics in the 30–88MHz band. Inherent to any switching regulator. Add a ferrite bead on the VSYS input to U_BUCK1 if conducted emissions become a concern. --- -## Firmware Notes (unchanged) +## Thermal -- **PWR_HOLD must be asserted early:** During boot, GPIO44 (PWR_HOLD) defaults to high-impedance. The board stays powered only while the button is held via D_OR1. Assert PWR_HOLD high early in `app_main()` before the RTOS scheduler yields. -- **GPIO44 = U0RXD conflict:** During serial flashing, ESP32-S3 uses GPIO44 as UART0 RX. Configure PWR_HOLD as output only after the UART boot window closes. +| Component | Package | Tj (25°C ambient) | Margin to Tj_max | +|---|---|---|---| +| U_BUCK1 (TLV62569) | SOT-23-5 | 64°C | 61°C | + +All other components below thermal threshold. No action needed. --- -## Priority Action List +## Next Steps Before Ordering -| # | Action | Severity | -|---|---|---| -| 1 | Add MPNs to all 70 remaining components | BLOCKER | -| 2 | Populate `MPN` field on D_VBUS_TVS1 (PESD5V0S1BA) | BLOCKER | -| 3 | Fix XBee footprint courtyard → physical outline only; add RF keepout as rule area | MEDIUM | -| 4 | Add stitching via near SPI_MOSI layer transition | MEDIUM | -| 5 | Decide edge switches: intentional → suppress DRC; else move inboard | MEDIUM | -| 6 | Add test points on power rails, USB, SPI, I2C | MEDIUM | -| 7 | Add STAT2 DNP pull-up 4.7kΩ → 3V3 | LOW | -| 8 | Add PWR_FLAG to VBAT, VBUS, PWR_* rails | LOW | +| Priority | Action | +|---|---| +| Recommended | Sync datasheets (`sync_datasheets_digikey.py` or `lcsc`) to enable pin-level verification against manufacturer specs | +| Recommended | Verify I2C pull-up resistors are present on I2C_SDA / I2C_SCL | +| Recommended | Suppress accepted DRC findings (XBee courtyard, edge switches) in KiCad DRC config | +| Optional | Add J_STICK1 MPN (custom part — add an internal part number if one exists) | +| Optional | Add test points before production run | +| Optional | Add PWR_FLAG symbols to clean up ERC | +| Optional | Add DNP pull-up on STAT2 (4.7kΩ to 3V3) | --- @@ -163,7 +181,7 @@ U_BUCK1 (TLV62569): Tj = **64°C** at 25°C ambient, 61°C margin to Tj_max. No | Analysis | Reason | |---|---| -| Datasheet verification | No MPNs / no datasheets on disk | -| SPICE simulation | No ngspice/LTspice/Xyce installed | -| Gerber verification | No gerber files in project | -| Lifecycle audit | No MPNs to query | +| Pin-level datasheet verification | No datasheets synced (MPNs now available — run sync to enable) | +| SPICE simulation | No ngspice / LTspice / Xyce installed | +| Gerber verification | No gerber files in project directory | +| Component lifecycle audit | Network access or API keys needed; run `analyze_schematic.py --lifecycle` | diff --git a/PCB/diagrams/power_charger_layout.html b/PCB/diagrams/power_charger_layout.html index 30f78ca..aac727b 100644 --- a/PCB/diagrams/power_charger_layout.html +++ b/PCB/diagrams/power_charger_layout.html @@ -267,7 +267,7 @@
Ten parts. Every setting resistor's effect is confirmed against the BQ25185 datasheet (SLUSF65A), not assumed.
+Eleven parts. Every setting resistor's effect is confirmed against the BQ25185 datasheet (SLUSF65A), not assumed.
| R_VSET1 | 18kΩ | 0402 | Sets 500mA input limit + 4.2V VBATREG (table 7-1) |
| R_TS1 | 10kΩ | 0402 | Disables TS/battery-NTC monitoring, per datasheet §8.3.9 |
| R_STAT1 | 10kΩ | 0402 | Open-drain STAT1 pull-up to 3V3 |
| R_STAT2 | 10kΩ | 0402 | Open-drain STAT2 pull-up to 3V3 — with STAT1, fully decodes charging/done/fault |