【电路笔记 元器件】通信芯片:SX126X芯片(LoRa®、FSK、GFSK、MSK)+EBYTE E22-M系列模组
·
文章目录
LORA模块

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

- 将 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
- EoRa-S3-400TB 无线模块开发测试板
- https://github.com/meshcore-dev/MeshCore
- LORA计算器工具
- https://github.com/jgromes/RadioLib/blob/master/examples/SX126x/SX126x_PingPong/SX126x_PingPong.ino
SX1262 SX1276 SX1278 SX1280 examples need install the following dependency library files:
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)