← AXC-004

Circuit review & bench-test guide

AXC-004 — RFM95W LoRa radio PMOD module

Design-stage — board not yet fabricated

Document purpose#

This document explains the axc-004-lora PMOD module at component level and turns the design evidence into a practical manual-review and bench-test plan. It is based on generate_design.py, README.md, and the ERC report in reports/.

This board has never been fabricated. Repository status is schematic generated, ERC clean (0 errors / 0 warnings), netlist reviewed; PCB layout not started; not released. There is no PCB, no BOM export, no DRC record, and no first-article bench result. Every number below is a target to verify against real hardware, not a proven result.

1. What the board does#

The board carries a HopeRF RFM95W module (a Semtech SX1276 LoRa transceiver with the SPI+FIFO front end) as a 915 MHz long-range packet radio: the FPGA is the brain, the RFM95W is the radio. LoRa trades bitrate for kilometres of range via spreading factor and bandwidth. It is a PMOD Type 2A "expanded SPI" module — SPI mode 0 at ≤ 10 MHz plus two interrupt lines: DIO0 fires on TX-done / RX-done and DIO1 on RX-timeout, both routed to PMOD pins per the platform interrupt rule. The antenna reaches the outside world through a JP1 solder-jumper choice of a u.FL receptacle (J2) or a bare wire-solder pad (J3). The 915 MHz build fits the RFM95W-915S2; fit the RFM95W-868S2 for the EU 868 MHz band (same footprint).

Functional block diagram#

PMOD host (3.3 V)              Module
┌────────────────┐   ┌───────────────────────────────────────────┐
│ 1 CS_N ────────┼──>│ U1 NSS      U1 RFM95W-915S2 (SX1276)       │
│ 2 MOSI ────────┼──>│ U1 MOSI                                    │
│ 3 MISO <──R1───┼───│ U1 MISO     3V3 ─ C1 100n + C2 10µ         │
│ 4 SCK ─────────┼──>│ U1 SCK      RST_N ─ R4 10k PU              │
│ 7 DIO0 <──R2───┼───│ U1 DIO0 (TX/RX done)                       │
│ 8 RST_N ───────┼──>│ U1 RESET                                   │
│ 9 DIO1 <──R3───┼───│ U1 DIO1 (RX timeout)                       │
│ 6/12 3V3 ──────┼──>│ ANT ─ JP1 ─┬─ 1-2 J2 u.FL (default)        │
│ 5/11 GND ──────┼───│            └─ 2-3 J3 wire pad (~78 mm ¼λ)   │
└────────────────┘   └───────────────────────────────────────────┘

2. Safety and scope boundaries#

3. Power and control sequence#

  1. 3.3 V arrives on PMOD pins 6/12; C1 (100 nF) + C2 (10 µF) buffer the PA's TX-burst current. There is no enable pin — the module powers up with the rail.
  2. RESET must be released for POR to complete. R4 (10 k) pulls RST_N to 3V3 so the SX1276 finishes power-on reset with the pin idle-high; the host pulses RST_N low to force a hard reset. The SX1276 boots into STDBY (LoRa or FSK per RegOpMode).
  3. The host selects the module with CS_N low and clocks SPI mode 0. The address byte's MSB is the R/W flag (1 = write, 0 = read).
  4. Bring-up handshake: read RegVersion (address 0x42). It must return 0x12 (the SX1276 silicon revision). A wrong or zero value means the SPI wiring, CS_N, reset state, or the module itself is bad — do not proceed to RF work until 0x12 is stable.
  5. The host configures frequency, spreading factor, bandwidth, coding rate, and PA (RegPaConfig — select PA_BOOST for the RFM95W, since the module's antenna path is wired to PA_BOOST, not RFO).
  6. On transmit, the SX1276 raises DIO0 = TxDone when the packet has left the PA; on receive, DIO0 = RxDone and DIO1 = RxTimeout. Both reach the host through 100 Ω series resistors.

4. Interfaces#

ReferencePins/signalsIntended use
J112-pin PMOD plug, Type 2A1 ~CS(NSS), 2 MOSI, 3 MISO (via R1), 4 SCK, 7 DIO0 (via R2), 8 ~RST, 9 DIO1 (via R3), 5/11 GND, 6/12 3V3, 10 NC
J2Hirose U.FL-R-SMT-1 receptacleDefault antenna path (JP1 1-2); mates a u.FL pigtail to a 915 MHz whip/patch
J3Wire solder padAlternate antenna path (JP1 2-3); a ~78 mm quarter-wave wire at 915 MHz
JP13-pad solder jumper, 1-2 defaultAntenna route select: u.FL (1-2) or wire pad (2-3). Exactly one may be bridged

There are no dedicated test points; bench probing is at J1 pins, JP1, the 100 Ω resistors, and the RFM95W castellations. Probe DIO/SPI, never the antenna node with an ordinary scope probe while transmitting.

5. Component-by-component review#

5.1 Radio and antenna path#

Ref.PartFunction and why neededIf absent/openIf shorted, wrong, or misassembled
U1HopeRF RFM95W-915S2 (SX1276), RF_Module:HOPERF_RFM9XW_SMD (footprint assigned explicitly — the stock symbol ships with none)LoRa/FSK transceiver, SPI+FIFO, +20 dBm PA on PA_BOOSTBoard inertCastellation opens on 3V3/GND/SPI give partial or dead SPI; copper/pour under the antenna feed (layout) wrecks RF; an 868S2 fitted where 915 is intended radiates out of band
J2Hirose U.FL-R-SMT-1(10)Default RF output to a u.FL antennaNo radiated output if JP1 is on 1-2A damaged centre pin or bad solder reflects PA power — the antenna-first hazard; never key TX into it unmated
J3Wire solder pad (SolderWire)Alternate ¼λ wire antennaNo output if JP1 is on 2-3A stray/wrong-length wire detunes the PA and reflects power; treat an unterminated pad as no-antenna
JP13-pad solder jumper (DNP in BOM/POS; a build-time strap)Chooses u.FL vs wire padANT floats — both open = transmitting into an open port, the classic PA-killerBoth bridged shorts the two antenna paths together; verify exactly one route before any TX

5.2 Interrupt/data conditioning and reset#

Refs.ValueFunctionIf omitted or wrong
R1100 ΩSeries protection on the module-driven MISO line (only driven when CS_N is low)Open = host sees no SPI read data: RegVersion reads as 0x00/0xFF and the module looks dead though it is fine
R2100 ΩSeries protection on the module-driven DIO0 (TxDone/RxDone) lineOpen = host never sees the done interrupt: TX/RX appears to hang forever
R3100 ΩSeries protection on the module-driven DIO1 (RxTimeout) lineOpen = RX-timeout events never reach the host
R410 kΩ to 3V3~RST idle pull-up so POR completes with the pin releasedMissing = reset may float; intermittent boot, or the host must always drive RST_N

5.3 Decoupling#

Refs.ValueFunctionIf omitted or wrong
C1100 nF 16 V X7RModule HF decoupling at the 3V3 pinRail noise into the synthesiser/PA; spurs and unstable RF
C210 µF 10 V X5RTX-burst bulk (PA ~120 mA at +20 dBm)Rail droop on TX keying: resets, truncated packets, reduced output power
#FLG01–02ERC power flags (3V3, GND)Bookkeeping only

Every ref-des is covered: U1, J1, J2, J3, JP1, R1–R4, C1–C2.

6. Datasheet summary and design interpretation#

DeviceKey manufacturer facts used hereBoard-specific interpretation
RFM95W / SX1276 (RFM95W datasheet)SPI mode 0 ≤ 10 MHz; address MSB = R/W; RegVersion 0x42 reads 0x12; DIO mapping (RegDioMapping) puts TxDone/RxDone on DIO0, RxTimeout on DIO1; PA output on PA_BOOST for the RFM95W; ~120 mA PA burst at +20 dBm; POR needs RESET releasedThe 0x12 read is the first bring-up gate. The 100 Ω on DIO0/DIO1/MISO and the 10 k on RESET follow the platform rules. PA_BOOST is the only wired antenna path — configure RegPaConfig accordingly
LoRa modulationSpreading factor + bandwidth trade bitrate for link budget; TxDone/RxDone are interrupt-drivenThe DIO0/DIO1 routing is what makes an interrupt-driven RX/TX state machine possible on this PMOD
Regulatory (915/868 ISM)915 MHz = US Region 2; 868 MHz = EU with duty-cycle limitsFit the matching variant and antenna; the duty-cycle note is an explicit open README item for the lesson text
Hirose U.FL-R-SMT-150 Ω u.FL receptacleVerified stock footprint; the wire-pad J3 is the low-cost alternative

Official reference: RFM95W datasheet (and the Semtech SX1276 datasheet for register detail). Check the exact orderable variant (915S2 vs 868S2) before procurement.

7. Expected values before bench testing#

All values are design targets for a board that does not yet exist.

QuantityTargetHow to measure
3V3-to-GND, unpoweredHigh (caps only), both polaritiesDMM
MISO/DIO0/DIO1 series~100 Ω to the respective PMOD pinDMM at R1/R2/R3
RST_N idle≈3.3 V (R4 pull-up) after powerDMM/scope
RegVersion (0x42)0x12SPI transaction, logic analyzer
Idle current (STDBY, not transmitting)~1.5–10 mA classBench supply
RX current~10–12 mA classBench supply
TX current burst (+20 dBm PA_BOOST)~120 mA peaks; record actualCurrent probe or 0.1 Ω shunt + scope — a DMM will not catch the burst
Rail droop at module during TX3V3 stays > 3.0 VScope, AC-coupled, at C2
DIO0 TxDoneRising edge at end of a transmitScope at R2 / PMOD pin 7
Two-node linkSecond AXC-004 (or any SX127x) receives the packet with plausible RSSI/SNRRegRssiValue/RegPktSnr on the RX node

8. Manual schematic and assembly review checklist#

9. Ordered bench-test procedure#

Stop at the first abnormal result. Record board serial, module marking/band, antenna identity, and supply identity. Confirm an antenna is connected and JP1 matches it before any command that could key the PA.

A. Unpowered inspection and resistance tests#

  1. Visual: module castellations, JP1 route, antenna connector/pad, passives.
  2. DMM: 3V3-to-GND both polarities; MISO/DIO0/DIO1 series ≈ 100 Ω; RST_N to 3V3 ≈ 10 k; confirm exactly one JP1 side bridged and the matching antenna fitted.

B. Standalone power-on and SPI identity (bench supply, 3.3 V, 300 mA)#

  1. Power the module; expect a few mA idle, no heating.
  2. With a logic analyzer or the host in a safe (RX/STDBY only) mode, read RegVersion (0x42) and confirm 0x12. A wrong value stops the test — debug SPI/CS/reset before anything else.
  3. Read/write a scratch register (e.g. RegFrfMsb) to confirm write access and the address-MSB R/W convention.

C. Receive-first RF bring-up#

  1. With an antenna connected, put the module in continuous RX (LoRa) on the target channel. Confirm no fault, sane current (~10 mA).
  2. Bring up a second SX127x node (another AXC-004 is ideal for the two-node test) as the transmitter, or use a known LoRa beacon; confirm RxDone on DIO0 and a plausible RSSI/SNR on this node.

D. Transmit at minimum power (antenna connected)#

  1. Set the PA to its minimum output (RegPaConfig low output power) for first transmit — verify the TX chain before commanding +20 dBm.
  2. Insert a current probe/shunt in the 3.3 V feed; scope it and 3V3 (at C2) during a transmit. Command a single packet; capture the current burst and the DIO0 TxDone rising edge. 3V3 must stay > 3.0 V.
  3. Step the PA up toward +20 dBm; record peak current (~120 mA target) and confirm the second node receives with rising RSSI. Never remove the antenna between transmits.
  1. Two-node link: send/receive N packets, log RSSI/SNR/PER at a few spreading factors and TX powers.
  2. Confirm DIO1 RxTimeout fires when no packet arrives in the RX window.
  3. Exercise a full interrupt-driven TX→RX turnaround from gateware.

F. Host (PMOD) bring-up and robustness#

  1. On the FPGA PMOD host, repeat B–D through the fabric SPI; compare against a logic-analyzer tap.
  2. Measure PMOD 3V3 droop at the module during a TX burst before trusting long sessions.
  3. Duty-cycle/thermal soak within the band's regulatory limits; log any resets or output-power drift.

10. Troubleshooting map#

SymptomFirst measurementsLikely areas
RegVersion ≠ 0x12SPI lines, CS_N, RST_N levelR1 open, SCK/MOSI/CS wiring, reset held, dead module
Reads all 0x00 or 0xFFMISO at R1, CS_N timingR1 open, CS_N not asserting, SPI mode wrong
TX "hangs", no completionDIO0 at R2R2 open, DioMapping wrong, PA not keying
RX never times outDIO1 at R3R3 open, RegDioMapping, wrong RX mode
Resets/truncates on TXShunt + 3V3 droop at C2Supply limit too low, C2 missing, thin rail
No link / terrible rangeAntenna route, RSSIJP1 wrong side, antenna unmated (PA damage risk), wrong band, detuned feed
PA output low/dead after a testSuspect a prior transmit into an open/shorted antenna port — inspect and replace U1 if confirmed

11. Bench record template#

FieldRecord
Board revision / serial; module marking + band
Antenna type + JP1 route confirmed
Supply / shunt / analyzer IDs and calibration
Unpowered resistance results (9.A)
RegVersion read
Idle / RX / TX peak current, min 3V3
DIO0 TxDone capture reference
Two-node link RSSI/SNR/PER
Spreading factor / bandwidth / TX power tested
Regulatory band + duty-cycle observed
Deviations, photos, raw-file paths
Reviewer / date / disposition

12. Review conclusion#

The schematic is small and every part earns its place: the 10 k holds RESET so POR completes, three 100 Ω resistors protect the module-driven MISO/DIO0/ DIO1 lines, and 10 µF of bulk keeps the +20 dBm PA burst from browning out the rail. The single most important operating discipline is the antenna-first rule — JP1 must select a real antenna at J2 or J3 before the PA is ever keyed, or a reflected transmit can destroy the output stage. The first bench gate is the RegVersion = 0x12 read; RF work only begins after that is stable. Open risks: no PCB exists (RF keep-out and the 50 Ω feed are layout promises), the band/duty-cycle regulatory note is an open README item, and the u.FL-vs-wire antenna choice must be verified on every built board before transmit.