在当今的物联网领域,远距离、低功耗的无线通信技术需求日益增长。LoRa1120 模块与 ESP32 的组合,为实现点对点 LoRa 通信提供了一个高效且可靠的解决方案。本文将详细介绍如何实现这一通信方式,涵盖从模块技术特性分析、硬件系统连接、开发环境配置,到固件实现、通信验证和关键性能指标解读的全过程。
LoRa1120 模块的是 Semtech 的 LR1120 芯片组,这是一款专为远距离、低功耗无线通信和地理定位应用而设计的集成电路。它不仅仅是一个单纯的 LoRa 收发器,更是一个集成了多种通信模式和定位功能的综合平台。
该模块具备在多个不同频段下工作的能力,为不同应用场景和地区法规要求提供了高度的灵活性。
- Sub - GHz ISM 频段:支持 433/470/868/915 MHz 等免许可频段,并可根据需求在 150 - 960 MHz 范围内定制。这是传统 LoRa 应用的主要工作频段,其物理特性决定了它具有远的传输距离和的穿透能力,适用于广域物联网(LPWAN)部署。
- 2.4 GHz ISM 频段:工作范围为 2400 - 2500 MHz。该频段在范围内通用,相比 Sub - GHz 频段,它可以提供更高的数据传输速率。然而,其传输距离和穿透性相对较弱,更适用于对带宽有一定要求且通信距离较短的场景,如工业自动化或智能家居。
- S 波段卫星通信:工作范围为 1900 - 2200 MHz。此功能使得模块能够直接与卫星进行通信,为地面网络无法覆盖的偏远地区(如海洋、沙漠、山区)提供连接解决方案,是资产跟踪和远程监控等应用的理想选择。

除了通信功能,LoRa1120 还集成了两种独立的低功耗扫描引擎,用于地理位置确定。
- GNSS 扫描器:支持多星座导航卫星系统(如 GPS / 北斗),采用云原生辅助定位模式。模块本身只负责扫描卫星信号并捕获原始数据,然后将这些轻量级数据通过 LoRa 网络传输到云端进行解析。这种架构极大地降低了终端设备的功耗和计算负担,使其适用于对电池寿命有严苛要求的定位应用。
- Wi - Fi 被动扫描器:通过扫描周围的 802.11b/g/n Wi - Fi 接入点(AP)的 MAC 地址来进行定位。在城市或室内等 GNSS 信号较弱的环境中,Wi - Fi 定位可以作为一种有效的补充或替代方案。同样,它只捕获 MAC 地址列表,交由云端服务解析具体位置。
模块在物理层上符合 LoRa 联盟发布的 LoRaWAN 标准规范,确保了与标准 LoRaWAN 网络的互操作性。同时,它也支持 Sigfox 协议,并内置了 AES - 128 硬件加密和解密引擎,为数据传输提供了硬件级别的安全保障。这种多功能集成设计表明,工程师使用单一硬件平台,仅通过固件配置,即可满足截然不同的应用需求。
搭建一个可靠的测试平台是验证无线通信链路性能的基础。为构建一个基本的点对点通信系统,需要准备两套相同的硬件设备:
- ESP32 开发板(例如 ESP32 - PICO):2 块
- LoRa1120 模块:2 个
- 杜邦线:若干
- USB 数据线:2 条
将 LoRa1120 模块与 ESP32 开发板通过 SPI 接口进行连接,推荐的引脚对应关系如下表所示。务必确保两套设备的连接方式完全一致。

此连接方案采用了标准的 4 线 SPI 接口(SCK, MISO, MOSI, NSS)用于数据传输。除此之外,还有三条至关重要的控制线(IRQ, RST, BUSY)。
- RST (Reset):用于通过软件控制对 LoRa1120 模块进行硬件复位,使其恢复到初始状态。
- BUSY (Busy):这是一个硬件流控制信号。当模块内部正在处理命令或处于活动状态时,BUSY 引脚会置为高电平,此时主控(ESP32)不应发送新的 SPI 命令,以避免命令冲突和数据丢失,确保通信的可靠性。
- IRQ (Interrupt Request):该引脚用于向主控发送中断信号,以通知特定事件的发生,例如数据包接收完成或发送完成。采用中断驱动的方式比轮询方式效率更高,可以让主控在等待事件时进入低功耗模式,从而显著降低系统整体功耗。
需要注意的是,虽然上述引脚分配是推荐配置,但工程师可以根据自己的 PCB 布局或开发板资源进行调整。然而,任何硬件上的改动都必须在后续的软件代码中进行同步修改,否则将导致通信失败。
正确的软件环境配置是程序开发的前提。以下是配置 Arduino IDE 以支持 ESP32 和 LoRa1120 模块开发的步骤:
- 安装 Arduino IDE:从 Arduino 网站并安装版本的 Arduino IDE。
- 添加 ESP32 开发板支持:打开 Arduino IDE,点击 File -> Preferences,在 "Additional Board Manager URLs" 字段中输入以下 URL
这个 URL 指向一个索引文件,它告诉 IDE 在哪里可以找到适用于 ESP32 系列微控制器的工具链、库和定义。
3. 安装 ESP32 包:打开左侧边栏的 "Boards Manager",在搜索框中输入 "esp32",找到由 "Espressif Systems" 提供的包,并点击 "Install"。
4. 安装 RadioLib 库:RadioLib 是一个功能强大的通用无线通信库,它为包括 LR1120 在内的多种射频芯片提供了统一的、的 API 接口。打开左侧边栏的 "Library Manager",在搜索框中输入 "RadioLib",找到由 "Jan Gromes" 开发的 RadioLib 库,并点击 "Install"。
选择 RadioLib 库的好处在于,它作为一个硬件抽象层(HAL),将底层复杂的寄存器读写操作封装成易于理解和使用的函数。这意味着开发者无需深入研究 LR1120 芯片的数据手册即可快速实现通信功能。此外,由于 RadioLib 支持多种射频模块(如 SX127x, SX126x, CC1101 等),为本项目编写的代码可以很方便地移植到其他硬件平台,从而提高了代码的可重用性和项目的灵活性。
完成环境配置后,接下来通过一个 “乒乓” 通信示例来验证硬件连接和软件设置的正确性。该示例中,一个节点(发起节点)发送一个数据包,另一个节点(响应节点)接收到后会回复一个数据包,如此循环往复。
在 Arduino IDE 中,通过菜单栏导航至 File > Examples > RadioLib > PhysicalLayer > LR11x0_PingPong 来打开示例代码。
以下是对 LR11x0_PingPong.ino 关键部分的分析:
- 节点角色定义
此处的 #define INITIATING_NODE
宏定义是区分两个节点角色的关键。同一份代码需要被上传到两个 ESP32 设备上。在一个设备上,需要取消这一行的注释,使其成为 “发起节点”。在另一个设备上,保持这一行被注释,它将自动成为 “响应节点”。这是一种在嵌入式开发中非常常见且高效的技术,可以用单一代码库实现两种不同的设备行为。
2. 硬件引脚定义与 SPI 总线配置:
- 引脚定义:
#define
语句块定义了 ESP32 与 LoRa1120 模块连接的 GPIO 引脚。这里定义的数值(10, 2, 4, 9)必须与实际的硬件接线完全一致。 - SPI 总线选择:
SPIClass spi(HSPI);
这行代码指定了使用 ESP32 的哪个 SPI 外设。ESP32 通常拥有多个 SPI 接口(如 VSPI 和 HSPI)。此处明确选择了 HSPI。对于使用不同型号 ESP32 开发板的工程师来说,这是一个关键细节,因为不同开发板的 SPI 引脚分配可能不同。 - SPI 参数设置:
SPISettings spiSettings(...)
用于配置 SPI 通信的参数。2000000
:设置 SPI 时钟速度为 2 MHz。MSBFIRST
:设置数据传输为有效位(Most Significant Bit)优先。SPI_MODE0
:定义 SPI 的时钟极性(CPOL = 0)和时钟相位(CPHA = 0)。这些参数必须符合 LR1120 芯片的技术要求。
- RadioLib 对象实例化:
4. 模块初始化:
cppvoid setup() {
Serial.begin(115200);
// initialize LR1110 with default settings
Serial.print(" Initializing... ");
spi.begin();
int state = radio.begin();
if (state == RADIOLIB_ERR_NONE) {
Serial.println("success!");
} else {
Serial.print("failed, code ");
Serial.println(state);
while (true);
} }
在 setup()
函数中,radio.begin()
函数负责执行与 LoRa1120 模块的初始通信。它会通过 SPI 接口对模块进行一系列初始化配置,包括设置默认的 LoRa 参数(如频率、带宽、扩频因子等),并检查模块是否正常响应。如果初始化成功,程序将继续执行;否则,将打印错误代码并进入死循环,方便开发者进行调试。
在 Arduino IDE 的 Tools 菜单中,选择正确的开发板(例如 "ESP32 PICO - D4")和对应的 COM 端口。点击 IDE 工具栏上的 "Upload"(上传)按钮,IDE 将自动编译代码并将其烧录到 ESP32 中。对两个设备重复此操作(注意其中一个要取消 #define INITIATING_NODE
的注释)。
固件上传完成后,需要通过串口监视器来验证通信是否成功,并理解输出的关键性能指标。
在 Arduino IDE 中,点击右上角的放大镜图标或通过 Tools > Serial Monitor 打开串口监视器。确保右下角的波特率设置为 115200,这必须与代码中 Serial.begin(115200);
的设置相匹配。
输出日志中的 RSSI 和 SNR 是衡量无线通信链路质量重要的两个指标。
- RSSI (Received Signal Strength Indicator, 接收信号强度指示):
- 定义:RSSI 是接收端测量到的信号功率,单位为 dBm。它是一个对数单位,值越接近 0 表示信号越强。例如,- 66 dBm 是一个非常强的信号,通常表示收发设备距离很近且无障碍物。
- 应用:RSSI 直接反映了链路预算和通信距离。在实际部署中,通过监测 RSSI 的变化,可以判断信号是否被遮挡、天线连接是否松动或设备是否超出了有效通信范围。
- SNR (Signal - to - Noise Ratio, 信噪比):
- 定义:SNR 衡量的是目标信号强度与背景噪声强度的比值,单位为 dB。正值表示信号强度高于噪声,值越大表示信号越清晰,抗干扰能力越强。例如,12.50 dB 的 SNR 表示信号质量非常高。
- LoRa 的特点:LoRa 调制技术的一个优势是它能够在负信噪比(即信号强度低于噪声)的情况下成功解调数据。这是 LoRa 能够实现远距离通信的关键原因之一。示例中出现的高 SNR 值表明测试环境的电磁干扰非常小。
- 应用:在实际环境中,如果 RSSI 值正常但 SNR 值很低或波动很大,通常意味着存在来自其他无线设备(如 Wi - Fi 路由器、蓝牙设备等)的射频干扰。通过分析 SNR,可以帮助工程师选择更干净的信道或采取屏蔽措施。
当项目从原型验证阶段进入定制化产品设计阶段时,工程师需要将 LoRa1120 模块集成到自定义的 PCB 上。以下是一些关键的数据和参考:
- 模块引脚定义:参考 LoRa1120 模块的引脚布局图和对应的表格,确保正确连接引脚。
- 机械尺寸与 PCB 布局:为了在 EDA 软件(如 Altium Designer, KiCad)中创建的 PCB 封装(footprint),必须参考模块的机械尺寸图,确保模块能够正确地焊接到 PCB 上。
- 参考电路与功耗分析:设计原理图时,可以参考提供的典型应用电路。特别注意电源引脚旁的去耦电容配置和天线端口的匹配网络设计,这对于实现射频性能和通过法规至关重要。进行电源预算分析时,关键参考数据如下:
| 参数 | 测试条件 | 典型值 | 单位 |
| ---- | ---- | ---- | ---- |
| 工作电压范围 | - | 1.8 - 3.6 | V |
| 发射电流 | @Sub - GHz, 21dBm | <110 | mA |
| 接收电流 | @Sub - GHz | <6 | mA |
| 睡眠电流 | @3.3V | <1 | μA |
关键词:LoRa 通信