Battery-less Audio Node Design

I renamed the project and captured the concept in Project Specification. I also completed a datasheet-grounded feasibility check in Feasibility and Power Analysis.
Conclusion: the exact 2 mm cube off-the-shelf design should not proceed to schematic as stated—the microphone and EFR32-class SoC packages alone exceed the volume, and the 01005 buffer capacitor is orders of magnitude too small for RF/audio burst energy. Recommended next step is to choose a revised target: larger proof-of-concept PCB, true custom bare-die/SiP research package, or reduced-function NFC-style node.
Design a larger proof-of-concept PCB around these components.
I’ll design a practical proof-of-concept schematic around the same RF SoC, PDM mic, Schottky rectifier, and GRM02 buffer concept. I’ll size the power path first, add the components and support circuitry, wire the schematic, then run review and document the firmware/power notes.
Designed the larger proof-of-concept schematic around the EFR32MG22, SPK0641HT4H-1 mic, SMS7621 rectifier bridge, GRM02 benchmark capacitor, larger reservoir cap, AP2112K 3.3 V rail, SMA RF test port, coil input, SWD header, reset, decoupling, and RF match.
I documented the implementation in Proof-of-Concept Design Notes and added firmware bring-up guidance in Firmware Starter. Schematic connectivity is complete; remaining review issues are expected layout airwires and generic-part MPNs to resolve before fabrication. Next step is PCB layout setup and placement—ready when you want me to proceed.
Set board stackup
Auto-place components
Run ERC/DRC
Resolve BOM MPNs
Add test points

Refine this doc
Ask about this doc
Firmware Starter — EFR32MG22 POC Audio Harvester
Platform & Toolchain
  • MCU: EFR32MG22C224F512IM32-CR
  • Framework: Silicon Labs Gecko SDK / Simplicity Studio
  • Build system: Simplicity Studio project using EFR32MG22 target board support, or a custom Gecko SDK C project
  • Primary purpose: bring up power/debug, read harvested reservoir voltage, generate PDM microphone clock/data capture hooks, and expose a location for radio burst code.
Pin Mapping

Table


FunctionMCU PinNetConnected ToDirectionNotes
PDM clockPC00PDM_CLKMK1 CLOCKOutputClock to Knowles PDM microphone
PDM dataPC01PDM_DATAMK1 DATAInputPDM data from MK1
Harvest voltage sensePA03HARV_SENSER3/R4 dividerAnalog inputDivider ratio approximately 0.248
SWCLKPA01SWCLKJ2 Pin 4DebugDatasheet debug function
SWDIOPA02SWDIOJ2 Pin 2DebugDatasheet debug function
RESETnRESETnRESET_NR1, S1, J2 Pin 5InputExternal reset button and debug reset
RFRF2G4_IORF_MATCH_ICL1/C11 match networkRF2.4 GHz RF path to SMA
HFXO inputHFXTAL_IHFXTAL_IY1 OSC1Analog clock38.4 MHz crystal candidate
HFXO outputHFXTAL_OHFXTAL_OY1 OSC2Analog clock38.4 MHz crystal candidate
Bring-Up Notes
  1. Power J1 with 5 V current-limited bench supply.
  2. Verify 3V3 rail before attaching debugger.
  3. Attach SWD debugger to J2: 3V3, GND, SWDIO, SWCLK, RESET_N.
  4. Confirm HFXO starts with the selected 38.4 MHz crystal before enabling BLE/Zigbee radio.
  5. Confirm HARV_SENSE never exceeds the ADC input range. With R3 = 1 MΩ and R4 = 330 kΩ, HARV_SENSE = VHARV * 0.248.
Example Gecko SDK app.c

C


#include "em_device.h"
#include "em_chip.h"
#include "em_cmu.h"
#include "em_gpio.h"
#include "em_iadc.h"
#include "em_timer.h"
#include <stdint.h>
#include <stdbool.h>

// Pin mapping from schematic
#define PDM_CLK_PORT       gpioPortC
#define PDM_CLK_PIN        0
#define PDM_DATA_PORT      gpioPortC
#define PDM_DATA_PIN       1
#define HARV_ADC_PORT      gpioPortA
#define HARV_ADC_PIN       3

// Harvest divider: R3 = 1M, R4 = 330k
#define HARV_DIVIDER_RATIO (330000.0f / (1000000.0f + 330000.0f))
#define IADC_VREF_MV       1210.0f
#define IADC_MAX_COUNTS    4095.0f

static volatile uint32_t g_pdm_edge_count = 0;

static void initClocks(void)
{
  CMU_ClockEnable(cmuClock_GPIO, true);
  CMU_ClockEnable(cmuClock_IADC0, true);
  CMU_ClockEnable(cmuClock_TIMER0, true);
}

static void initGpio(void)
{
  // PDM clock output. TIMER0 route can be added after selecting final clock rate.
  GPIO_PinModeSet(PDM_CLK_PORT, PDM_CLK_PIN, gpioModePushPull, 0);

  // PDM data input from microphone.
  GPIO_PinModeSet(PDM_DATA_PORT, PDM_DATA_PIN, gpioModeInputPull, 0);

  // Harvest sense analog input.
  GPIO_PinModeSet(HARV_ADC_PORT, HARV_ADC_PIN, gpioModeDisabled, 0);
}

static void initHarvestAdc(void)
{
  IADC_Init_t init = IADC_INIT_DEFAULT;
  IADC_AllConfigs_t allConfigs = IADC_ALLCONFIGS_DEFAULT;
  IADC_InitSingle_t initSingle = IADC_INITSINGLE_DEFAULT;
  IADC_SingleInput_t singleInput = IADC_SINGLEINPUT_DEFAULT;

  // Use internal reference; tune prescalers in production project using Clock Manager.
  allConfigs.configs[0].reference = iadcCfgReferenceInt1V2;
  allConfigs.configs[0].vRef = 1210;
  allConfigs.configs[0].analogGain = iadcCfgAnalogGain1x;

  // Port A pin 3 maps to iadcPosInputPortAPin3 on Series 2 devices.
  singleInput.posInput = iadcPosInputPortAPin3;
  singleInput.negInput = iadcNegInputGnd;

  IADC_init(IADC0, &init, &allConfigs);
  IADC_initSingle(IADC0, &initSingle, &singleInput);
}

static uint32_t readHarvestAdcCounts(void)
{
  IADC_command(IADC0, iadcCmdStartSingle);
  while ((IADC0->STATUS & IADC_STATUS_SINGLEFIFODV) == 0) {
    // Wait for conversion complete.
  }
  IADC_Result_t result = IADC_pullSingleFifoResult(IADC0);
  return result.data;
}

static float readHarvestVoltage(void)
{
  uint32_t counts = readHarvestAdcCounts();
  float sense_mv = ((float)counts / IADC_MAX_COUNTS) * IADC_VREF_MV;
  float vharv_mv = sense_mv / HARV_DIVIDER_RATIO;
  return vharv_mv / 1000.0f;
}

static void initPdmClockTimer(void)
{
  // This creates a simple firmware-visible PDM clock pin state for bring-up.
  // For production audio capture, replace this with the EFR32 PDM peripheral or
  // a TIMER/PRS route that generates the required 1.0 MHz to 4.8 MHz PDM clock.
  TIMER_Init_TypeDef timerInit = TIMER_INIT_DEFAULT;
  timerInit.enable = true;
  timerInit.prescale = timerPrescale1;
  TIMER_Init(TIMER0, &timerInit);
}

static void pdmBringupTick(void)
{
  // Lightweight pin activity counter to prove the microphone DATA line is alive
  // while the final PDM peripheral/DMA capture path is being implemented.
  static uint8_t last = 0;
  uint8_t now = GPIO_PinInGet(PDM_DATA_PORT, PDM_DATA_PIN);
  if (now != last) {
    g_pdm_edge_count++;
    last = now;
  }
}

void app_init(void)
{
  CHIP_Init();
  initClocks();
  initGpio();
  initHarvestAdc();
  initPdmClockTimer();
}

void app_process_action(void)
{
  static uint32_t loop_count = 0;

  pdmBringupTick();

  if ((loop_count++ % 10000u) == 0u) {
    float vharv = readHarvestVoltage();
    (void)vharv;
    // Add logging through RTT/SWO/USART if enabled in the project.
    // Add radio burst trigger here once the selected Silicon Labs stack is configured.
  }
}
Next Firmware Tasks
  • Replace the PDM bring-up counter with the EFR32 PDM peripheral plus DMA buffer capture.
  • Add packet framing and radio transmit using the chosen Silicon Labs stack: Bluetooth LE, Zigbee, or proprietary RAIL.
  • Add a charge-and-fire policy: only sample/transmit when VHARV exceeds a configurable threshold.
  • Add calibration for the R3/R4 divider and ADC reference.

    Platform & Toolchain

    Pin Mapping

    Bring-Up Notes

    Example Gecko SDK `app.c`

    Next Firmware Tasks

Documents

    RF-Harvested Audio Node — Project Specification

    Feasibility and Power Analysis — RF-Harvested 2 mm Audio Node

    Proof-of-Concept Design Notes

    Firmware Starter — EFR32MG22 POC Audio Harvester

Assets

No assets added.

RF-Harvested Audio Node

RF-Harvested Audio Node thumbnail
Battery-less 2 mm cube audio node concept powered by inductive/RF harvesting, with MEMS microphone capture, RF SoC burst transmission, rectification, and ceramic buffer storage.

Properties

Properties describe core aspects of the project.

Pricing & Availability

Distributor

Qty 1

Arrow

$4.65–$5.85

Digi-Key

$5.94–$6.17

HQonline

$0.95

LCSC

$12.35–$12.41

Mouser

$8.20

TME

$0.63

Verical

$3.71–$81.04

Controls