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库要使用这个总线,导致通信引脚不匹配,初始化失败。
具体修复步骤
指定LoRa使用HSPI总线
在调用LoRa.begin()之前,添加LoRa.setSPI(hspi);,告诉LoRa库使用我们定义的HSPI总线对象。这行代码要放在LoRa.setPins()之后,LoRa.begin()之前。处理SPI片选引脚
你定义的HSPI_SS(15)是HSPI总线的默认片选,但LoRa模块的片选已经通过LoRa.setPins(NSS_LoRa, ...)设置为27,所以需要确保HSPI_SS引脚处于高电平状态,避免干扰LoRa通信,在setup里添加digitalWrite(HSPI_SS, HIGH);。修正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
相关产品推荐
相关产品推荐

