From b5f273b187afa3e04a5ccb56d67962cc0eb99cdf Mon Sep 17 00:00:00 2001 From: jgromes Date: Fri, 8 Nov 2019 09:29:00 +0100 Subject: [PATCH 1/3] [SX126x] Moved debug output out of SPI transaction --- src/modules/SX126x.cpp | 92 +++++++++++++++++++++++++++++------------- 1 file changed, 63 insertions(+), 29 deletions(-) diff --git a/src/modules/SX126x.cpp b/src/modules/SX126x.cpp index f8464415..e47ad31c 100644 --- a/src/modules/SX126x.cpp +++ b/src/modules/SX126x.cpp @@ -1280,7 +1280,12 @@ int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* d SPIClass* spi = _mod->getSpi(); SPISettings spiSettings = _mod->getSpiSettings(); + #ifdef RADIOLIB_VERBOSE + uint8_t debugBuff[256]; + #endif + // ensure BUSY is low (state meachine ready) + RADIOLIB_VERBOSE_PRINTLN(F("Wait for BUSY ... ")); uint32_t start = millis(); while(digitalRead(_mod->getRx())) { if(millis() - start >= timeout) { @@ -1293,66 +1298,54 @@ int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* d spi->beginTransaction(spiSettings); // send command byte(s) - RADIOLIB_VERBOSE_PRINT("CMD\t"); for(uint8_t n = 0; n < cmdLen; n++) { spi->transfer(cmd[n]); - RADIOLIB_VERBOSE_PRINT(cmd[n], HEX); - RADIOLIB_VERBOSE_PRINT('\t'); } - RADIOLIB_VERBOSE_PRINTLN(); // variable to save error during SPI transfer uint8_t status = 0; // send/receive all bytes - RADIOLIB_VERBOSE_PRINT("DAT"); if(write) { - RADIOLIB_VERBOSE_PRINT("W\t"); for(uint8_t n = 0; n < numBytes; n++) { // send byte uint8_t in = spi->transfer(dataOut[n]); - RADIOLIB_VERBOSE_PRINT(dataOut[n], HEX); - RADIOLIB_VERBOSE_PRINT('\t'); - RADIOLIB_VERBOSE_PRINT(in, HEX); - RADIOLIB_VERBOSE_PRINT('\t'); + #ifdef RADIOLIB_VERBOSE + debugBuff[n] = in; + #endif - // check status - SX126X_STATUS_CMD_TIMEOUT is disabled due to regular timeouts - if(//((in & 0b00001110) == SX126X_STATUS_CMD_TIMEOUT) || + // check status + if(((in & 0b00001110) == SX126X_STATUS_CMD_TIMEOUT) || ((in & 0b00001110) == SX126X_STATUS_CMD_INVALID) || ((in & 0b00001110) == SX126X_STATUS_CMD_FAILED)) { status = in & 0b00001110; + break; } else if(in == 0x00 || in == 0xFF) { status = SX126X_STATUS_SPI_FAILED; + break; } } - RADIOLIB_VERBOSE_PRINTLN(); + } else { - RADIOLIB_VERBOSE_PRINT("R\t"); // skip the first byte for read-type commands (status-only) uint8_t in = spi->transfer(SX126X_CMD_NOP); - RADIOLIB_VERBOSE_PRINT(SX126X_CMD_NOP, HEX); - RADIOLIB_VERBOSE_PRINT('\t'); - RADIOLIB_VERBOSE_PRINT(in, HEX); - RADIOLIB_VERBOSE_PRINT('\t') + #ifdef RADIOLIB_VERBOSE + debugBuff[0] = in; + #endif // check status - if(//((in & 0b00001110) == SX126X_STATUS_CMD_TIMEOUT) || + if(((in & 0b00001110) == SX126X_STATUS_CMD_TIMEOUT) || ((in & 0b00001110) == SX126X_STATUS_CMD_INVALID) || ((in & 0b00001110) == SX126X_STATUS_CMD_FAILED)) { status = in & 0b00001110; } else if(in == 0x00 || in == 0xFF) { status = SX126X_STATUS_SPI_FAILED; + } else { + for(uint8_t n = 0; n < numBytes; n++) { + dataIn[n] = spi->transfer(SX126X_CMD_NOP); + } } - for(uint8_t n = 0; n < numBytes; n++) { - dataIn[n] = spi->transfer(SX126X_CMD_NOP); - RADIOLIB_VERBOSE_PRINT(SX126X_CMD_NOP, HEX); - RADIOLIB_VERBOSE_PRINT('\t'); - RADIOLIB_VERBOSE_PRINT(dataIn[n], HEX); - RADIOLIB_VERBOSE_PRINT('\t'); - } - RADIOLIB_VERBOSE_PRINTLN(); } - RADIOLIB_VERBOSE_PRINTLN(); // stop transfer spi->endTransaction(); @@ -1364,11 +1357,52 @@ int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* d start = millis(); while(digitalRead(_mod->getRx())) { if(millis() - start >= timeout) { - return(ERR_SPI_CMD_TIMEOUT); + status = SX126X_STATUS_CMD_TIMEOUT; + break; } } } + // print debug output + #ifdef RADIOLIB_VERBOSE + // print command byte(s) + RADIOLIB_VERBOSE_PRINT("CMD\t"); + for(uint8_t n = 0; n < cmdLen; n++) { + RADIOLIB_VERBOSE_PRINT(cmd[n], HEX); + RADIOLIB_VERBOSE_PRINT('\t'); + } + RADIOLIB_VERBOSE_PRINTLN(); + + // print data bytes + RADIOLIB_VERBOSE_PRINT("DAT"); + if(write) { + RADIOLIB_VERBOSE_PRINT("W\t"); + for(uint8_t n = 0; n < numBytes; n++) { + RADIOLIB_VERBOSE_PRINT(dataOut[n], HEX); + RADIOLIB_VERBOSE_PRINT('\t'); + RADIOLIB_VERBOSE_PRINT(debugBuff[n], HEX); + RADIOLIB_VERBOSE_PRINT('\t'); + } + RADIOLIB_VERBOSE_PRINTLN(); + } else { + RADIOLIB_VERBOSE_PRINT("R\t"); + // skip the first byte for read-type commands (status-only) + RADIOLIB_VERBOSE_PRINT(SX126X_CMD_NOP, HEX); + RADIOLIB_VERBOSE_PRINT('\t'); + RADIOLIB_VERBOSE_PRINT(debugBuff[0], HEX); + RADIOLIB_VERBOSE_PRINT('\t') + + for(uint8_t n = 0; n < numBytes; n++) { + RADIOLIB_VERBOSE_PRINT(SX126X_CMD_NOP, HEX); + RADIOLIB_VERBOSE_PRINT('\t'); + RADIOLIB_VERBOSE_PRINT(dataIn[n], HEX); + RADIOLIB_VERBOSE_PRINT('\t'); + } + RADIOLIB_VERBOSE_PRINTLN(); + } + RADIOLIB_VERBOSE_PRINTLN(); + #endif + // parse status switch(status) { case SX126X_STATUS_CMD_TIMEOUT: From 1f26d3d5a3848b3dea77bae4f4740bc7bc64c46f Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 12 Nov 2019 17:24:49 +0100 Subject: [PATCH 2/3] Fixed SoftwareSerial for ESP8266 core 2.6.0 --- src/ISerial.cpp | 4 ++++ src/Module.cpp | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/src/ISerial.cpp b/src/ISerial.cpp index bc280e68..4bc72a9d 100644 --- a/src/ISerial.cpp +++ b/src/ISerial.cpp @@ -5,7 +5,11 @@ ISerial::ISerial(Module* mod) { } void ISerial::begin(long speed) { +#if defined(ESP8266) + _mod->ModuleSerial->begin(speed, _mod->getRx(), _mod->getTx(), SWSERIAL_8N1); +#else _mod->ModuleSerial->begin(speed); +#endif } bool ISerial::listen() { diff --git a/src/Module.cpp b/src/Module.cpp index 1c994eff..b706c56e 100644 --- a/src/Module.cpp +++ b/src/Module.cpp @@ -9,6 +9,9 @@ Module::Module(int rx, int tx, HardwareSerial* useSer) { #ifdef SOFTWARE_SERIAL_UNSUPPORTED ModuleSerial = useSer; +#elif defined(ESP8266) + ModuleSerial = new SoftwareSerial(); + (void)useSer; #else ModuleSerial = new SoftwareSerial(_rx, _tx); (void)useSer; @@ -36,6 +39,9 @@ Module::Module(int cs, int int0, int int1, int rx, int tx, SPIClass& spi, SPISet #ifdef SOFTWARE_SERIAL_UNSUPPORTED ModuleSerial = useSer; +#elif defined(ESP8266) + ModuleSerial = new SoftwareSerial(); + (void)useSer; #else ModuleSerial = new SoftwareSerial(_rx, _tx); (void)useSer; @@ -63,6 +69,8 @@ void Module::init(uint8_t interface, uint8_t gpio) { case USE_UART: #if defined(ESP32) ModuleSerial->begin(baudrate, SERIAL_8N1, _rx, _tx); +#elif defined(ESP8266) + ModuleSerial->begin(baudrate, _rx, _tx, SWSERIAL_8N1); #else ModuleSerial->begin(baudrate); #endif From 50f400eb109f124573fda4112df2e3963b46b876 Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 12 Nov 2019 17:26:15 +0100 Subject: [PATCH 3/3] Fixed keyword separator --- keywords.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keywords.txt b/keywords.txt index 2ffc5a94..dcec71c7 100644 --- a/keywords.txt +++ b/keywords.txt @@ -88,8 +88,8 @@ setDataShaping KEYWORD2 setOOK KEYWORD2 setDataShapingOOK KEYWORD2 setCRC KEYWORD2 -variablePacketLengthMode KEYWORD2 -fixedPacketLengthMode KEYWORD2 +variablePacketLengthMode KEYWORD2 +fixedPacketLengthMode KEYWORD2 # RF69-specific setAESKey KEYWORD2