Core2021-HF 使用教程

产品特性

  • 采用 Semtech 推出的 第四代 LoRa® 多频段收发器 LR2021
  • 支持 Sub-GHz (410 ~ 510MHz / 850 ~ 930MHz)、2.4GHz ISM 频段,以及 1.5 ~ 2.5GHz 许可频段
  • 通过 LoRa 或 LoRaWAN 协议结合网关接入云端,构建低功耗广域网络
  • 兼容 LoRa、FLRC、FSK、BLE、ZigBee 等多种协议
  • 采用 SPI 控制,支持主流 MCU 平台,便于集成和移植
  • 适用于工业遥测、智能家居、环境监测和远程数据采集等 IoT 应用场景
  • 提供完善的配套资料手册 (ESP32、树莓派、Arduino、STM32 和 Raspberry Pi Pico 等产品的示例程序和使用手册等)

产品参数

接口说明


产品尺寸



ESP32S3 开发说明

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

配置开发环境

1. 安装和配置

硬件连接

参考下表进行连接

Core2021-XFESP32S3
CLK40
MISO46
MOSI45
CS42
DIO1138
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,选择需要测试的示例程序
  • 选择开发板:

  • 选择 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 入网,周期性上报数据并接收服务器下行
  • 串口终端实时打印入网状态、上传记录、信号质量、下行内容



Raspberry Pi Pico 使用

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

配置开发环境

1. 安装和配置

硬件连接

参考下表进行连接

Core2021-XFRaspberry Pi Pico/Pico2
CLK10
MISO11
MOSI12
CS13
DIO1115
RESET5
BUSY14

示例程序

  • Raspberry Pi Pico 示例程序位于 示例程序包 的 core2021-xf\examples\pico 目录中。
  • 示例 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 Pico 程序

  • 进入到 core2021-xf\examples\pico\arduino,选择需要测试的示例程序

  • 选择好芯片型号跟端口


  • 上传完成后,打开串口监测器,就会输出相关的信息

01_lr2021_tx_arduino

【程序说明】

  • 基于 树莓派 Pico + Core2021-XF 模块,使用 中断方式 实现 LoRa 数据包周期性发送
  • 使用 Pico/Pico2 硬件 SPI1 端口,自定义 SPI 引脚映射
  • 采用非阻塞发送机制,不占用主循环 CPU 资源
  • 每发送完成一包数据,自动延时 1 秒后继续发送下一包
  • 支持字符串数据发送,自带数据包序号,方便调试

【代码分析】

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

【运行效果】

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


02_lr2021_rx_arduino

【程序说明】

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

【代码分析】

  • SPI1.setSCK / setRX / setTX:RP2040 硬件 SPI1 引脚重新映射配置
  • SPI1.begin():初始化树莓派 Pico 硬件 SPI1 总线
  • 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

【程序说明】

  • 基于 树莓派 Pico + Core2021-XF 模块,实现 LoRa 自动乒乓收发(一问一答)双向通信
  • 使用 Pico/Pico2 硬件 SPI1 端口,支持任意引脚映射
  • 两块模块即可完成互发互收,无需手动控制
  • 开启 INITIATING_NODE 为发起端,另一块为接收端
  • 自动切换发送 / 接收状态,非阻塞中断驱动

【代码分析】

  • SPI1.setSCK / setRX / setTX:树莓派 Pico SPI1 引脚重映射
  • SPI1.begin():初始化硬件 SPI1 总线
  • 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

【程序说明】

  • 基于 树莓派 Pico + Core2021-XF 模块,实现 LoRa 直接载波发射(CW/Direct Transmit)
  • 使用 Pico/Pico2 硬件 SPI1 端口,支持任意引脚映射
  • 输出固定频率的连续载波信号,无数据包格式,用于频段测试、信号检测、仪器校准
  • 固定频率 868MHz,发射功率 22dBm
  • 上电后持续发射,无额外逻辑操作

【代码分析】

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

【运行效果】

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

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


05_lr2021_LoRaWAN

【程序说明】

  • 基于 树莓派 Pico + Core2021-XF 模块,实现 LoRaWAN OTAA 入网与上下行通信
  • 使用 EEPROM 仿真存储 保存会话信息,掉电重启可快速恢复连接
  • 自定义 SPI1 引脚映射,完全适配 Pico/Pico2 硬件设计
  • 定时发送上行数据(默认 5 分钟),自动接收服务器下行消息
  • 支持数据 HEX/ASCII 格式打印,便于调试与链路验证

【代码分析】

  • SPI1.setSCK/setRX/setTX:RP2040 硬件 SPI1 引脚重映射配置
  • SPI1.begin():初始化树莓派 Pico 硬件 SPI1 总线
  • radio.irqDioNum = 11:配置 LR2021 中断映射引脚,必须在初始化前设置
  • radio.XTAL = true:开启外部晶振,保证 LoRaWAN 频点精度
  • EEPROM.begin(256):初始化 RP2040 片上 Flash 模拟 EEPROM
  • restoreLoRaWANState():从 EEPROM 恢复会话信息,实现快速重连
  • node.beginOTAA()/activateOTAA():OTAA 入网相关关键函数
  • saveLoRaWANState():入网成功后保存会话信息到 EEPROM
  • node.sendReceive():发送上行数据并自动监听下行
  • printHex/printAscii:格式化打印下行数据

【运行效果】

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

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


示例 C/C++ 程序

  • 进入到 core2021-xf\examples\pico\c,选择需要测试的示例程序

  • 选择好芯片型号跟端口


  • 上传完成后,打开串口监测器,就会输出相关的信息

01_lr2021_tx

【程序说明】

  • 基于 树莓派 Pico + Core2021-XF 模块,使用 非 Arduino 环境 直接在 Pico 上运行 RadioLib 库
  • 使用 硬件 SPI1 端口 并自定义 SPI 引脚(SCK=10, MOSI=11, MISO=12)
  • 配置 LR2021 模块引脚:
    • NSS=13、IRQ(DIO0)=15、RESET=5、BUSY=14
  • 支持中断回调机制,在数据包发送完成后自动触发回调标记发送状态
  • 采用非阻塞发送,主循环可以不断检测发送完成标志,进行后续操作
  • 支持 C 字符串或字节数组数据发送,长度可达 256 字节
  • 可连续发送带序号的数据包,便于调试

【代码分析】

  • PicoHal* hal = new PicoHal(SPI_PORT, SPI_MISO, SPI_MOSI, SPI_SCK):创建 Pico 硬件抽象层实例并绑定 SPI
  • LR2021 radio = new Module(hal, RFM_NSS, RFM_IRQ, RFM_RST, RFM_BUSY):初始化 LR2021 模块对象
  • radio.irqDioNum = 11:配置中断映射引脚
  • radio.XTAL = true:开启外部晶振,提高频率精度
  • radio.begin():初始化模块,返回错误码
  • radio.setPacketSentAction(setFlag):绑定发送完成回调函数 setFlag()
  • radio.setFrequency(868.0)setOutputPower(22)setBandwidth(125.0)setSpreadingFactor(7)setCodingRate(5)setSyncWord(...)setPreambleLength(8):配置 LoRa 参数
  • radio.startTransmit("Hello World!"):启动第一次数据包发送
  • setFlag():发送完成后设置 transmittedFlag = true,用于主循环检测
  • 主循环 for(;;)
    1. 检测 transmittedFlag
    2. 发送成功或失败打印状态
    3. 调用 radio.finishTransmit() 做发送收尾操作
    4. 延时 1 秒
    5. 构建带序号的新数据包继续发送

【运行效果】

  • 程序启动后在串口打印初始化状态(搭配02_lr2021_rx):


02_lr2021_rx

【程序说明】

  • 基于 树莓派 Pico + Core2021-XF 模块,使用 非 Arduino 环境 直接在 Pico 上运行 RadioLib 库接收数据
  • 使用 硬件 SPI1 端口 并自定义 SPI 引脚(SCK=10, MOSI=11, MISO=12)
  • 配置 LR2021 模块引脚:
    • NSS=13、IRQ(DIO0)=15、RESET=5、BUSY=14
  • 支持中断回调机制,在数据包接收完成后自动触发回调标记接收状态
  • 支持连续监听模式,可自动重新进入接收状态
  • 接收的数据既可以 HEX 格式打印,也可作为字符串输出

【代码分析】

  • PicoHal* hal = new PicoHal(SPI_PORT, SPI_MISO, SPI_MOSI, SPI_SCK):创建 Pico 硬件抽象层实例并绑定 SPI
  • LR2021 radio = new Module(hal, RFM_NSS, RFM_IRQ, RFM_RST, RFM_BUSY):初始化 LR2021 模块对象
  • radio.irqDioNum = 11:配置中断映射引脚
  • radio.XTAL = true:开启外部晶振,提高频率精度
  • radio.begin():初始化模块,返回错误码
  • radio.setPacketSentAction(setFlag):绑定发送完成回调函数 setFlag()
  • radio.setFrequency(868.0)setOutputPower(22)setBandwidth(125.0)setSpreadingFactor(7)setCodingRate(5)setSyncWord(...)setPreambleLength(8):配置 LoRa 参数
  • radio.startReceive():启动接收模式,进入监听状态
  • setFlag():接收完成后设置 receivedFlag = true,用于主循环检测
  • 主循环 for(;;)
    1. 检测 receivedFlag
    2. 读取数据包长度 radio.getPacketLength() 并调用 radio.readData(rxBuf, len)
    3. 根据返回状态打印:
      • 成功:数据长度、RSSI、SNR、HEX 格式、字符串内容
      • CRC 错误:提示 CRC 错误
      • 其他错误:打印错误码
    4. 自动重新进入接收状态 radio.startReceive()
    5. 延时 10 ms 避免 CPU 占用过高

【运行效果】

  • 程序启动后在串口打印初始化状态:(搭配01_lr2021_tx):


03_lr2021_pingpong

【程序说明】

  • 基于 树莓派 Pico + Core2021-XF 模块,实现 LoRa 自动乒乓收发(一问一答)双向通信
  • 使用 硬件 SPI1 端口 并自定义 SPI 引脚(SCK=10, MOSI=11, MISO=12)
  • 配置 LR2021 模块引脚:
    • NSS=13、IRQ(DIO0)=15、RESET=5、BUSY=14
  • 支持中断回调机制,在发送或接收完成后自动触发
  • 自动切换发送 / 接收状态,无需手动干预
  • 初次发送由 #define INITIATING_NODE 宏控制,另一块模块自动进入接收模式
  • 支持连续发送和接收字符串数据,并打印 RSSI / SNR

【代码分析】

  • PicoHal* hal = new PicoHal(SPI_PORT, SPI_MISO, SPI_MOSI, SPI_SCK):创建 Pico 硬件抽象层实例并绑定 SPI
  • LR2021 radio = new Module(hal, RFM_NSS, RFM_IRQ, RFM_RST, RFM_BUSY):初始化 LR2021 模块对象
  • radio.irqDioNum = 11:配置中断映射引脚
  • radio.XTAL = true:开启外部晶振,提高频率精度
  • radio.begin():初始化模块,返回错误码
  • radio.setPacketSentAction(setFlag):绑定发送 / 接收完成回调函数
  • 宏 INITIATING_NODE 决定当前节点是否先发送数据
  • 主循环 for(;;)
    1. 检测 operationDone 标志
    2. 如果是发送完成:
      • 打印发送状态
      • 切换到接收模式 radio.startReceive()
    3. 如果是接收完成:
      • 读取数据包 radio.readData(rxBuffer, rxLen)
      • 打印接收到的字符串、RSSI、SNR
      • 延时 1 秒后再次发送数据
    4. 每次循环结束延时 5 ms 避免 CPU 占用过高

【运行效果】

  • 两块模块分别烧录,一块定义 INITIATING_NODE
  • 上电后模块自动互发互收:


04_lr2021_tx_cw

【程序说明】

  • 基于 树莓派 Pico + Core2021-XF 模块,实现 LoRa 直接载波发射(CW/Direct Transmit)
  • 使用 硬件 SPI1 端口 并自定义 SPI 引脚(SCK=10, MOSI=11, MISO=12)
  • 配置 LR2021 模块引脚:
    • NSS=13、IRQ(DIO0)=15、RESET=5、BUSY=14
  • 输出固定频率的连续载波信号,无数据包格式,用于频段测试、信号检测、仪器校准
  • 固定频率 868 MHz,发射功率 22 dBm
  • 上电后模块持续发射,无需额外逻辑干预

【代码分析】

  • PicoHal* hal = new PicoHal(SPI_PORT, SPI_MISO, SPI_MOSI, SPI_SCK):创建 Pico 硬件抽象层实例并绑定 SPI
  • LR2021 radio = new Module(hal, RFM_NSS, RFM_IRQ, RFM_RST, RFM_BUSY):初始化 LR2021 模块对象
  • radio.irqDioNum = 11:配置中断映射引脚
  • radio.XTAL = true:开启外部晶振,提高频率精度
  • radio.begin():初始化模块,返回错误码
  • radio.setOutputPower(22):设置发射功率为 22 dBm
  • radio.transmitDirect(OUT_HZ):进入 连续直接发射模式,输出固定频率载波
  • 主循环无业务逻辑,载波持续发射无需程序干预

【运行效果】

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

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


05_lr2021_LoRaWAN

【程序说明】

  • 基于 树莓派 Pico + Core2021-XF 模块,实现 LoRaWAN OTAA 入网与上下行通信
  • 使用 硬件 SPI1 端口 并自定义 SPI 引脚(SCK=10, MOSI=11, MISO=12)
  • 支持 EEPROM 仿真存储,掉电重启可快速恢复会话信息
  • 定时发送上行数据(随机 3 字节 payload,默认周期 uplinkIntervalSeconds)
  • 自动接收服务器下行消息,打印数据 HEX/ASCII
  • 支持连续上下行,自动保存 LoRaWAN 会话状态,防止 DevNonce 重复

【代码分析】

  • PicoHal* hal = new PicoHal(SPI_PORT, SPI_MISO, SPI_MOSI, SPI_SCK):创建 Pico 硬件抽象层实例并绑定 SPI
  • LR2021 radio = new Module(hal, RFM_NSS, RFM_IRQ, RFM_RST, RFM_BUSY):初始化 LR2021 模块对象
  • LoRaWANNode node(&radio, &Region, subBand):创建 LoRaWAN 节点实例
  • Flash EEPROM 仿真:
    • FLASH_TARGET_OFFSET:存储偏移
    • FLASH_EMULATE_EEPROM_SIZE:仿真容量
    • saveLoRaWANState() / restoreLoRaWANState():保存 / 恢复 LoRaWAN 会话状态
  • node.beginOTAA(joinEUI, devEUI, nwkKey, appKey):初始化 OTAA 参数
  • joinLoRaWAN(restored):尝试入网并保存 DevNonce / Session
  • 上行 / 下行发送:
    • node.sendReceive(tx, sizeof(tx), 1, rx, &rxLen):发送上行数据并接收下行
    • 成功发送后保存 session 防止计数回退
    • 下行数据打印 HEX / ASCII
  • 循环逻辑:
    1. 发送随机 payload
    2. 检测是否收到下行
    3. 保存状态
    4. 延时 uplinkIntervalSeconds 秒后下一次发送

【运行效果】

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

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



Arduino 使用

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

配置开发环境

1. 安装和配置

  • 关于 Arduino 的环境搭建跟基本使用,请参考这个R4 链接、R3 是默认安装
  • 环境搭建完成后,即可连接传感器,下载示例程序

2. 硬件配置

  • Arduino 开发板的 IO 电平必须为 3.3V,如果使用 5V 的 IO 电平,需要经过电平转换,否则传感器会损坏
  • 使用 waveshare R3/R4 需要将以下的跳线帽设置成 3.3V,才能使用
图片说明


Arduino UNO R3


Arduino UNO R4


Arduino UNO R4 WIFI

硬件连接

参考下表进行连接

Core2021-XFArduino UNO
CLK13
MISO12
MOSI11
CS10
DIO112
RESET3
BUSY9

示例程序

  • Arduino 示例程序位于 示例程序包 的 core2021-xf\examples\arduino 目录中。
  • 示例 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_LoRaWANLoRaWAN(Arduino R3 无法使用)RadioLib
  • 选择开发板:

    图片说明


    Arduino UNO R3


    Arduino UNO R4
  • 选择开发板的端口,然后进行编译上传

  • 上传完成后,打开串口监测器,就会输出相关的信息。

01_lr2021_tx

【程序说明】

  • 基于 Core2021-XF 模块,使用 中断方式 实现 LoRa 数据包周期性发送
  • 采用非阻塞发送机制,不占用主循环 CPU 资源
  • 每发送完成一包数据,自动延时 1 秒后继续发送下一包
  • 支持字符串数据发送,自带数据包序号,方便调试

【代码分析】

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

【运行效果】

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


02_lr2021_rx

【程序说明】

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

【代码分析】

  • 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

【程序说明】

  • 基于 Core2021-XF 模块,实现 LoRa 自动乒乓收发(一问一答)双向通信
  • 两块模块即可完成互发互收,无需手动控制
  • 开启 INITIATING_NODE 为发起端,另一块为接收端
  • 自动切换发送 / 接收状态,非阻塞中断驱动

【代码分析】

  • 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

【程序说明】

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

【代码分析】

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

【运行效果】

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

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


05_lr2021_LoRaWAN

【程序说明】

  • 基于 Core2021-XF 模块 + Arduino UNO R4 平台,实现 LoRaWAN OTAA 入网与上下行通信
  • 支持 OTAA 动态入网,支持 EEPROM 存储会话信息,掉电重启可快速恢复连接
  • 定时发送上行数据(默认 5 分钟),并监听服务器下行消息
  • 自动打印接收数据的 HEX 与 ASCII 格式,支持信号质量监控

【代码分析】

  • radio.irqDioNum = 11:配置 LR2021 中断映射引脚,必须在初始化前设置
  • radio.XTAL = true:开启外部晶振,保证 LoRaWAN 频率精度
  • EEPROM.begin():初始化片上 EEPROM,用于保存 LoRaWAN 会话信息
  • restoreLoRaWANState():从 EEPROM 恢复入网会话与随机值,实现快速重连
  • node.beginOTAA():初始化 OTAA 入网参数(JoinEUI、DevEUI、AppKey、NwkKey)
  • node.activateOTAA():发起 OTAA 加入服务器请求
  • saveLoRaWANState():入网成功后保存会话信息到 EEPROM
  • node.sendReceive():发送上行数据,并自动开启接收窗口监听下行消息
  • printHex / printAscii:打印下行数据的十六进制与 ASCII 格式

【运行效果】

  • 环境搭建参考 LoRaWAN 环境搭建文档

  • 程序烧录后自动进行 OTAA 入网,入网成功后定时上传数据

  • 串口打印入网状态、上下行消息、RSSI、SNR 等信息,如下图所示:



Raspberry Pi 开发说明

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

配置开发环境

1. 安装和配置

  • 关于树莓派系统安装与使用可以参考这个链接
  • 成功开机后,进行树莓派环境配置

2. 下载程序

sudo apt install cmake -y
sudo apt install -y liblgpio-dev
cd ~
#国内用gitee下载
git clone https://gitee.com/waveshare/core2021-xf.git
#国外用github下载
git clone https://github.com/waveshareteam/core2021-xf.git
cd core2021-xf/examples/raspberrypi

3. 打开树莓派 SPI 接口

  • 在树莓派终端输入命令:sudo raspi-config nonint do_spi 0

硬件连接

参考下表进行连接

Core2021-XFRaspberry Pi (BCM)
CLK11
MISO9
MOSI10
CS25
DIO1117
RESET22
BUSY24

示例程序

  • Raspberry Pi 示例程序位于 示例程序包 的 core2021-xf/examples/raspberrypi 目录中。
  • 示例 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

01_lr2021_tx

【程序说明】

  • 基于 树莓派 + Core2021-XF 模块,使用中断方式实现 LoRa 数据包周期性发送
  • 专用硬件引脚配置,适配树莓派 SPI 与 GPIO 接口
  • 采用非阻塞发送机制,运行高效稳定
  • 每 1 秒自动发送一包带序号的测试数据,适合长期稳定运行

【脚本说明】

  • build.sh:工程编译脚本,自动创建构建目录、生成 Makefile、编译项目,输出可执行文件
  • clean.sh:工程清理脚本,快速删除编译生成的文件,还原工程目录

【代码分析】

  • PiHal* hal = new PiHal(0, SPI_FREQ_HZ):树莓派硬件初始化,配置 SPI 总线与时钟
  • radio.irqDioNum = 11:配置 LR2021 模块中断映射引脚
  • radio.XTAL = true:开启外部晶振,保证通信频率精度
  • setFlag(void):中断回调函数,发送完成后自动标记状态
  • radio.setPacketSentAction(setFlag):绑定发送完成中断
  • radio.startTransmit():启动 LoRa 数据包异步发送
  • radio.finishTransmit():发送完成后关闭射频电路,确保稳定低功耗
  • 主循环:检测发送完成 → 打印日志 → 延时 → 发送下一包数据

【程序使用】

  • 进入到lr2021_tx目录,执行编译运行:
cd ~/core2021-xf/examples/raspberrypi/lr2021_tx
chmod +x *
./build.sh
./build/01_lr2021_tx

【运行效果】

  • 编译运行后终端实时打印发送状态与数据包序号,可搭配接收模块完成通信测试


02_lr2021_rx

【程序说明】

  • 基于 树莓派 + Core2021-XF 模块,使用中断方式实现 LoRa 数据包无线接收
  • 专用硬件引脚配置,适配树莓派 SPI 与 GPIO 接口
  • 采用非阻塞监听模式,实时接收数据,运行高效稳定
  • 接收成功后自动打印数据长度、RSSI、SNR、HEX 及字符串格式,便于调试

【脚本说明】

  • build.sh:工程编译脚本,自动创建构建目录、生成 Makefile、编译项目,输出可执行文件
  • clean.sh:工程清理脚本,快速删除编译生成的文件,还原工程目录

【代码分析】

  • PiHal* hal = new PiHal(0, SPI_FREQ_HZ):树莓派硬件初始化,配置 SPI 总线与时钟
  • radio.irqDioNum = 11:配置 LR2021 模块中断映射引脚
  • radio.XTAL = true:开启外部晶振,保证通信频率精度
  • setFlag(void):中断回调函数,接收完成后自动标记状态
  • radio.setPacketReceivedAction(setFlag):绑定接收完成中断
  • radio.startReceive():启动 LoRa 异步监听模式
  • radio.readData():读取接收到的数据包,支持 HEX 与字符串解析
  • radio.getRSSI() / radio.getSNR():获取信号质量参数
  • 主循环:检测接收完成 → 解析数据 → 打印信息 → 重新开启监听

【程序使用】

  • 进入到lr2021_rx目录,执行编译运行:
cd ~/core2021-xf/examples/raspberrypi/lr2021_rx
chmod +x *
./build.sh
./build/02_lr2021_rx

【运行效果】

  • 编译运行后终端实时打印接收状态、数据内容、信号质量,可搭配发送模块完成完整通信测试


03_lr2021_pingpong

【程序说明】

  • 基于 树莓派 + Core2021-XF 模块,实现 LoRa 自动乒乓收发(一问一答) 双向通信
  • 专用硬件引脚配置,适配树莓派 SPI 与 GPIO 接口
  • 中断驱动非阻塞模式,自动切换发送 / 接收状态
  • 两块设备即可互发互收,无需手动控制,适合双向链路验证

【脚本说明】

  • build.sh:工程编译脚本,自动创建构建目录、生成 Makefile、编译项目,输出可执行文件
  • clean.sh:工程清理脚本,快速删除编译生成的文件,还原工程目录

【代码分析】

  • PiHal* hal = new PiHal(0, SPI_FREQ_HZ):树莓派硬件初始化,配置 SPI 总线与时钟
  • radio.irqDioNum = 11:配置 LR2021 模块中断映射引脚
  • radio.XTAL = true:开启外部晶振,保证通信频率精度
  • setFlag(void):通用中断回调,发送/接收完成都会触发
  • INITIATING_NODE:宏定义,用于区分主动发起节点
  • radio.startTransmit():启动数据包发送
  • radio.startReceive():切换模块到监听状态
  • radio.readData():读取接收的 LoRa 数据包并解析
  • 主逻辑:发送完成 → 进入接收;接收完成 → 延时回复 → 再次发送

【程序使用】

  • 进入到lr2021_pingpong目录,执行编译运行:
cd ~/core2021-xf/examples/raspberrypi/lr2021_pingpong
chmod +x *
./build.sh
./build/03_lr2021_pingpong

【运行效果】

  • 两块树莓派设备自动互发互收,终端实时打印收发状态、数据、RSSI、SNR


04_lr2021_tx_cw

【程序说明】

  • 基于 树莓派 + Core2021-XF 模块,实现 LoRa 固定频率连续载波发射
  • 专用硬件引脚配置,适配树莓派 SPI 与 GPIO 接口
  • 输出纯净连续射频信号,无数据包格式,用于仪器校准、频段测试、信号检测
  • 发射频率:868MHz,发射功率:22dBm
  • 上电后立即持续发射,程序稳定无额外操作

【脚本说明】

  • build.sh:工程编译脚本,自动创建构建目录、生成 Makefile、编译项目,输出可执行文件
  • clean.sh:工程清理脚本,快速删除编译生成的文件,还原工程目录

【代码分析】

  • PiHal* hal = new PiHal(0, SPI_FREQ_HZ):树莓派硬件初始化,配置 SPI 总线与时钟
  • radio.XTAL = true:开启外部晶振,保证载波频率精度
  • OUT_HZ 868000000UL:定义连续发射频率(868MHz)
  • radio.setOutputPower(22):配置发射功率为 22dBm
  • radio.transmitDirect(OUT_HZ):进入直接连续发射模式,输出固定频率载波

【程序使用】

  • 进入到04_lr2021_tx_cw目录,执行编译运行:
cd ~/core2021-xf/examples/raspberrypi/04_lr2021_tx_cw
chmod +x *
./build.sh
./build/04_lr2021_tx_cw

【运行效果】

  • 程序运行后模块立即输出固定频率连续载波信号,可使用频谱仪或接收设备检测到稳定射频信号


05_lr2021_LoRaWAN

【程序说明】

  • 基于 树莓派 + Core2021-XF 模块,实现 LoRaWAN OTAA 入网 + 周期性上报 + 下行接收
  • 使用文件 lorawan_state.bin 持久化保存会话信息,掉电重启可快速恢复,无需重复入网
  • 专用硬件引脚配置,完美适配树莓派 SPI / GPIO 接口
  • 每 5 分钟自动上传随机测试数据,支持下行指令解析
  • 实时打印入网状态、信号质量、上下行数据,便于调试与部署

【脚本说明】

  • build.sh:工程编译脚本,自动创建构建目录、生成 Makefile、编译项目,输出可执行文件
  • clean.sh:工程清理脚本,快速删除编译生成的文件,还原工程目录

【代码分析】

  • PiHal* hal = new PiHal(0, SPI_FREQ_HZ):树莓派硬件初始化,SPI0 + 8MHz 时钟
  • radio.irqDioNum = 11:配置 LR2021 中断映射,确保通信稳定
  • radio.XTAL = true:开启外部晶振,保证 LoRaWAN 频点精度
  • saveLoRaWANState():将会话数据保存到本地文件,实现持久化
  • restoreLoRaWANState():从文件恢复会话,支持快速重连
  • node.beginOTAA() / node.activateOTAA():OTAA 入网关键函数
  • node.sendReceive():发送上行数据并监听服务器下行
  • printHex / printAscii:格式化打印下行数据

【程序使用】

  • 进入到05_lr2021_LoRaWAN目录,执行编译运行:
cd ~/core2021-xf/examples/raspberrypi/05_lr2021_LoRaWAN
chmod +x *
./build.sh
./build/05_lr2021_LoRaWAN

【运行效果】

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



STM32 使用说明

  • 本章节展示的是 LoRa 官方 USP 库 示例
  • 相关使用文档可以直接访问官方 GitHub:USP 文档说明

硬件连接

参考下表进行连接:

Core2021-XFSTM32L476RG
CLKPA5
MISOPA6
MOSIPA7
CSPA8
DIO8PA1
RESETPA0
BUSYPB3

示例程序

  • STM32 示例程序位于 Lora-net/usp 的 examples/main_examples 目录中
  • 测试需准备 两个 Core2021-XF 模块:一个发送,一个接收
  • 以下对几个示例程序进行说明,包括使用方法和运行效果

main_porting_tests

【程序说明】

  • 基于 STM32L476RG + Core2021-XF,实现端口功能验证示例
  • 用于测试以下内容:
    • SPI 接口功能
    • 中断 IRQ 响应
    • 定时器和低功耗模式
    • 随机数生成
    • 无线电配置时间
    • MCU 睡眠时间
    • Flash 仿真存储(可选)
  • 测试覆盖模块初始化、发送/接收配置以及 MCU 相关硬件接口
  • 通过串口打印测试结果

【代码分析】

  • 硬件抽象层:
    • smtc_modem_hal.hsmtc_hal_mcu.hsmtc_hal_gpio.hsmtc_hal_watchdog.h
    • IRQ 回调函数:radio_tx_irq_callbackradio_rx_irq_callbacktimer_irq_callback
  • LoRa/Radio 参数:
    • ralf_params_lora_t rx_lora_param / tx_lora_param:用于端口测试的模拟 RX/TX 配置
    • 固定频率、符号率、带宽、同步字和发射功率
  • 主要测试函数:
    • porting_test_spi():验证 SPI 端口与芯片固件版本
    • porting_test_radio_irq():验证收发中断触发
    • porting_test_get_time():检测 HAL 获取时间函数
    • porting_test_timer_irq():验证定时器中断
    • porting_test_stop_timer():验证定时器停止功能
    • porting_test_disable_enable_irq():验证中断禁用/启用逻辑
    • porting_test_random():验证随机数生成与分布
    • porting_test_config_rx_radio() / porting_test_config_tx_radio():检测收发配置时间
    • porting_test_sleep_ms():检测 MCU 睡眠时间
    • porting_test_timer_irq_low_power():验证定时器低功耗模式
  • Flash 测试(可选):porting_test_flash() / test_context_store_restore()
  • main_porting_tests()
    • 初始化 MCU 外设
    • 禁用 IRQ 避免初始化冲突
    • 循环执行端口测试,根据 ENABLE_TEST_FLASH 选择是否进行 Flash 测试
    • 结束后进入无限循环并刷新看门狗

【运行效果】

  • 上电启动后串口打印:



ping_pong_example

【程序说明】

  • 基于 STM32L476RG + Core2021-XF,实现 Ping-Pong + 周期性上行通信示例
  • 支持用户按键触发 Manager 模式
    • Manager 发起 PING
    • Subordinate 自动响应 PONG
    • 每次发送或接收完成后自动触发回调处理
  • 支持周期性上行(默认每 10 秒发送一次固定 payload "LoRa"
  • LED 指示 TX/RX 状态
  • 使用 Watchdog 防止 MCU 死锁
  • 自动进入低功耗睡眠,节省能量

【代码分析】

  • MCU 初始化:
    • hal_mcu_init():初始化 MCU 外设
    • smtc_rac_init():初始化 Radio Abstraction Layer
  • 用户按键:
    • user_button_t 保存状态和按下时间
    • user_button_callback():按键防抖,触发 Manager 模式
  • LED 初始化:SMTC_LED_TX / SMTC_LED_RX
  • 应用初始化:
    • ping_pong_init():初始化 Ping-Pong 事务
    • periodic_uplink_init():初始化周期上行
  • 主循环:
    1. 喂狗:hal_watchdog_reload()
    2. 执行 Radio 事务:smtc_rac_run_engine()
    3. 处理按键事件:ping_pong_on_button_press()
    4. MCU 睡眠:判断是否有待处理事务,通过 hal_mcu_set_sleep_for_ms(SLEEP_DELAY)
  • 核心逻辑:
    • ping_pong_init():设置交易上下文、Payload、调制参数
    • ping_pong_tx() / ping_pong_rx():发送/接收 PING 或 PONG
    • pre_ping_pong_callback() / post_ping_pong_callback()
      • LED 控制
      • 处理事务完成状态(TX_DONE / RX_PACKET / RX_TIMEOUT / CRC_ERROR / TASK_ABORTED)
      • 自动重试或重启
  • 周期性上行逻辑:通过回调函数调度下一次发送

【运行效果】

  • 上电后串口打印:



main_periodical_uplink

【程序说明】

  • 基于 STM32L476RG + Core2021-XF,实现:
    • LoRaWAN OTAA 入网
    • 周期性上行(Periodic Uplink)
    • 用户按键触发即时上行
  • 使用 example_options.h 提供 LoRaWAN 用户凭据:
    • USER_LORAWAN_DEVICE_EUI
    • USER_LORAWAN_JOIN_EUI
    • USER_LORAWAN_GEN_APP_KEY
    • USER_LORAWAN_APP_KEY
  • 配置区域:MODEM_EXAMPLE_REGION(EU868 或 WW_2G4)
  • Watchdog 和低功耗睡眠保护 MCU
  • 串口打印事件、上行/下行数据和调试信息

【代码分析】

  • 初始化:
    • hal_mcu_init()hal_gpio_init_in() 配置外设
    • smtc_rac_init() 和 smtc_modem_init() 初始化 Modem,回调 modem_event_callback()
  • 用户按键:
    • user_button_callback() 处理按键事件,触发即时上行
  • 周期性上行:
    • periodical_uplink_init() 初始化事务
    • 每次发送完成后,post_periodic_callback() 调度下一次上行
  • 事件回调:
    • modem_event_callback() 处理 Modem 各类事件:
      • RESET:设置凭据和区域,发起 Join
      • JOINED:入网成功,启动第一次周期上行
      • ALARM:周期上行触发
      • TXDONE:上行发送完成
      • DOWNDATA:下行数据接收
      • 其他事件:LINK_CHECKCLASS_B_PING_SLOT_INFO 等打印调试信息
  • 上行数据:
    • 32-bit uplink counter
    • 可选端口发送(默认 101/102)
  • 主循环:
    • 检查按键触发即时上行
    • 调用 smtc_modem_run_engine() 和 smtc_rac_run_engine() 处理事务
    • MCU 睡眠至下次事务或 Watchdog reload

【运行效果】

  • 上电后串口打印:



LoRaWAN 环境搭建

LoRa和LoRaWAN

什么是LoRa?

Semtech 的 LoRa 是一种长距离、低功耗的物联网 (IoT) 无线平台,一般情况下泛指使用LoRa技术的射频芯片.主要特点如下

  • LoRa(long range 的缩写)采用的扩频调制技术源于啁啾扩频 (CSS) 技术,是远距离无线传输技术和LPWAN通信技术中的一种.扩频技术用带宽换取灵敏度的技术,Wi-Fi,ZigBee等都使用了扩频技术,但LoRa调制的特点是接近香农定理的极限,最大效率地提高灵敏度.相比于传统FSK技术,在相同的通信速率下,LoRa比FSK灵敏度好8~12dBm.目前,LoRa 主要在Sub-GHz的ISM频段运行,

  • LoRa技术融合了数字扩频、数字信号处理和前向纠错编码等技术使得在长距离通信性能层面大幅度提高,LoRa的链路预算优于其他任何标准化的通信技术,链路预算是指给定的环境中决定距离的主要因素.

  • LoRa射频芯片主要有 SX127X系列,SX126X系列,SX130X系列,其中SX127X,SX126X系列用于LoRa节点,SX130X用于LoRa网关,详情可参考Semtech的产品列表

什么是LoRaWAN?

  • LoRaWAN 是一种建立在 LoRa 无线电调制技术之上的低功耗广域网开放协议。旨在将电池供电的“事物”无线连接到区域、国家或全球网络中的互联网,并针对关键的物联网 (IoT) 要求,例如双向定向通信、端到端安全、移动性和本地化服务。其中节点无线连接到互联网有入网认证,相当于建立节点和服务器间的加密通信信道,LoRaWAN协议层次下图所示。

  • MAC层中的Class A/B/C 三类节点设备基本覆盖了物联网所有的应用场景,三者之间不同点在于节点收发的时隙不同

  • Modulation层中EU868,AS430等表明不同国家使用频段参数不同,地区参数请点击参考链接


  • 实现LoRaWAN网络覆盖城市或其它区域需要由节点(LoRa节点射频芯片)、网关(或称基站,LoRa网关射频芯片)、Server和云四部分组成,如下图所示

  • DEVICE(节点设备)需先发起入网请求数据包到GATEWAY(网关)再到服务器,认证通过后才可以正常和服务器收发应用数据

  • GATEWAY(网关)可通过有线网络,3/4/5G无线网络与服务器进行通信

  • 服务器端主要运营商有TTN等,自行搭建云端服务请参考lorawan-stack,chirpstack


应用

  • 本应用基于 LoRaWAN 官方示例ModemE_application_examples,仅演示了基础的 LoRaWAN Class A 应用。其他高级示例可参考官方仓库自行移植,包括:认证申请、LoRaWAN B 类应用、LoRaWAN 多播 B/C 类示例和FUOTA 示例。

器件准备

  • 树莓派4B(含配套电源)

  • SD卡(建议使用容量大于 8GB 的 SD 卡)

  • 读卡器

  • 网关设备

  • 节点设备

  • 开发板(可选型号):ESP32、树莓派、STM32 和 Raspberry Pi Pico


服务器搭建

  • 本示例使用ChirpStack作为 LoRaWAN 网络服务器,请按照官方提供的 Raspberry Pi 安装步骤进行配置。

  • 先下载ChirpStack Gateway OS 镜像,将其解压后,使用Win32DiskImager将镜像写入 SD 卡。

    下载镜像


    写入镜像


  • 写入完成后,请参考官方文档进行详细配置。本文仅提供简要安装流程,详细信息请参见:ChirpStack Gateway OS 入门指南

  • 将 SD 卡插入树莓派并通电启动。启动后,电脑 Wi-Fi 将扫描到名为 ChirpStackAP-XXXXXX 的无线热点,密码为 ChirpStackAP。连接成功后,在浏览器中访问:192.168.0.1,即可打开 ChirpStack 管理界面,首次登录无需密码。

    连接 Wi-Fi


    访问 Web 界面


  • 启动后可通过以太网或 Wi-Fi 接入外部网络。此处以连接以太网为例,若需配置 Wi-Fi,请参考:Wi-Fi 配置,联网后可在 Web 管理界面查看当前 IP 地址。


添加网关

  • 服务器配置完成并获取 IP 地址后,关闭树莓派并断电,将 SX1303-868M-LoRaWAN-Gateway-HAT(网关设备)连接至树莓派,并接上天线。启动树莓派后,在浏览器中访问前面获取的 IP 地址,进入 ChirpStack 管理界面,依次点击ChirpStack -> Concentratord,启用网关功能。以 SX1303(868 MHz)为例,配置如下,配置完成后点击“保存并应用”:


    使能网关


    配置网关参数

  • 使用前面获取的 IP 地址通过 SSH 工具(如 MobaXterm)远程访问设备。默认用户名为 root,连接成功后,在终端中输入以下命令获取网关 ID:gateway-id,系统将输出当前设备的网关 ID,请记下该 ID,稍后添加网关时将用到。


  • 进入应用程序:Applications -> ChirpStack,首次进入时需要登录,默认账号和密码均为 admin。登录后,点击 Gateways -> Add gateway,在添加页面中填写前面获取的 gateway-id,并保存。返回 Gateways 页面,即可看到网关是否已经成功上线。


    添加网关到服务器


    查看网关是否上线

添加节点

  • 这里以 Core1121-XF 为例,添加节点。

  • 首先,在 Web 界面中添加一个设备配置文件:Device Profiles -> Add device profile,配置如下图所示:


  • 然后添加一个应用程序:Applications -> Add application,填写相关信息并保存:



    设置 EUI


    设置密钥

  • 使用 05_lr2021_LoRaWAN 示例程序,打开后进入目录:core2021-xf\examples\arduino\05_lr2021_LoRaWAN中,编辑其中的 config.h 文件,将前面生成的 EUI 和 密钥 等信息填入对应位置。完成后编译并烧录。


  • 烧录完成后,节点将自动请求加入 LoRaWAN 网络。加入成功后,节点将定时发送上行数据。可通过 Web 界面查看设备事件与通信状态:

    ①、点击 Events,查看节点运行状态

    ②、观察是否加入失败

    ③、若加入成功,可看到入网事件

    ④、查看节点上报的数据

    ⑤、通过串口查看调试信息


  • 服务器也支持向节点下发数据:

    ①、点击 Queue

    ②、输入需要下发的十六进制数据

    ③、点击发送

    ④、节点接收数据并在串口打印



相关资料

1. 硬件资料

开发板设计文件

2. 文档手册

3. 示例程序


技术支持

周一-周五(9:30-6:30)周六(9:30-5:30)

手机:13434470212

邮箱:services04@spotpear.cn

QQ:202004841



[教程导航]