LR2021 radio on NRF_Promicro (#10401)

* LR2021 radio on NRF_Promicro

Co-authored-by: Copilot <copilot@github.com>

* Refactor LR2021 interface includes and conditional compilation for improved clarity

Co-authored-by: Copilot <copilot@github.com>

* Refactor LR20x0 interface: remove unused includes and update comments for clarity

* Fix LR2021 max power definitions and add radio type detection tests

* remove potato radio type detection tests

* Include placeholder for DCDC - currently requires godmode

* Added godmode features - not enabled by default

---------

Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
This commit is contained in:
Tom
2026-05-07 20:24:39 -05:00
committed by GitHub
co-authored by GitHub Copilot Ben Meadors
parent 4553d1e0b1
commit 5e2ca8aed4
11 changed files with 596 additions and 14 deletions
@@ -15,6 +15,7 @@ board = promicro-nrf52840
build_flags = ${nrf52840_base.build_flags}
-I variants/nrf52840/diy/nrf52_promicro_diy_tcxo
-D NRF52_PROMICRO_DIY
; -D RADIOLIB_GODMODE=1 ; needed for some LR2021 items, but not enabled by default.
build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/diy/nrf52_promicro_diy_tcxo>
debug_tool = jlink
@@ -1,5 +1,11 @@
#pragma once
#include "RadioLib.h"
// Keep LR20x0 naming while RadioLib exposes LR2021 symbols.
#ifndef LR20x0
#define LR20x0 LR2021
#endif
// This is rewritten to match the requirements of the E80-900M2213S
// The E80 does not conform to the reference Semtech switches(!) and therefore needs a custom matrix.
// See footnote #3 in "https://www.cdebyte.com/products/E80-900M2213S/2#Pin"
@@ -13,14 +19,35 @@ static const uint32_t rfswitch_dio_pins[] = {RADIOLIB_LR11X0_DIO5, RADIOLIB_LR11
static const Module::RfSwitchMode_t rfswitch_table[] = {
// clang-format off
// mode DIO5 DIO6 DIO7
{LR11x0::MODE_STBY, {LOW, LOW, LOW}},
{LR11x0::MODE_RX, {LOW, HIGH, LOW}},
{LR11x0::MODE_TX, {HIGH, HIGH, LOW}},
{LR11x0::MODE_TX_HP, {HIGH, LOW, LOW}},
{LR11x0::MODE_TX_HF, {LOW, LOW, LOW}},
{LR11x0::MODE_GNSS, {LOW, LOW, HIGH}},
{LR11x0::MODE_WIFI, {LOW, LOW, LOW}},
// mode DIO5 DIO6 DIO7
{LR11x0::MODE_STBY, {LOW, LOW, LOW}},
{LR11x0::MODE_RX, {LOW, HIGH, LOW}},
{LR11x0::MODE_TX, {HIGH, HIGH, LOW}},
{LR11x0::MODE_TX_HP, {HIGH, LOW, LOW}},
{LR11x0::MODE_TX_HF, {LOW, LOW, LOW}},
{LR11x0::MODE_GNSS, {LOW, LOW, HIGH}},
{LR11x0::MODE_WIFI, {LOW, LOW, LOW}},
END_OF_MODE_TABLE,
// clang-format on
};
// LR2021 RF switch matrix following the standard Semtech / Seeed T1000-E reference topology.
// DIO5 -> antenna path select (HIGH = sub-GHz LF)
// DIO6 -> TX enable / HP PA select
// DIO7 -> not connected (no GNSS on LR2021)
// DIO8 -> RF front-end power enable
static const uint32_t lr20x0_rfswitch_dio_pins[] = {RADIOLIB_LR2021_DIO5, RADIOLIB_LR2021_DIO6, RADIOLIB_LR2021_DIO7,
RADIOLIB_LR2021_DIO8, RADIOLIB_NC};
static const Module::RfSwitchMode_t lr20x0_rfswitch_table[] = {
// clang-format off
// mode DIO5 DIO6 DIO7 DIO8
{LR20x0::MODE_STBY, {LOW, LOW, LOW, LOW}},
{LR20x0::MODE_RX, {HIGH, LOW, LOW, HIGH}},
{LR20x0::MODE_TX, {HIGH, HIGH, LOW, HIGH}},
{LR20x0::MODE_RX_HF, {LOW, LOW, LOW, LOW}},
{LR20x0::MODE_TX_HF, {LOW, LOW, LOW, LOW}},
END_OF_MODE_TABLE,
// clang-format on
};
@@ -155,6 +155,16 @@ NRF52 PRO MICRO PIN ASSIGNMENT
#define LR11X0_DIO_AS_RF_SWITCH
#endif
// LR2021
#define USE_LR2021
#define LR2021_IRQ_PIN (0 + 10) // P0.10 IRQ
#define LR2021_NRESET_PIN LORA_RESET // P0.09 NRST
#define LR2021_BUSY_PIN (0 + 29) // P0.29 BUSY
#define LR2021_SPI_NSS_PIN LORA_CS // P1.13
#define LR2021_DIO3_TCXO_VOLTAGE 1.8
#define LR2021_DIO_AS_RF_SWITCH
#define LR2021_IRQ_DIO_NUM 9 // DIO9 → P0.10
// #define SX126X_MAX_POWER 8 set this if using a high-power board!
/*