You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32 TTGO LoRa模块endPacket()发送消息时挂起问题排查

ESP32 TTGO T-Display SX1276 LoRa模块endPacket()无限挂起问题排查与解决

问题概述

使用搭载SX1276 LoRa模块的ESP32 TTGO T-Display开发板时,调用LoRa.endPacket()函数出现无限挂起,代码初始化正常但发送首个数据包后串口无输出。

硬件环境

  • TTGO T-Display ESP32(集成SX1276 LoRa模块)
  • Arduino IDE 2.x
  • LoRa库版本:0.8.0

最小复现代码

#include <SPI.h>
#include <LoRa.h>

#define LORA_SCK     5
#define LORA_MISO    19
#define LORA_MOSI    27
#define LORA_CS      18
#define LORA_RST     23
#define LORA_IRQ     26
#define LORA_FREQ    868E6

void setup() {
    Serial.begin(115200);
    SPI.begin(LORA_SCK, LORA_MISO, LORA_MOSI, LORA_CS);
    LoRa.setPins(LORA_CS, LORA_RST, LORA_IRQ);

    if (!LoRa.begin(LORA_FREQ)) {
        Serial.println("LoRa failed!");
        while (1);
    }
    
    LoRa.setTxPower(14);
    LoRa.setSpreadingFactor(7);
    LoRa.setSignalBandwidth(125E3);
}

void loop() {
    if (!LoRa.beginPacket()) {
        Serial.println("Begin failed");
        return;
    }
    
    LoRa.print("TEST");
    bool success = LoRa.endPacket(); // <-- 此处挂起
    
    Serial.println(success ? "OK" : "FAIL");
    delay(1000);
}

已尝试操作

  • 为endPacket()添加超时逻辑
  • 将发射功率从20降至14
  • 设置最小扩频因子(7)
  • 验证引脚物理连接
  • 切换阻塞/非阻塞模式

核心原因分析

  1. IRQ引脚映射错误:部分TTGO T-Display的LoRa模块DIO0(发送完成中断引脚)实际连接ESP32引脚2而非定义的26,库无法检测到中断信号,导致无限等待。
  2. SPI初始化冲突:SPI.begin()传入SS引脚参数,与LoRa.setPins()指定的CS引脚产生控制冲突,影响LoRa模块状态读取。
  3. 旧版本库bug:LoRa库0.8.0版本对ESP32平台的SX1276中断处理存在兼容性问题,无法正确触发发送完成事件。
  4. 硬件中断引脚虚焊:DIO0引脚与ESP32对应引脚连接不良,中断信号无法传输。

解决方法

1. 修正IRQ引脚定义

检查硬件手册或用万用表确认DIO0连接引脚,若为引脚2则修改定义:

#define LORA_IRQ     2

同时初始化时启用上拉输入:

// LoRa.begin()后添加
pinMode(LORA_IRQ, INPUT_PULLUP);

2. 调整SPI初始化方式

ESP32的SPI初始化无需指定SS引脚,避免冲突:

// 替换原SPI.begin调用
SPI.begin(LORA_SCK, LORA_MISO, LORA_MOSI);

3. 升级LoRa库

将LoRa库升级至1.0.6及以上版本,新版本修复了ESP32平台的中断处理bug,优化了SX1276兼容性。

4. 手动添加超时机制

若无法升级库,可自定义带超时的发送完成检测:

bool endPacketWithTimeout(unsigned long timeoutMs = 1000) {
    LoRa.endPacket(false); // 启用非阻塞模式
    unsigned long start = millis();
    
    // 等待发送开始
    while (!LoRa.isTransmitting()) {
        if (millis() - start > timeoutMs) return false;
    }
    // 等待发送结束
    while (LoRa.isTransmitting()) {
        if (millis() - start > timeoutMs) return false;
    }
    return true;
}

// loop()中替换原endPacket调用
bool success = endPacketWithTimeout();

5. 检查硬件连接

用万用表测量LoRa模块DIO0引脚与ESP32对应引脚的通断,若存在虚焊则重新焊接。


验证方法

修改配置后重新上传代码,若串口监视器周期性输出"OK",则说明问题解决。

内容的提问来源于stack exchange,提问作者Dark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 03:26:05