Avionics Radio Lead

MASA Telemetry Architecture

Designing a 2.4GHz LoRa RF link, bare-metal C drivers, and a custom ground station interface for real-time payload tracking at 75,000 feet.

SX1280 (LoRa) RF Hardware Debugging Link Budget Analysis Embedded C

Live Ground Station Preview

A web-based simulation of my Python (Tkinter + Matplotlib) telemetry tool. Actively plots dynamic RSSI/SNR data, parses hex payloads, and validates configuration.

LIVE_SIMULATION
MASA Ground Station
Port:
Baud:
● Connected
RSSI (Signal)
-- dBm
Waiting...
SNR (Noise)
-- dB
Waiting...
Packets RX: 0
Pkt Rate: 0.00 /s
CRC Errors: 0
Signal Diagnostics Last 100 points
EXPECTED_RADIO_CONFIG
Frequency: 2400 MHz Spreading: SF8 Bandwidth: 406.25 kHz TX Power: 9 dBm
PAYLOAD_INSPECTOR (HEX)
Waiting for data...
SYSTEM_LOG
[00:00:00] Connected to COM3 @ 115200 baud

Hardware Debugging

During prototype testing, I found severe thermal issues with the SX1280 transceiver, which began overheating whenever output power exceeded +10 dBm.

// Root Cause Analysis

Performing analysis to trace the reflection loss revealed that the PCB manufacturer errors resulted in 30 Ω RF traces on a design matched for 50 Ω. This massive VSWR mismatch caused the RF energy to reflect back and dissipate as extreme heat within the IC.

To mitigate the trace losses on the compromised boards, I recommended and outlined the specifications for integrating an external transmit-path Power Amplifier (PA). This would ensure the system hits its EIRP target without stressing the primary transceiver's internal amplifier.

Link Budget Analysis

To guarantee telemetry reception at a 20km range (65,000+ feet), I performed a comprehensive 2.4 GHz link budget analysis, evaluating Free Space Path Loss (FSPL) and rocket plume attenuation.

EIRP (TX Pow + TX Gain - Loss) +17.5 dBm
FSPL @ 20km -126.1 dB
Plume Attenuation (Worst Case) -20.0 dB
RX Gain - RX Loss +3.0 dB
Calculated Received Power ($P_{RX}$) -125.6 dBm

With the SX1280 receiver sensitivity at -116 dBm (SF8/406kHz), the initial calculation yielded a critical -9.6 dB margin deficit.

// Recovery Solution:
I mathematically modeled a reconfiguration to SF12/200kHz to improve base sensitivity, and specified the integration of a receive-path Low Noise Amplifier (LNA) yielding +12 dB gain to push the final link margin into the positive.

Bare-Metal Firmware Driver

Instead of relying on heavy abstractions or third-party libraries, I developed a bare-metal C driver from scratch for the Semtech SX1280.

  • Register-level radio configuration and initialization.
  • Hardware FIFO data buffering and parsing logic.
  • Interrupt-driven packet handling (DIO pins).

Low-level SPI transactions were optimized to avoid RTOS scheduler blocking. I implemented precise hardware timeout handling (`HAL_TIMEOUT`) and busy-wait polling (`SX1280_WaitForReady`) to ensure transaction integrity without halting other crucial avionic tasks.

SX1280.c - Low-Level SPI Implementation
static SX1280_Status_t SX1280_SPI_TransmitReceive(uint8_t *pTxData, uint8_t *pRxData, uint16_t size)
{
    HAL_StatusTypeDef hal_status;

    /* Wait for radio to not be busy before starting SPI transaction */
    if (SX1280_WaitForReady(100) != SX1280_OK) return SX1280_TIMEOUT;

    /* Set NSS low to select the radio */
    HAL_GPIO_WritePin(sx1280_hal_config->nssPort, sx1280_hal_config->nssPin, GPIO_PIN_RESET);

    if (pRxData == NULL) {
        hal_status = HAL_SPI_Transmit(sx1280_hal_config->spiHandle, pTxData, size, SX1280_SPI_TIMEOUT_MS);
    } else {
        hal_status = HAL_SPI_TransmitReceive(sx1280_hal_config->spiHandle, pTxData, pRxData, size, SX1280_SPI_TIMEOUT_MS);
    }
    
    /* Set NSS high to deselect the radio */
    HAL_GPIO_WritePin(sx1280_hal_config->nssPort, sx1280_hal_config->nssPin, GPIO_PIN_SET);
    
    if (hal_status != HAL_OK) return SX1280_ERROR;

    return SX1280_WaitForReady(100);
}
Return to Portfolio