Fix SPI semaphore lockup issue on ESP32
This commit is contained in:
parent
a4fe2baf78
commit
721cee3603
17
Boards.h
17
Boards.h
@ -726,17 +726,6 @@
|
||||
};
|
||||
#endif
|
||||
|
||||
#define INTERFACE_SPI
|
||||
// Required because on RAK4631, non-default SPI pins must be initialised when class is declared.
|
||||
const SPIClass interface_spi[1] = {
|
||||
// SX1262
|
||||
SPIClass(
|
||||
NRF_SPIM2,
|
||||
interface_pins[0][3],
|
||||
interface_pins[0][1],
|
||||
interface_pins[0][2]
|
||||
)
|
||||
};
|
||||
|
||||
const int pin_disp_cs = SS;
|
||||
const int pin_disp_dc = WB_IO1;
|
||||
@ -752,10 +741,4 @@
|
||||
#endif
|
||||
|
||||
#endif
|
||||
#ifndef INTERFACE_SPI
|
||||
// INTERFACE_SPI is only required on NRF52 platforms, as the SPI pins are set in the class constructor and not by a setter method.
|
||||
// Even if custom SPI interfaces are not needed, the array must exist to prevent compilation errors.
|
||||
#define INTERFACE_SPI
|
||||
const SPIClass interface_spi[1];
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@ -17,10 +17,25 @@
|
||||
#include <SPI.h>
|
||||
#include "Utilities.h"
|
||||
|
||||
#if BOARD_MODEL == BOARD_HELTEC32_V3
|
||||
// Default stack size for loop function on Heltec32 V3 is not large enough,
|
||||
// must be increased to 11kb to prevent crashes.
|
||||
SET_LOOP_TASK_STACK_SIZE(11 * 1024); // 11KB
|
||||
#if MCU_VARIANT == MCU_NRF52
|
||||
#define INTERFACE_SPI
|
||||
// Required because on RAK4631, non-default SPI pins must be initialised when class is declared.
|
||||
SPIClass interface_spi[1] = {
|
||||
// SX1262
|
||||
SPIClass(
|
||||
NRF_SPIM2,
|
||||
interface_pins[0][3],
|
||||
interface_pins[0][1],
|
||||
interface_pins[0][2]
|
||||
)
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifndef INTERFACE_SPI
|
||||
// INTERFACE_SPI is only required on NRF52 platforms, as the SPI pins are set in the class constructor and not by a setter method.
|
||||
// Even if custom SPI interfaces are not needed, the array must exist to prevent compilation errors.
|
||||
#define INTERFACE_SPI
|
||||
SPIClass interface_spi[1];
|
||||
#endif
|
||||
|
||||
FIFOBuffer serialFIFO;
|
||||
@ -134,13 +149,13 @@ void setup() {
|
||||
sx126x* obj;
|
||||
// if default spi enabled
|
||||
if (interface_cfg[i][0]) {
|
||||
obj = new sx126x(i, SPI, interface_cfg[i][1],
|
||||
obj = new sx126x(i, &SPI, interface_cfg[i][1],
|
||||
interface_cfg[i][2], interface_pins[i][0], interface_pins[i][1],
|
||||
interface_pins[i][2], interface_pins[i][3], interface_pins[i][6],
|
||||
interface_pins[i][5], interface_pins[i][4], interface_pins[i][8]);
|
||||
}
|
||||
else {
|
||||
obj = new sx126x(i, interface_spi[i], interface_cfg[i][1],
|
||||
obj = new sx126x(i, &interface_spi[i], interface_cfg[i][1],
|
||||
interface_cfg[i][2], interface_pins[i][0], interface_pins[i][1],
|
||||
interface_pins[i][2], interface_pins[i][3], interface_pins[i][6],
|
||||
interface_pins[i][5], interface_pins[i][4], interface_pins[i][8]);
|
||||
@ -157,12 +172,12 @@ void setup() {
|
||||
sx127x* obj;
|
||||
// if default spi enabled
|
||||
if (interface_cfg[i][0]) {
|
||||
obj = new sx127x(i, SPI, interface_pins[i][0],
|
||||
obj = new sx127x(i, &SPI, interface_pins[i][0],
|
||||
interface_pins[i][1], interface_pins[i][2], interface_pins[i][3],
|
||||
interface_pins[i][6], interface_pins[i][5], interface_pins[i][4]);
|
||||
}
|
||||
else {
|
||||
obj = new sx127x(i, interface_spi[i], interface_pins[i][0],
|
||||
obj = new sx127x(i, &interface_spi[i], interface_pins[i][0],
|
||||
interface_pins[i][1], interface_pins[i][2], interface_pins[i][3],
|
||||
interface_pins[i][6], interface_pins[i][5], interface_pins[i][4]);
|
||||
}
|
||||
@ -177,13 +192,13 @@ void setup() {
|
||||
sx128x* obj;
|
||||
// if default spi enabled
|
||||
if (interface_cfg[i][0]) {
|
||||
obj = new sx128x(i, SPI, interface_cfg[i][1],
|
||||
obj = new sx128x(i, &SPI, interface_cfg[i][1],
|
||||
interface_pins[i][0], interface_pins[i][1], interface_pins[i][2],
|
||||
interface_pins[i][3], interface_pins[i][6], interface_pins[i][5],
|
||||
interface_pins[i][4], interface_pins[i][8], interface_pins[i][7]);
|
||||
}
|
||||
else {
|
||||
obj = new sx128x(i, interface_spi[i], interface_cfg[i][1],
|
||||
obj = new sx128x(i, &interface_spi[i], interface_cfg[i][1],
|
||||
interface_pins[i][0], interface_pins[i][1], interface_pins[i][2],
|
||||
interface_pins[i][3], interface_pins[i][6], interface_pins[i][5],
|
||||
interface_pins[i][4], interface_pins[i][8], interface_pins[i][7]);
|
||||
|
||||
160
Radio.cpp
160
Radio.cpp
@ -4,7 +4,7 @@
|
||||
// Modifications and additions copyright 2024 by Mark Qvist & Jacob Eva
|
||||
// Obviously still under the MIT license.
|
||||
|
||||
#include "Radio.h"
|
||||
#include "Radio.hpp"
|
||||
|
||||
#if PLATFORM == PLATFORM_ESP32
|
||||
#if defined(ESP32) and !defined(CONFIG_IDF_TARGET_ESP32S3)
|
||||
@ -106,7 +106,7 @@ void ISR_VECT onDio0Rise() {
|
||||
}
|
||||
}
|
||||
|
||||
sx126x::sx126x(uint8_t index, SPIClass spi, bool tcxo, bool dio2_as_rf_switch, int ss, int sclk, int mosi, int miso, int reset, int dio0, int busy, int rxen) :
|
||||
sx126x::sx126x(uint8_t index, SPIClass* spi, bool tcxo, bool dio2_as_rf_switch, int ss, int sclk, int mosi, int miso, int reset, int dio0, int busy, int rxen) :
|
||||
RadioInterface(index),
|
||||
_spiSettings(8E6, MSBFIRST, SPI_MODE0), _spiModem(spi), _ss(ss),
|
||||
_sclk(sclk), _mosi(mosi), _miso(miso), _reset(reset), _dio0(dio0),
|
||||
@ -130,12 +130,12 @@ bool sx126x::preInit() {
|
||||
// todo: check if this change causes issues on any platforms
|
||||
#if MCU_VARIANT == MCU_ESP32
|
||||
if (_sclk != -1 && _miso != -1 && _mosi != -1 && _ss != -1) {
|
||||
_spiModem.begin(_sclk, _miso, _mosi, _ss);
|
||||
_spiModem->begin(_sclk, _miso, _mosi, _ss);
|
||||
} else {
|
||||
_spiModem.begin();
|
||||
_spiModem->begin();
|
||||
}
|
||||
#else
|
||||
_spiModem.begin();
|
||||
_spiModem->begin();
|
||||
#endif
|
||||
|
||||
// check version (retry for up to 2 seconds)
|
||||