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

ESP32使用HSPI引脚驱动LoRa模块初始化失败求助

ESP32指定HSPI引脚后LoRa初始化失败问题排查与解决

问题描述

我正在调试一段代码,目标是用ESP32的HSPI引脚控制LoRa模块,VSPI引脚预留用于SD模块(SD模块相关代码未提供)。使用默认引脚时代码可正常运行,但配置指定引脚后LoRa模块初始化失败,串口持续输出“not init”。相关代码如下:

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

// Task dual core
TaskHandle_t DataReadertask;
TaskHandle_t DataWritertask;

//-----------Communication avec sd et LoRa--------------//
    // SD
#define VSPI_MISO 19
#define VSPI_MOSI 23
#define VSPI_SCLK 18
#define VSPI_SS 5

    // LoRa
#define HSPI_MISO 12
#define HSPI_MOSI 13
#define HSPI_SCLK 14
#define HSPI_SS 15
#define NSS_LoRa 27
#define RST_LoRa 26
#define DI0_LoRa 4

// uninitalised pointers to SPI objects
SPIClass vspi(VSPI);
SPIClass hspi(HSPI);

static const int spiClk = 1000000; // 1 MHz

void setup() {
    Serial.begin(9600);
//--------------------Dual Core------------------------------------//
    xTaskCreatePinnedToCore(DataReader, "DataReadertask", 20000, NULL, 1, &DataReadertask, 0);
    xTaskCreatePinnedToCore(DataWriter, "DataWritertask", 20000, NULL, 1, &DataWritertask, 1);

    //-----------------------SPI--------------------------------------//
    vspi.begin(VSPI_SCLK, VSPI_MISO, VSPI_MOSI, VSPI_SS);

    hspi.begin(HSPI_SCLK, HSPI_MISO, HSPI_MOSI, HSPI_SS); // SCLK, MISO, MOSI, SS

    pinMode(VSPI_SS, OUTPUT);
    pinMode(HSPI_SS, OUTPUT);

    // LoRa
    // setup LoRa sender
    LoRa.setPins(NSS_LoRa, RST_LoRa, DI0_LoRa);

    // 866E6 for Europe
    while (!LoRa.begin(433E6)) {
        Serial.println("not init");
        delay(500);
    }

    // Lora code, max 0-0xFF
    LoRa.setSyncWord(0x25);
    Serial.println("LoRa Initializing Successful!");
}

void loop() {}

//-------------------------Dévelopement des taches--------------------------------//
    // Coeur 0
void DataReader(void *pvParameters) {
    for (;;) {
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}

    // Coeur 1
void DataWriter(void *pvParameters) {
    for (;;) {
        launchPaquet("test", 0.1);
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}

//-------------------------------------------------------------------------------

//-------------------------------LoRa----------------------------//
void launchPaquet(char type[],float data) {
    LoRa.beginPacket();
    LoRa.print("El:");
    // LoRa.print(String(type));
    LoRa.print(":");
    LoRa.println(String(data));
    LoRa.endPacket();
}

//------------------------SPI-------------------------------------//
void spiCommand(SPIClass *spi, byte data) {
    spi->beginTransaction(SPISettings(spiClk, MSBFIRST, SPI_MODE0));
    digitalWrite(VSPI_SS, LOW); // Utilisez VSPI_SS ou HSPI_SS selon le cas
    spi->transfer(data);
    digitalWrite(VSPI_SS, HIGH); // Même chose ici
    spi->endTransaction();
}

解决方法

  • 核心问题:LoRa库默认使用VSPI总线,你虽然创建了HSPI的SPIClass对象,但没有告诉LoRa库要使用这个总线,导致通信引脚不匹配,初始化失败。

  • 具体修复步骤

    1. 指定LoRa使用HSPI总线
      在调用LoRa.begin()之前,添加LoRa.setSPI(hspi);,告诉LoRa库使用我们定义的HSPI总线对象。这行代码要放在LoRa.setPins()之后,LoRa.begin()之前。

    2. 处理SPI片选引脚
      你定义的HSPI_SS(15)是HSPI总线的默认片选,但LoRa模块的片选已经通过LoRa.setPins(NSS_LoRa, ...)设置为27,所以需要确保HSPI_SS引脚处于高电平状态,避免干扰LoRa通信,在setup里添加digitalWrite(HSPI_SS, HIGH);。

    3. 修正spiCommand函数的片选逻辑
      原函数里固定使用VSPI_SS,后续如果操作HSPI设备会出错,改成传入SS引脚参数:

      void spiCommand(SPIClass *spi, byte data, int ssPin) {
          spi->beginTransaction(SPISettings(spiClk, MSBFIRST, SPI_MODE0));
          digitalWrite(ssPin, LOW);
          spi->transfer(data);
          digitalWrite(ssPin, HIGH);
          spi->endTransaction();
      }
      

修改后的setup函数示例

void setup() {
    Serial.begin(9600);
    xTaskCreatePinnedToCore(DataReader, "DataReadertask", 20000, NULL, 1, &DataReadertask, 0);
    xTaskCreatePinnedToCore(DataWriter, "DataWritertask", 20000, NULL, 1, &DataWritertask, 1);

    // 初始化SPI总线
    vspi.begin(VSPI_SCLK, VSPI_MISO, VSPI_MOSI, VSPI_SS);
    hspi.begin(HSPI_SCLK, HSPI_MISO, HSPI_MOSI, HSPI_SS); 

    pinMode(VSPI_SS, OUTPUT);
    pinMode(HSPI_SS, OUTPUT);
    // 确保未使用的SS引脚处于高电平,避免干扰
    digitalWrite(HSPI_SS, HIGH);
    digitalWrite(VSPI_SS, HIGH);

    // LoRa配置
    LoRa.setPins(NSS_LoRa, RST_LoRa, DI0_LoRa);
    LoRa.setSPI(hspi); // 指定使用HSPI总线
    while (!LoRa.begin(433E6)) {
        Serial.println("not init");
        delay(500);
    }
    LoRa.setSyncWord(0x25);
    Serial.println("LoRa Initializing Successful!");
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 10:54:54