跳到主要内容

ESP32S3 开发说明

本章节包含以下部分,请按需阅读:

配置开发环境

1. 安装和配置

硬件连接

参考下表进行连接

Core2021-XFESP32S3
CLK40
MISO46
MOSI45
CS42
IRQ38
RESET39
BUSY41

示例程序

  • ESP32S3 示例程序位于 示例程序包core2021-xf\examples\esp32s3 目录中。
  • 示例 01,02,03 都需要两个 Core2021-XF 模块,一个发送,一个接收。
示例程序基础例程说明依赖库
01_lr2021_txLR2021 发送RadioLib
02_lr2021_rxLR2021 接收RadioLib
03_lr2021_pingpongLR2021 PingPongRadioLib
04_lr2021_tx_cwLR2021 以 CW 模式发送RadioLib
05_lr2021_LoRaWANLoRaWANRadioLib

运行 Arduino esp32 程序

  • 进入到core2021-xf\examples\esp32s3\arduino,选择需要测试的示例程序
  • 选择开发板:
    ESP32-S3
  • 选择 ESP32S3 的端口,然后进行编译上传
  • 上传完成后,打开串口监测器,就会输出相关的信息。

01_lr2021_tx

【程序说明】

  • 基于 ESP32S3 + Core2021-XF 模块,使用 中断方式 实现 LoRa 数据包周期性发送
  • 自定义 SPI 引脚(CLK/MOSI/MISO),适配 ESP32S3 硬件设计
  • 采用非阻塞发送机制,不占用主循环 CPU 资源
  • 每发送完成一包数据,自动延时 1 秒后继续发送下一包
  • 支持字符串数据发送,自带数据包序号,方便调试

【代码分析】

  • SPI.begin(...):ESP32S3 硬件 SPI 引脚初始化,自定义 CLK/MOSI/MISO
  • radio.irqDioNum = 11:配置 LR2021 模块中断映射引脚,必须在初始化前设置
  • radio.XTAL = true:开启外部晶振,保证频率精度
  • setFlag(void):中断回调函数,模块发送完成后自动触发,标记发送完成标志
  • radio.setPacketSentAction(setFlag):绑定发送完成中断函数
  • radio.startTransmit("内容"):启动 LoRa 异步发送,支持字符串 / 字节数组
  • radio.finishTransmit():发送完成后收尾操作,关闭发射电路、复位模块状态
  • loop() 主逻辑:检测发送完成标志 → 打印状态 → 延时 → 发送下一包带序号的数据

【运行效果】

  • 程序编译下载完成,打开串口监控可以看到打印发送完成的日志,如下图所示(搭配02_lr2021_rx):

02_lr2021_rx

【程序说明】

  • 基于 ESP32S3 + Core2021-XF 模块,使用中断方式实现 LoRa 数据包无线接收
  • 自定义硬件 SPI 引脚,适配 ESP32S3 专用硬件设计
  • 采用非阻塞监听模式,模块自动等待数据,不占用 CPU 资源
  • 接收成功后自动解析数据,并打印数据包内容、RSSI 信号强度、SNR 信噪比
  • 必须与发送端配置相同频率、扩频因子、带宽、编码率才能正常通信

【代码分析】

  • SPI.begin(...):ESP32S3 硬件 SPI 初始化,自定义 CLK/MOSI/MISO 引脚
  • radio.irqDioNum = 11:配置 LR2021 模块中断映射引脚,必须在初始化前设置
  • radio.XTAL = true:开启外部晶振,保证频率精度,提升接收稳定性
  • setFlag(void):中断回调函数,模块接收到完整数据包后自动触发
  • radio.setPacketReceivedAction(setFlag):绑定接收完成中断服务函数
  • radio.startReceive():启动 LoRa 连续接收模式,进入等待数据状态
  • radio.readData(str):读取接收到的无线数据,支持字符串格式解析
  • radio.getRSSI() / radio.getSNR():获取信号质量参数,用于调试与链路评估
  • loop() 主逻辑:检测接收完成标志 → 读取数据 → 解析打印 → 继续监听

【运行效果】

  • 程序编译下载完成,打开串口监控可以看到实时接收日志,包含数据内容、RSSI、SNR 信息,如下图所示(搭配01_lr2021_tx):

03_lr2021_pingpong

【程序说明】

  • 基于 ESP32S3 + Core2021-XF 模块,实现 LoRa 自动乒乓收发(一问一答)双向通信
  • 自定义硬件 SPI 引脚,适配 ESP32S3 专用硬件设计
  • 两块模块即可完成互发互收,无需手动控制
  • 开启 INITIATING_NODE 为发起端,另一块为接收端
  • 自动切换发送 / 接收状态,非阻塞中断驱动

【代码分析】

  • SPI.begin(...):ESP32S3 硬件 SPI 初始化,自定义 CLK/MOSI/MISO 引脚
  • radio.irqDioNum = 11:配置 LR2021 中断映射引脚,必须在初始化前设置
  • radio.XTAL = true:开启外部晶振,保证通信频率精度
  • setFlag(void):通用中断回调,发送完成或接收完成都会触发
  • radio.setIrqAction(setFlag):绑定收发共用中断函数
  • INITIATING_NODE 宏定义:用于区分主动发起节点
  • radio.startTransmit():启动数据包发送
  • radio.startReceive():切换模块到监听接收状态
  • radio.readData(str):读取接收到的 LoRa 数据包
  • loop() 主逻辑:发送完成 → 进入接收;接收完成 → 延时回复 → 再次发送

【运行效果】

  • 两块模块分别烧录程序,一块打开 INITIATING_NODE 宏定义
  • 上电后自动互发互收,串口打印收发状态、数据、RSSI、SNR,如下图所示:

04_lr2021_tx_cw

【程序说明】

  • 基于 ESP32S3 + Core2021-XF 模块,实现 LoRa 直接载波发射(CW/Direct Transmit)
  • 自定义 SPI 引脚,适配 ESP32S3 硬件设计
  • 输出固定频率的连续载波信号,无数据包格式,用于频段测试、信号检测、仪器校准
  • 固定频率 868MHz,发射功率 22dBm
  • 上电后持续发射,无额外逻辑操作

【代码分析】

  • SPI.begin(...):ESP32S3 硬件 SPI 初始化,自定义 CLK/MOSI/MISO 引脚
  • radio.XTAL = true:开启外部晶振,保证载波频率精度
  • OUT_HZ 868000000UL:定义直接发射频率(868MHz),可自行修改
  • radio.setOutputPower(22):配置发射功率为 22dBm
  • radio.transmitDirect(OUT_HZ):进入连续直接发射模式,输出固定频率载波
  • loop():无业务逻辑,载波持续发射无需程序干预

【运行效果】

  • 程序烧录后模块立即输出固定频率载波信号

  • 串口打印初始化与发射启动状态,可使用频谱仪/接收模块检测到连续射频信号,如下图所示:

05_lr2021_LoRaWAN

【程序说明】

  • 基于 ESP32S3 + Core2021-XF 模块,实现 LoRaWAN OTAA 入网 + 上下行通信
  • 自定义 SPI 引脚,适配 ESP32S3 专用硬件设计
  • 使用 NVS 闪存存储会话信息,掉电重启可快速恢复连接,无需重新入网
  • 定时上传随机数据(默认 5 分钟),自动接收服务器下行指令
  • 支持 HEX/ASCII 格式打印下行数据,便于调试与链路验证

【代码分析】

  • SPI.begin(...):ESP32S3 硬件 SPI 初始化,自定义 CLK/MOSI/MISO 引脚
  • radio.irqDioNum = 11:配置 LR2021 中断映射,必须在初始化前设置
  • radio.XTAL = true:开启外部晶振,保证 LoRaWAN 频点精度
  • prefs.begin(...):初始化 ESP32 NVS 分区,用于保存 LoRaWAN 会话
  • restoreLoRaWANState():从 NVS 恢复会话信息,实现快速重连
  • node.beginOTAA() / node.activateOTAA():OTAA 入网相关函数
  • saveLoRaWANState():成功入网后保存会话信息到 NVS
  • node.sendReceive():发送上行数据,并自动监听服务器下行
  • printHex / printAscii:格式化打印接收数据

【运行效果】

  • 烧录后自动完成 OTAA 接入,周期性上报数据并监听下行

  • 串口实时打印入网状态、上下行消息、信号质量等信息,如下图所示:

运行 ESP-IDF 程序

01_lr2021_tx

【程序说明】

  • 基于 ESP-IDF 原生框架 + ESP32S3 + Core2021-XF 模块,使用中断方式实现 LoRa 数据包周期性发送
  • 内置专用硬件抽象层 EspHal.h,完美适配 ESP-IDF 环境
  • 自定义 SPI 引脚配置,支持硬件 SPI2 总线
  • 采用中断驱动非阻塞发送,每 1 秒自动发送一包带序号的测试数据
  • 日志使用 ESP-IDF 原生 ESP_LOG 输出,稳定可靠

【核心文件】

  • EspHal.h:ESP-IDF 硬件抽象层,提供 GPIO、SPI、延时、中断等底层实现(所有例程通用)
  • main.cpp:LoRa 发送主程序

【代码分析】

  • EspHal* hal = new EspHal(...):ESP-IDF 硬件抽象层初始化
  • radio.irqDioNum = 11:配置 LR2021 模块中断映射引脚
  • radio.XTAL = true:开启外部晶振,保证频率精度
  • setFlag(void):发送完成中断回调函数
  • radio.setPacketSentAction(setFlag):绑定发送完成中断
  • radio.startTransmit(...):启动异步 LoRa 发送
  • radio.finishTransmit():发送完成后关闭射频电路,确保低功耗稳定

【运行效果】

  • 编译烧录后,串口实时打印发送状态与数据包序号
  • 可搭配02_lr2021_rx完成 ESP-IDF 环境 LoRa 单向无线通信

02_lr2021_rx

【程序说明】

  • 基于 ESP-IDF 原生框架 + ESP32S3 + Core2021-XF 模块,使用中断方式实现 LoRa 数据包无线接收
  • 依赖通用硬件抽象层 EspHal.h,完美适配 ESP-IDF 环境
  • 自定义 SPI 引脚配置,支持硬件 SPI2 总线
  • 中断驱动非阻塞监听,实时接收数据
  • 接收后自动打印:长度、RSSI、SNR、HEX 格式、字符串格式

【核心文件】

  • EspHal.h:底层硬件抽象(所有例程通用)
  • main.cpp:LoRa 接收主程序

【代码分析】

  • EspHal* hal:ESP-IDF 硬件抽象初始化(GPIO/SPI/中断)
  • radio.irqDioNum = 11:配置 LR2021 中断映射
  • radio.XTAL = true:开启外部晶振,保证接收频率精度
  • setFlag(void):接收完成中断回调
  • radio.setPacketReceivedAction(setFlag):绑定接收完成中断
  • radio.startReceive():启动 LoRa 连续监听
  • radio.readData():读取数据包并解析
  • 自动重新开启监听,实现不间断接收

【运行效果】

  • 烧录后模块进入监听状态,收到数据实时打印
  • 可与 01_lr2021_tx 配对完成完整无线通信

03_lr2021_pingpong

【程序说明】

  • 基于 ESP-IDF 原生框架 + ESP32S3 + Core2021-XF 模块,实现 LoRa 自动乒乓双向收发(一问一答)
  • 依赖通用硬件抽象层 EspHal.h,完美适配 ESP-IDF 环境
  • 自定义 SPI 引脚配置,支持硬件 SPI2 总线
  • 采用中断驱动非阻塞机制,自动切换发送/接收工作状态
  • 支持通过宏定义区分主动发起节点与被动监听节点,上电自动互发互收
  • 收到数据包后自动打印负载内容、RSSI 信号强度、SNR 信噪比,方便链路调试

【核心文件】

  • EspHal.h:底层硬件抽象(所有 ESP-IDF 例程通用)
  • main.cpp:LoRa 乒乓双向收发应用程序

【代码分析】

  • EspHal* hal:ESP-IDF 硬件抽象层实例初始化,封装 SPI、GPIO、延时与中断
  • radio.irqDioNum = 11:配置 LR2021 模块中断映射引脚
  • radio.XTAL = true:启用外部晶振,保障 LoRa 频点精度
  • setFlag(void):收发事件共用中断回调函数
  • radio.setIrqAction(setFlag):绑定模块中断触发回调
  • INITIATING_NODE:宏开关,定义设备为主动发包节点
  • radio.startTransmit() / radio.startReceive():程序自动切换发送与监听模式
  • radio.readData():解析接收数据包并打印文本、信号参数
  • 逻辑闭环:发完切接收、收完延时自动回复,持续循环乒乓通信

【运行效果】

  • 两台 ESP32 烧录程序后自动建立双向 LoRa 链路,循环互发数据
  • 串口终端实时打印初始化状态、收发结果、RSSI、SNR 信息

04_lr2021_tx_cw

【程序说明】

  • 基于 ESP-IDF 原生框架 + ESP32S3 + Core2021-XF 模块,实现 LoRa 固定频率连续载波发射
  • 依赖通用硬件抽象层 EspHal.h,完美适配 ESP-IDF 环境
  • 自定义 SPI 引脚配置,支持硬件 SPI2 总线
  • 输出纯净、无数据包的连续射频信号,适用于仪器校准、频段测试、信号强度检测
  • 发射频率:868MHz,发射功率:22dBm,上电后持续发射不中断

【核心文件】

  • EspHal.h:底层硬件抽象(所有 ESP-IDF 例程通用)
  • 04_lr2021_direct_transmit.c:LoRa 载波发射主程序

【代码分析】

  • EspHal* hal:ESP-IDF 硬件抽象初始化(SPI、GPIO、延时、中断)
  • radio.irqDioNum = 11:配置 LR2021 中断映射引脚
  • radio.XTAL = true:开启外部晶振,保证载波频率精度
  • OUT_HZ 868000000UL:定义连续发射频率(868MHz)
  • radio.setOutputPower(22):设置发射功率为 22dBm
  • radio.transmitDirect(OUT_HZ):进入直接载波发射模式,启动持续发射

【运行效果】

  • 程序烧录后模块立即输出稳定的连续射频信号
  • 可使用频谱仪或接收设备检测到稳定载波,用于频段测试与校准

05_lr2021_LoRaWAN

【程序说明】

  • 基于 ESP-IDF 原生框架 + ESP32S3 + Core2021-XF 模块,实现 LoRaWAN OTAA 入网 + 周期性上报 + 下行接收
  • 依赖通用硬件抽象层 EspHal.h,纯 ESP-IDF 环境独立运行
  • 使用 NVS 闪存持久化保存会话信息,掉电重启可快速恢复,无需重复入网
  • 自动上报随机测试数据,支持服务器下行数据解析与打印
  • 完整日志输出:入网状态、信号质量、上下行数据、会话保存记录

【核心文件】

  • EspHal.h:底层硬件抽象(所有 ESP-IDF 例程通用)
  • 05_lr2021_lorawan_otaa.c:LoRaWAN OTAA 通信主程序

【代码分析】

  • EspHal* hal:ESP-IDF 硬件抽象初始化(SPI、GPIO、延时、中断)
  • radio.irqDioNum = 11:配置 LR2021 中断映射引脚
  • radio.XTAL = true:开启外部晶振,保证 LoRa 频点精度
  • nvs_flash_init():启用 NVS 存储,用于保存 LoRaWAN 会话
  • restoreLoRaWANState():从闪存恢复会话,支持快速重连
  • node.beginOTAA() / node.activateOTAA():OTAA 入网关键函数
  • node.sendReceive():发送上行数据并监听服务器下行
  • printHex / printAscii:格式化打印下行数据

【运行效果】

  • 程序运行后自动完成 OTAA 入网,周期性上报数据并接收服务器下行
  • 串口终端实时打印入网状态、上传记录、信号质量、下行内容