LORA模块

在这里插入图片描述

SX126X芯片手册

芯片手册

DIO1 & DIO2

  • DIO1 是 SX126X 芯片的主中断输出引脚,用于向 MCU 通知各种射频事件。建议:DIO1 添加 10k 上拉电阻(确保空闲状态稳定)。
  • DIO2具有双重功能。与DIO1一样,DIO2可用作通用IRQ线,任何IRQ均可通过此引脚路由。此外,DIO2可通过使用命令SetDio2AsRfSwitchCtrl(…)配置为驱动RF开关。在此模式下,DIO2在Tx期间处于逻辑1状态,在其他任何模式下处于逻辑0状态。

DIO2 连接到 TXEN 引脚的作用

EoRa_PI_example_v1.0

  • DIO2 连接到射频前端模块(FEM)的 TXEN 引脚,主要用于自动控制射频收发切换
  • 自动射频切换
    • 无需软件干预,芯片硬件自动控制 TXEN 引脚
    • 发射时自动开启发射通路,接收时自动切换到接收通路(通过 SPI 接口发送命令控制 SX126X 工作模式)
    • 防止发射信号进入接收链路造成损坏
    • 确保收发通路正确隔离
芯片工作模式 DIO2 输出 TXEN 状态 射频通路
发射 (Tx) 逻辑 1 (高电平) 使能 打开发射通路
接收 (Rx) 逻辑 0 (低电平) 禁用 关闭发射通路,打开接收通路
待机/睡眠 逻辑 0 (低电平) 禁用 关闭发射通路
  • 在初始化 SX126X 时,需要调用SetDio2AsRfSwitchCtrl命令启用此功能:

在这里插入图片描述

板级定义

EoRa-S3-400TB 无线模块开发测试板

[Ebyte_EoRa-S3]
extends = esp32_base                    ; 继承 esp32_base 基础配置
board = ebyte_eora-s3                   ; 指定开发板型号

构建标志

在这里插入图片描述

标志 说明
-I variants/ebyte_eora_s3 - 添加变体头文件搜索路径
-D EBYTE_EORA_S3 - 定义宏,标识使用此开发板
-D P_LORA_DIO_1=33 GPIO33 LoRa DIO1 中断引脚
-D P_LORA_NSS=7 GPIO7 LoRa 片选引脚
-D P_LORA_RESET=8 GPIO8 LoRa 复位引脚
-D P_LORA_BUSY=34 GPIO34 LoRa 忙状态引脚
-D P_LORA_SCLK=5 GPIO5 SPI 时钟引脚
-D P_LORA_MISO=3 GPIO3 SPI 主入从出
-D P_LORA_MOSI=6 GPIO6 SPI 主出从入
-D P_LORA_TX_LED=37 GPIO37 发射指示灯
-D PIN_VBAT_READ=1 GPIO1 电池电压检测
-D PIN_USER_BTN=0 GPIO0 用户按钮
-D PIN_BOARD_SDA=18 GPIO18 I2C 数据线
-D PIN_BOARD_SCL=17 GPIO17 I2C 时钟线

SX1262 LoRa 芯片配置

-D SX126X_DIO2_AS_RF_SWITCH=true      ; DIO2 用作射频开关
-D SX126X_DIO3_TCXO_VOLTAGE=1.8       ; TCXO 电压 1.8V
-D SX126X_CURRENT_LIMIT=140           ; 电流限制 140mA
-D RADIO_CLASS=CustomSX1262           ; 无线电类类型
-D WRAPPER_CLASS=CustomSX1262Wrapper  ; 包装器类类型
-D LORA_TX_POWER=22                   ; 发射功率 22dBm
-D SX126X_RX_BOOSTED_GAIN=1           ; 启用接收增益增强

ESP32 驱动 LoRa 无线电模块代码

  • 代码提供的功能接口:
模块 功能
SPI配置 支持默认或自定义SPI总线
无线电初始化 配置频率、带宽、扩频因子、功率等
RTC时钟 提供时间同步功能
传感器管理 管理各类传感器数据
显示与按钮 可选的人机交互界面
随机数生成 用于加密和网络身份

依赖库

库名称 版本 类型 用途 详细说明
SPI 内置 系统库 串行外设接口通信协议 Arduino/ESP32 标准库,用于 SPI 总线通信
Wire 内置 系统库 I2C 通信库 Arduino/ESP32 标准库,用于 I2C 总线通信
jgromes/RadioLib ^7.3.0 第三方 无线电通信库 (LoRa/FSK等) 支持 LoRa、LoRaWAN、FSK、OOK 等协议,兼容 SX127x/SX126x 等芯片,7.x 版本 API 有重大更新
rweather/Crypto ^0.4.0 第三方 加密/解密算法库 提供 AES、SHA、HMAC 等加密算法,用于数据加密、安全通信、LoRaWAN 密钥处理
adafruit/RTClib ^2.1.3 第三方 实时时钟通用库 支持 DS3231、PCF8523、DS1307 等芯片,与 RV3028 专用库可能存在功能重叠
melopero/Melopero RV3028 ^1.1.0 第三方 RV3028 RTC 芯片专用驱动 高精度 RTC 芯片驱动,支持温度补偿、闹钟、定时器等功能,I2C 接口
electroniccats/CayenneLPP 1.6.1 第三方 Cayenne 低功耗数据协议 用于高效编码传感器数据,减少 LoRaWAN payload 大小,支持温度/湿度/GPS/加速度计等

通过 RadioLib 发送数据包的示例

在这里插入图片描述

/*
   RadioLib SX1262 Transmit Example 参照 EoRa_PI_example_v1.0.zip\EoRa_PI_example_v1.0\examples\RadioLibExamples\SX1262\SX1262_Transmit_Interrupt

   This example transmits packets using SX1262 LoRa radio module.
   Each packet contains up to 256 bytes of data, in the form of:
    - Arduino String
    - null-terminated char array (C-string)
    - arbitrary binary data (byte array)

   For full API reference, see the GitHub Pages
   https://jgromes.github.io/RadioLib/
*/
#include <Arduino.h>
#include <SPI.h>
#include <RadioLib.h>

// 引脚定义
#define RADIO_CS_PIN    7
#define RADIO_DIO1_PIN  33
#define RADIO_BUSY_PIN  34
#define RADIO_RST_PIN   8
#define RADIO_SCLK      5
#define RADIO_MISO      3
#define RADIO_MOSI      6
#define BOARD_LED       37

// 射频配置
uint8_t txPower = 22;
float radioFreq = 433.0;

// ============ SPI 总线初始化 (必须) ============
SPI.begin(RADIO_SCLK, RADIO_MISO, RADIO_MOSI);

// LoRa实例
SX1268 radio = new Module(RADIO_CS_PIN, RADIO_DIO1_PIN, RADIO_RST_PIN, RADIO_BUSY_PIN);

// 状态标志
volatile bool transmittedFlag = false;
void setFlag(void) { transmittedFlag = true; }

void setup()
{
    Serial.begin(115200);
    pinMode(BOARD_LED, OUTPUT);
    
    if (radio.begin(RADIO_FREQ) != RADIOLIB_ERR_NONE) {
        Serial.println("LoRa init failed!");
        while (true);
    }
    radio.setDio1Action(setFlag);
    radio.startTransmit("Hello LoRa!");
}

void loop()
{
    if (transmittedFlag) {
        transmittedFlag = false;
        digitalWrite(BOARD_LED, !digitalRead(BOARD_LED));
        delay(1000);
        radio.startTransmit("Hello LoRa!");
    }
}

源码示例

  • 关键宏定义:
说明
P_LORA_* LoRa模块引脚定义
LORA_FREQ/BW/SF/CR LoRa通信参数
SX126X_* SX126x芯片特定配置
DISPLAY_CLASS 显示设备类型
#pragma once

#define RADIOLIB_STATIC_ONLY 1
#include <RadioLib.h>
#include <helpers/radiolib/RadioLibWrappers.h>
#include <helpers/ESP32Board.h>
#include <helpers/radiolib/CustomSX1262Wrapper.h>
#include <helpers/AutoDiscoverRTCClock.h>
#include <helpers/SensorManager.h>
#ifdef DISPLAY_CLASS
  #include <helpers/ui/SSD1306Display.h>
  #include <helpers/ui/MomentaryButton.h>
#endif

extern ESP32Board board;
extern WRAPPER_CLASS radio_driver;
extern AutoDiscoverRTCClock rtc_clock;
extern SensorManager sensors;

#ifdef DISPLAY_CLASS
  extern DISPLAY_CLASS display;
  extern MomentaryButton user_btn;
#endif

bool radio_init();
uint32_t radio_get_rng_seed();
void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr);
void radio_set_tx_power(int8_t dbm);
mesh::LocalIdentity radio_new_identity();

// -------------------------------------------------------------
// 引入Arduino核心库,提供ESP32的基本功能(如Serial、GPIO等)
#include <Arduino.h>

// 引入目标板配置文件,包含引脚定义、硬件参数等
#include "target.h"

// 创建ESP32开发板对象,用于管理板级特定功能
ESP32Board board;

// 判断是否定义了LoRa SPI时钟引脚(P_LORA_SCLK)
// 如果定义了,说明需要使用自定义SPI总线
#if defined(P_LORA_SCLK)
  // 创建SPI通信类实例
  static SPIClass spi;
  // 创建无线电模块对象,传入NSS、DIO1、RESET、BUSY引脚及SPI对象
  RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY, spi);
#else
  // 使用默认SPI总线(VSPI),只传入必要的控制引脚
  RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY);
#endif

// 创建无线电驱动包装器,将radio模块与board板级对象关联
WRAPPER_CLASS radio_driver(radio, board);

// 创建ESP32 RTC(实时时钟)备用时钟对象
ESP32RTCClock fallback_clock;
// 创建自动发现RTC时钟对象,使用备用时钟作为fallback
AutoDiscoverRTCClock rtc_clock(fallback_clock);

// 创建传感器管理器对象,用于管理各类传感器
SensorManager sensors;

// 如果定义了显示类(如OLED、LCD等)
#ifdef DISPLAY_CLASS
  // 创建显示对象
  DISPLAY_CLASS display;
  // 创建瞬时按钮对象,引脚为PIN_USER_BTN,去抖时间1000ms,高电平有效
  MomentaryButton user_btn(PIN_USER_BTN, 1000, true);
#endif

// 如果没有定义LoRa编码率(LORA_CR),则默认设置为5
#ifndef LORA_CR
  #define LORA_CR      5
#endif

/**
 * 无线电模块初始化函数
 * @return true 初始化成功,false 初始化失败
 */
bool radio_init() {
  // 启动备用RTC时钟
  fallback_clock.begin();
  // 启动RTC时钟,使用Wire(I2C总线)
  rtc_clock.begin(Wire);
  
  // 配置TCXO(温度补偿晶体振荡器)电压
#ifdef SX126X_DIO3_TCXO_VOLTAGE
  // 如果定义了TCXO电压,使用定义值
  float tcxo = SX126X_DIO3_TCXO_VOLTAGE;
#else
  // 否则使用默认电压1.6V
  float tcxo = 1.6f;
#endif

  // 如果定义了自定义SPI引脚,初始化SPI总线
#if defined(P_LORA_SCLK)
  // 参数顺序:SCLK时钟,MISO主入从出,MOSI主出从入
  spi.begin(P_LORA_SCLK, P_LORA_MISO, P_LORA_MOSI);
#endif

  // 初始化无线电模块
  // 参数说明:
  // - LORA_FREQ: LoRa工作频率(如433MHz, 868MHz, 915MHz)
  // - LORA_BW: 带宽(如125kHz, 250kHz, 500kHz)
  // - LORA_SF: 扩频因子(7-12,值越大传输距离越远但速率越低)
  // - LORA_CR: 编码率(5-8,纠错能力)
  // - RADIOLIB_SX126X_SYNC_WORD_PRIVATE: 同步字(私有网络)
  // - LORA_TX_POWER: 发射功率(dBm)
  // - 8: 前导码长度
  // - tcxo: TCXO电压
  int status = radio.begin(LORA_FREQ, LORA_BW, LORA_SF, LORA_CR, 
                           RADIOLIB_SX126X_SYNC_WORD_PRIVATE, 
                           LORA_TX_POWER, 8, tcxo);
  
  // 检查初始化状态
  if (status != RADIOLIB_ERR_NONE) {
    // 如果失败,打印错误信息
    Serial.print("ERROR: radio init failed: ");
    Serial.println(status);
    return false;  // 返回失败
  }
  
  // 启用CRC校验(1=启用),提高数据传输可靠性
  radio.setCRC(1);
  
  // 如果定义了RX/TX使能引脚,配置射频开关
#if defined(SX126X_RXEN) && defined(SX126X_TXEN)
  radio.setRfSwitchPins(SX126X_RXEN, SX126X_TXEN);
#endif

  // 如果定义了电流限制,设置最大电流
#ifdef SX126X_CURRENT_LIMIT
  radio.setCurrentLimit(SX126X_CURRENT_LIMIT);
#endif

  // 如果配置DIO2作为射频开关,启用该功能
#ifdef SX126X_DIO2_AS_RF_SWITCH
  radio.setDio2AsRfSwitch(SX126X_DIO2_AS_RF_SWITCH);
#endif

  // 如果启用接收增益增强模式,提高接收灵敏度
#ifdef SX126X_RX_BOOSTED_GAIN
  radio.setRxBoostedGainMode(SX126X_RX_BOOSTED_GAIN);
#endif

  return true;  // 初始化成功
}

/**
 * 获取随机数种子
 * 用于生成加密密钥或网络身份
 * @return 32位随机数(最大0x7FFFFFFF)
 */
uint32_t radio_get_rng_seed() {
  // 利用无线电模块的硬件随机数生成器
  return radio.random(0x7FFFFFFF);
}

/**
 * 设置LoRa通信参数
 * @param freq 频率(MHz)
 * @param bw 带宽(kHz)
 * @param sf 扩频因子(7-12)
 * @param cr 编码率(5-8)
 */
void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) {
  radio.setFrequency(freq);      // 设置工作频率
  radio.setSpreadingFactor(sf);  // 设置扩频因子
  radio.setBandwidth(bw);        // 设置带宽
  radio.setCodingRate(cr);       // 设置编码率
}

/**
 * 设置发射功率
 * @param dbm 发射功率(dBm),通常范围-3到22
 */
void radio_set_tx_power(uint8_t dbm) {
  radio.setOutputPower(dbm);
}

/**
 * 创建新的本地网络身份
 * 用于mesh网络中的节点标识
 * @return mesh::LocalIdentity 本地身份对象
 */
mesh::LocalIdentity radio_new_identity() {
  // 创建无线电噪声监听器,利用射频噪声作为熵源
  RadioNoiseListener rng(radio);
  // 使用随机数生成器创建新的本地身份
  return mesh::LocalIdentity(&rng);  // create new random identity
}

CG

SX1262 SX1276 SX1278 SX1280 examples need install the following dependency library files:

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐