diff --git a/src/Module.cpp b/src/Module.cpp index 372ef419..48f03211 100644 --- a/src/Module.cpp +++ b/src/Module.cpp @@ -206,7 +206,7 @@ int16_t Module::SPIgetRegValue(uint8_t reg, uint8_t msb, uint8_t lsb) { return(maskedValue); } -int16_t Module::SPIsetRegValue(uint8_t reg, uint8_t value, uint8_t msb, uint8_t lsb, uint8_t checkInterval) { +int16_t Module::SPIsetRegValue(uint8_t reg, uint8_t value, uint8_t msb, uint8_t lsb, uint8_t checkInterval, uint8_t checkMask) { if((msb > 7) || (lsb > 7) || (lsb > msb)) { return(ERR_INVALID_BIT_RANGE); } @@ -223,7 +223,7 @@ int16_t Module::SPIsetRegValue(uint8_t reg, uint8_t value, uint8_t msb, uint8_t uint8_t readValue = 0x00; while(Module::micros() - start < (checkInterval * 1000)) { readValue = SPIreadRegister(reg); - if(readValue == newValue) { + if((readValue & checkMask) == (newValue & checkMask)) { // check passed, we can stop the loop return(ERR_NONE); } diff --git a/src/Module.h b/src/Module.h index 685a2eb5..d81c4213 100644 --- a/src/Module.h +++ b/src/Module.h @@ -238,9 +238,11 @@ class Module { \param checkInterval Number of milliseconds between register writing and verification reading. Some registers need up to 10ms to process the change. + \param checkMask Mask of bits to check, only bits set to 1 will be verified. + \returns \ref status_codes */ - int16_t SPIsetRegValue(uint8_t reg, uint8_t value, uint8_t msb = 7, uint8_t lsb = 0, uint8_t checkInterval = 2); + int16_t SPIsetRegValue(uint8_t reg, uint8_t value, uint8_t msb = 7, uint8_t lsb = 0, uint8_t checkInterval = 2, uint8_t checkMask = 0xFF); /*! \brief SPI burst read method. diff --git a/src/modules/SX127x/SX127x.cpp b/src/modules/SX127x/SX127x.cpp index b4461d6b..2f6e3e87 100644 --- a/src/modules/SX127x/SX127x.cpp +++ b/src/modules/SX127x/SX127x.cpp @@ -1235,7 +1235,12 @@ bool SX127x::findChip(uint8_t ver) { } int16_t SX127x::setMode(uint8_t mode) { - return(_mod->SPIsetRegValue(SX127X_REG_OP_MODE, mode, 2, 0, 5)); + uint8_t checkMask = 0xFF; + if((getActiveModem() == SX127X_FSK_OOK) && (mode == SX127X_RX)) { + // disable checking of RX bit in FSK RX mode, as it sometimes seem to fail (#276) + checkMask = 0xFE; + } + return(_mod->SPIsetRegValue(SX127X_REG_OP_MODE, mode, 2, 0, 5, checkMask)); } int16_t SX127x::getActiveModem() { diff --git a/src/protocols/RTTY/RTTY.cpp b/src/protocols/RTTY/RTTY.cpp index 5ee05efc..f256e54b 100644 --- a/src/protocols/RTTY/RTTY.cpp +++ b/src/protocols/RTTY/RTTY.cpp @@ -10,7 +10,7 @@ ITA2String::ITA2String(char c) { ITA2String::ITA2String(const char* str) { _len = strlen(str); - _str = new char[_len]; + _str = new char[_len + 1]; strcpy(_str, str); _ita2Len = 0; }