232202 - EverTag Connectivity Module Base PCB WIFI¶
| Article Number | 232202 |
| Name | EverTag Connectivity Module Base PCB WIFI |
| Base PCB | 232200 Base Std |
| Added Feature | ESP32-C5 WiFi gateway |
| Status | Active |
Delta Document
This document describes only the differences from the 232200 Base Std. For all shared functionality (MCU, NFC, USB-C connector, service button, TC2030-CTX-NL J1 debug, PCB design notes), refer to the base PCB documentation. This WiFi variant adds a TC2030 (6-pin) footprint at J2 for ESP32 programming, using a TC2030-FTDI-DTR cable with integrated USB-UART and auto-reset. Both J1 and J2 have 470 ohm series resistors on signal pads for misconnection protection. Both LED1 (system) and LED2 (gateway status) are populated -- LED2 indicates WiFi/gateway connectivity.
1. Overview¶
The 232202 adds an Espressif ESP32-C5 WROOM WiFi gateway module to the base 232200 connectivity module. This enables the EverTag Station to function as a Wirepas-to-WiFi gateway, bridging the Wirepas Mesh network to IP infrastructure via the customer's existing WiFi network.
Key Features (Delta from 232200)¶
- ESP32-C5 WROOM module -- dual-band 2.4 GHz + 5 GHz, WiFi 6
- Single UART1 interface using Wirepas Dual-MCU API (gateway data + control/config)
- 3-wire coexistence (nRF54 as arbiter via MPSL) to coordinate 2.4 GHz radio usage
- Dedicated 3.3V LDO for ESP32 power
- Castellated module -- no RF tuning required on base PCB
- Separate ground stitching around ESP32 RF domain
2. Block Diagram (Delta)¶
graph TB
subgraph power [Power Supply - Extended]
VIN["5V Input from Power Base"] --> BUCK["TPS62160 Buck Converter"]
BUCK --> RAIL["3.3V Rail"]
RAIL --> LDO["Dedicated LDO"]
LDO --> WIFI_PWR["3.3V WiFi Rail"]
end
subgraph mcu_block [MCU / Radio Module]
PAN611["PAN611 - nRF54L15"]
end
subgraph wifi_block [WiFi Gateway Module]
ESP32["ESP32-C5 WROOM"]
end
RAIL --> PAN611
WIFI_PWR --> ESP32
PAN611 <-->|"UART1: Dual-MCU API"| ESP32
ESP32 -->|"COEX REQUEST"| PAN611
PAN611 -->|"COEX GRANT"| ESP32
PAN611 -->|"ESP32 RESET"| ESP32
ESP32 -->|"READY"| PAN611
Interconnect¶
The nRF54 and ESP32-C5 communicate via a single UART (Wirepas Dual-MCU API) plus coexistence and control signals:
| Interface | Pins | Purpose | Bandwidth |
|---|---|---|---|
| UART1 | P0.03 (TX), P0.04 (RX) | Wirepas Dual-MCU API (gw data + config + status) | 115200 (up to 921600) |
| 3-Wire COEX | P2.00 (REQ in), P2.01 (PRI in), P2.02 (GRANT out) | Hardware coexistence arbitration | Signal |
| ESP32 RESET | P1.10 | nRF54 controls ESP32 boot/reset | Signal |
| ESP32 READY | P2.08 | ESP32 signals boot complete | Signal |
nRF54 is the Coexistence Arbiter
The 3-wire coexistence interface is controlled by nRF54 via Nordic MPSL. nRF54 owns the 2.4 GHz Wirepas TDMA schedule and grants ESP32 WiFi airtime during gaps. ESP32 requests airtime via COEX_REQUEST; nRF54 responds via COEX_GRANT. This prevents WiFi from starving Wirepas of airtime. See Coexistence Architecture.
3. Schematics (Delta)¶
3.1 ESP32-C5 WROOM Module¶
| Parameter | Value |
|---|---|
| Manufacturer | Espressif |
| Module | ESP32-C5 WROOM |
| WiFi | 802.11ax (WiFi 6), 2.4 GHz + 5 GHz dual-band |
| Core | RISC-V single-core |
| Supply | 3.3V (dedicated LDO) |
| Package | Castellated SMT module |
Design notes:
- Castellated module -- no external RF matching or antenna trace routing on base PCB
- Module contains integrated antenna for both 2.4 and 5 GHz bands
- 5 GHz band preferred for gateway data to avoid 2.4 GHz congestion with Wirepas
3.2 Dedicated LDO (ESP32 Power)¶
| Parameter | Value |
|---|---|
| IC | AP2112K-3.3TRG1 (Diodes Inc) |
| Input | Power-path diode-OR output (~4.7V on AC, ~3.0--3.6V on battery) |
| Output | 3.3V (WiFi rail) |
| Max Current | 600 mA |
| Dropout | ~200 mV @ 300 mA typical |
| Package | SOT-23-5 |
| Est. Price | ~$0.10 @ 10k |
| Sourcing | LCSC (C51118), DigiKey, Mouser |
The LDO is fed from the power-path diode-OR output -- the same node that feeds the TPS62160 buck converter. This creates two independent 3.3V domains that are both battery-backed:
- TPS62160 (buck converter) → 3.3V for nRF54, NFC, LEDs, sensors
- AP2112K (LDO) → 3.3V for ESP32 WiFi module only
graph LR
VIN["5V from Power Base"] --> PPM["Power-Path<br/>Diode-OR"]
BAT["LiFePO4<br/>(battery variants)"] -.-> PPM
PPM --> BUCK["TPS62160"]
BUCK --> RAIL_NRF["3.3V nRF54 Rail"]
PPM --> LDO["AP2112K-3.3"]
LDO --> RAIL_WIFI["3.3V WiFi Rail"]
Why a Separate LDO Instead of Shared Rail?
During WiFi TX bursts the ESP32-C5 draws up to ~350 mA in sharp transients. If both MCUs shared a single 3.3V rail, ESP32 current spikes would create supply noise that degrades the nRF54's sensitive radio receiver. The separate LDO provides power supply isolation -- the two 3.3V rails are independent.
Battery Behaviour (232203)
On battery variants, when AC power is lost the power-path switches to LiFePO4 battery (~3.0--3.6V). The AP2112K continues to power the ESP32:
- Charged battery (3.4--3.6V): LDO regulates normally, ESP32 runs at 3.3V.
- Nominal battery (3.2V): LDO enters dropout, ESP32 gets ~3.0V. Functional (ESP32-C5 min VDD = 3.0V).
- Depleted battery (<3.0V): ESP32 browns out. At this point nRF54 is also near shutdown.
The gateway remains fully operational on battery -- nRF54 continues in gateway mode and ESP32 maintains the WiFi uplink. Firmware monitors battery voltage (P1.06 / AIN2) and performs a graceful shutdown of both MCUs before the battery reaches the brown-out threshold. See the Firmware Architecture section in firmware-compatibility for details.
3.3 UART1 Interface (Wirepas Dual-MCU API)¶
A single UART carries all nRF54↔ESP32 communication: Wirepas gateway data packets, config/status commands, and management using the Wirepas Dual-MCU API protocol.
| Signal | nRF54 Pin | ESP32-C5 Pin | Direction | Notes |
|---|---|---|---|---|
| UART1_TX | P0.03 (3) | GPIO8 (pin 10) | nRF54 → ESP32 | Dual-MCU API: gw packets + config push |
| UART1_RX | P0.04 (4) | GPIO9 (pin 11) | ESP32 → nRF54 | Dual-MCU API: status + Web UI config |
Baud rate: 115200 8N1 (upgradable to 921600 for higher throughput). The Wirepas Dual-MCU API uses SLIP-encoded framing to multiplex data and control on a single UART. See nRF54 to ESP32 Communication Protocol for details.
UART1 on Former SPI Pins
UART1 TX/RX are assigned to P0.03/P0.04 (formerly SPI CLK/MISO on 230220). ESP32_RESET is on P1.10 (formerly SPI MOSI). These reassignments free SAADC-capable pins P1.11/P1.13/P1.14 for the occupancy sensor on 232204. Directions are preserved: P0.03 output→output, P0.04 input→input, P1.10 output→output. P1.08 (formerly SPI CS) remains unassigned on this board.
3.5 ESP32 Control Signals¶
| Signal | nRF54 Pin | ESP32-C5 Pin | Direction | Notes |
|---|---|---|---|---|
| ESP32_RESET | P1.10 (A2) | EN (pin 3) | nRF54 → ESP32 | Active high enable. nRF54 controls ESP32 boot. |
| ESP32_READY | P2.08 (20) | GPIO24 (pin 23) | ESP32 → nRF54 | ESP32 asserts after boot (reused from ACC.INT1) |
3.6 3-Wire Coexistence (nRF54 as Arbiter)¶
| Signal | nRF54 Pin | nRF54 Direction | ESP32-C5 Pin | Function |
|---|---|---|---|---|
| COEX_REQUEST | P2.00 (C4) | Input | GPIO6 (pin 8) | ESP32 requests 2.4 GHz airtime |
| COEX_PRIORITY | P2.01 (E4) | Input | GPIO10 (pin 12) | ESP32 indicates priority level |
| COEX_GRANT | P2.02 (D4) | Output | GPIO23 (pin 21) | nRF54 grants airtime via MPSL |
Why nRF54 is the Arbiter
Wirepas Mesh uses strict TDMA time slots. Missing a slot causes mesh desynchronization. If ESP32 were the arbiter, long WiFi TX bursts could starve Wirepas. By making nRF54 the gatekeeper, Wirepas timing is never compromised. ESP32-IDF supports external coex GRANT signals. See Coexistence Architecture.
4. Pin-Out (Delta)¶
Additional GPIO requirements beyond 232200 base pin-out. Only 7 pins are needed for the ESP32 interface (UART + control + coexistence). SPI pins are not connected to ESP32.
| Pin | GPIO | Function | Direction | Source | Notes |
|---|---|---|---|---|---|
| 3 | P0.03 | UART1 TX → ESP32 | Output | Reused from SPI CLK (230220) | Wirepas Dual-MCU API + config |
| 4 | P0.04 | UART1 RX ← ESP32 | Input | Reused from SPI MISO (230220) | Wirepas Dual-MCU API + status |
| A2 | P1.10 | ESP32_RESET | Output | Reused from SPI MOSI (230220) | Boot/reset control |
| 20 | P2.08 | ESP32_READY | Input | Reused from ACC.INT1 | ESP32 boot complete (same direction) |
| C4 | P2.00 | COEX_REQUEST | Input | Available pool | ESP32 requests airtime |
| E4 | P2.01 | COEX_PRIORITY | Input | Available pool | ESP32 priority signal |
| D4 | P2.02 | COEX_GRANT | Output | Available pool | nRF54 grants airtime |
5. Component Selection (Delta)¶
5.1 WiFi Module -- ESP32-C5 WROOM¶
| Parameter | Value |
|---|---|
| Manufacturer | Espressif |
| Part Number | ESP32-C5 WROOM |
| WiFi Standard | 802.11ax (WiFi 6) |
| Bands | 2.4 GHz + 5 GHz (dual-band) |
| Antenna | Integrated (PCB antenna in module) |
| Core | RISC-V single-core |
| Package | Castellated SMT module |
| Est. Price | ~3--4 USD @ 10k volume |
| Datasheet | ESP32-C5 WROOM v0.7 |
Rationale:
- Dual-band (2.4 + 5 GHz) -- 5 GHz band avoids interference with Wirepas 2.4 GHz mesh
- WiFi 6 -- improved throughput and power efficiency vs. WiFi ⅘
- Castellated module -- no RF tuning required on base PCB, reducing design complexity and manufacturing risk
- Modular FCC/CE certification -- pre-certified module reduces regulatory cost and time
- Low cost -- competitive with other WiFi SoC modules
- Good long-term availability from Espressif ecosystem
Supplier Link: Espressif ESP32-C5
5.2 LDO Regulator (WiFi Power)¶
| Parameter | Value |
|---|---|
| IC | TBD |
| Input | 3.3V main rail |
| Output | 3.3V filtered |
| Current | ≥ 500 mA (ESP32-C5 peak) |
6. PCB Design Notes (Delta)¶
6.1 ESP32-C5 Module Placement¶
- Place ESP32-C5 module with antenna area extending to PCB edge (no copper under antenna)
- Keep ESP32 module as far as practical from PAN611 module to minimize RF coupling
- Maintain RF clearance zones per Espressif module datasheet
6.2 Ground Stitching¶
- Separate ground stitching vias around the ESP32-C5 RF domain
- Connect ESP32 ground to main ground plane at a single point (star ground topology in RF area)
- Ground stitching fence between PAN611 and ESP32 module areas
6.3 Signal Routing¶
- UART traces: controlled impedance not required (low frequency), but keep short and away from RF areas
- Coexistence signals: short, direct route between modules
- No high-speed clock signals crossing between module domains
- P0.03/P0.04/P1.10 now carry UART1 and ESP32_RESET -- route from PAN611 to ESP32 module pads
- P1.08 (formerly SPI CS) remains unconnected on this board
For base PCB design notes, see 232200 PCB Design Notes.
7. Test Points & Programming (Delta)¶
Additional test points beyond 232200 test points:
J2: TC2030 with TC2030-FTDI-DTR Cable (ESP32 Programming / Debug)¶
A TC2030 (6-pin) footprint is used for direct ESP32-C5 programming and debug console. J2 uses the same footprint family as J1 (both TC2030). 470 ohm series resistors on all signal pads of both J1 and J2 ensure that misconnection (wrong cable on wrong header) cannot damage either MCU or the cable. J2 is rotated 180° relative to J1 as an additional physical keying measure.
Misconnection Protection: Series Resistors
Both J1 (nRF54 SWD) and J2 (ESP32 UART) use TC2030 footprints. Since the cables are physically compatible with either footprint, 470 ohm series resistors are placed on every signal pad of both connectors. This limits worst-case misconnection current to 7 mA per pin -- safe for all GPIOs and FTDI outputs. SWD and UART function normally through the series resistance at the speeds used in this design.
| Parameter | Value |
|---|---|
| Footprint | J2: TC2030 (6-pin pogo, no-legs), rotated 180° relative to J1 |
| Cable | TC2030-NL-FTDI-C232HD-DDHSP-0-DTR (3.3V, FT232H-based, integrated USB-to-UART, DTR on pin 2) |
| Interface | ESP32 UART boot + debug console (U0TXD / U0RXD) |
| BOM Cost | ~\(0.03 (auto-reset circuit ~\)0.02 + series resistors ~$0.01; pogo pads are $0) |
J2 Pin Assignment (per TC2030-NL-FTDI-C232HD-DDHSP-0-DTR cable wiring):
| Pin | Signal | Direction | FT232H Pin | ESP32-C5 Pin | Notes |
|---|---|---|---|---|---|
| 1 | 3V3 | Power | VCC (Red) | 3V3 | Power reference from WiFi LDO (no series R) |
| 2 | DTR | Host output | DTR (Gray) | Via R + Q2 → GPIO26/28 | Auto-reset circuit: controls BOOT (470Ω series R) |
| 3 | RXD (ESP→host) | ESP32 → Host | RXD (Yellow) | GPIO11 (U0TXD, pin 13) | UART data from ESP32 (470Ω series R) |
| 4 | TXD (host→ESP) | Host → ESP32 | TXD (Orange) | GPIO12 (U0RXD, pin 14) | UART data to ESP32 (470Ω series R) |
| 5 | GND | -- | GND (Black) | GND | Ground (no series R) |
| 6 | RTS | Host output | RTS (Green) | Via R + Q1 → EN | Auto-reset circuit: controls RESET (470Ω series R) |
Auto-Reset Circuit (BOOT / RESET Sequencing)¶
The FT232H DTR and RTS signals are converted into the correct ESP32 BOOT/RESET sequence via a standard Espressif-style auto-reset circuit. This enables esptool.py --before default_reset to automatically enter download mode -- the same workflow as any ESP32 DevKit. The 470 ohm series resistors on the TC2030 pads are upstream of the auto-reset transistors.
graph LR
subgraph TC2030-FTDI-DTR Cable
DTR["DTR (pin 2)"]
RTS["RTS (pin 6)"]
end
subgraph Series Protection
R_DTR["470Ω"]
R_RTS["470Ω"]
end
subgraph Auto-Reset Circuit
C1["C1: 10nF"]
C2["C2: 10nF"]
Q1["Q1: NPN (BC847)"]
Q2["Q2: NPN (BC847)"]
end
subgraph ESP32-C5
EN["EN (RESET)"]
BOOT["GPIO26 + GPIO28 (BOOT)"]
end
RTS --> R_RTS --> Q1
Q1 -->|"collector"| EN
DTR --> R_DTR --> C1 -->|"AC-coupled"| EN
DTR --> R_DTR
R_DTR --> Q2
Q2 -->|"collector"| BOOT
RTS --> R_RTS
R_RTS --> C2 -->|"AC-coupled"| BOOT
Auto-reset circuit + protection BOM:
| Ref | Component | Value / Part | Package | Notes |
|---|---|---|---|---|
| Q1 | NPN transistor | BC847 / S8050 | SOT-23 | Base = RTS (via 470Ω), Collector = EN, Emitter = GND |
| Q2 | NPN transistor | BC847 / S8050 | SOT-23 | Base = DTR (via 470Ω), Collector = GPIO26+GPIO28 (BOOT), Emitter = GND |
| C1 | Capacitor | 10 nF | 0402 | Series between DTR and EN (AC-coupling for reset pulse) |
| C2 | Capacitor | 10 nF | 0402 | Series between RTS and GPIO26+GPIO28 (AC-coupling for BOOT) |
| R7 | Pull-down | 10k | 0402 | GPIO7 pull-down to GND (JTAG strapping pin, see note below) |
| R_J2_1..4 | Series resistor | 470 ohm | 0402 | On J2 signal pads (DTR, RXD, TXD, RTS) -- misconnection protection |
The cross-wiring (DTR drives Q2 for BOOT while RTS drives Q1 for RESET, capacitors cross to the opposite signal) produces the correct timing sequence when esptool.py toggles DTR and RTS. The capacitors ensure RESET gets a brief pulse while BOOT is held low long enough for the chip to sample during reset release.
ESP32-C5 Strapping Pins
The ESP32-C5 uses two strapping pins for boot mode selection:
- GPIO26 (pin 24) and GPIO28 (pin 26): Together determine boot mode. Both must be LOW at reset for download mode (UART boot). Both default HIGH via internal pull-ups for normal SPI flash boot. Tie both to the Q2 collector in the auto-reset circuit.
- GPIO7 (pin 9): Selects JTAG signal source. Must be LOW at reset for normal operation (JTAG from GPIO). Add a 10k pull-down resistor (R7) to GND. Without this pull-down, GPIO7 may float high and select eFuse-based JTAG, preventing UART boot.
These strapping pins are only sampled during reset; after boot they can be used as normal GPIOs if needed.
Circuit Is Inert When Cable Not Attached
When no TC2030-FTDI cable is mated, the pogo pads are open. The transistor bases float (no drive through the 470 ohm series resistors), so Q1 and Q2 are off. The 10k pull-up resistors on EN and GPIO26/28 (BOOT) maintain normal boot. The auto-reset circuit has zero effect on normal operation.
ESP32 Programming Workflow
Production: Connect TC2030-NL-FTDI-C232HD-DDHSP-0-DTR cable to J2 pogo pads. Run esptool.py --port /dev/ttyUSBx --before default_reset write_flash ... -- the auto-reset circuit handles BOOT/RESET sequencing automatically. Program nRF54 via J1 TC2030 in SWD mode. Both J1 and J2 are TC2030 pads on the same PCB side for a single dual-head production jig.
Debug console: After programming, the same TC2030-FTDI-DTR cable serves as the ESP32 debug console. Open a terminal at 115200 baud (idf.py monitor, minicom, screen) on the same USB port to view ESP-IDF log output.
Field updates: Can also program ESP32 via nRF54 UART bridge (dfu esp32 CLI command on J1) for field updates without needing J2.
Design notes:
- Place J2 near J1 (nRF54 TC2030), both on top side of PCB Rotate J2 180° relative to J1 (physical keying -- forces deliberate cable rotation for cross-mating)
- Maintain fixed spacing between J1 and J2 for production jig compatibility (two TC2030 heads)
- J2 is only populated/needed on WiFi variants (232202, 232203, 232204)
- 470 ohm series resistors on all J2 signal pads (DTR, TXD, RXD, RTS) -- placed between TC2030 pads and auto-reset / ESP32 circuit
- BOOT (GPIO26 + GPIO28, tied together) and EN (RESET) need 10k pull-up resistors to 3V3 (BOOT high = normal boot, BOOT low = download mode)
- GPIO7 needs a 10k pull-down resistor to GND (JTAG source strapping pin)
- Place auto-reset components (Q1, Q2, C1, C2) and series resistors close to J2 pogo pads
- Clear silkscreen label: "J2: ESP32 UART" (distinct from J1: "nRF54 SWD")
Individual Test Points¶
| TP # | Signal | Expected Value | Notes |
|---|---|---|---|
| TP20 | WIFI_3V3 | 3.3V ± 3% | Dedicated WiFi LDO output |
| TP21 | UART1_TX | Logic | nRF54 → ESP32 (P0.03) |
| TP22 | UART1_RX | Logic | ESP32 → nRF54 (P0.04) |
WiFi-Specific Tests¶
- J2 TC2030-FTDI connection: connect TC2030-NL-FTDI-C232HD-DDHSP-0-DTR cable to J2, verify ESP32 boot log at 115200 baud
- ESP32 auto-reset: run
esptool.py --before default_reset chip_idand verify automatic download mode entry - ESP32 programming via J2: flash ESP-IDF firmware using
esptool.py - ESP32 debug console via J2: verify ESP-IDF log output visible on same USB port after normal boot
- Misconnection test: connect J-Link TC2030-CTX cable to J2 (ESP32 pads) -- verify no damage, no smoke, no excessive current (series resistors limit to 7 mA max)
- Misconnection test: connect TC2030-FTDI-DTR cable to J1 (nRF54 pads) -- verify no damage (nRF54 may be held in reset but undamaged)
- WiFi LDO output: 3.3V ± 3% at TP20
- ESP32-C5 boots and responds to UART1 Dual-MCU API commands
- UART1 data transfer: verify Wirepas gateway packet forwarding (probe TP21/TP22)
- Coexistence signal toggling observed during concurrent radio activity
- WiFi scan: detect available networks (both 2.4 and 5 GHz)
- WiFi connect: associate with test AP
- Gateway data flow: Wirepas packet received by nRF54, forwarded via UART1 Dual-MCU API to ESP32, then to IP
- Auto-reset circuit inert: verify ESP32 boots normally when no cable attached (EN and GPIO26/28 pulled high)
- GPIO7 strapping: verify 10k pull-down keeps GPIO7 LOW at reset (JTAG from GPIO, not eFuse)
8. Revision History¶
| Revision | Date | Author | Changes |
|---|---|---|---|
| Rev A | TBD | TBD | Initial prototype |
Related Documents¶
- 232200 Base Std -- Base PCB (all shared functionality)
- 232203 Base Bat+WIFI -- Combined battery + WiFi variant
- Sales Articles -- Products using this PCB: 232003 (EU), 232012 (US)