diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index d6fe884d..9c6e5d19 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -321,6 +321,63 @@ int16_t SX126x::receiveDirect() { return(RADIOLIB_ERR_UNKNOWN); } +int16_t SX126x::directMode() { + // check modem + if(getPacketType() != RADIOLIB_SX126X_PACKET_TYPE_GFSK) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // disable DIO2 RF switch + state = setDio2AsRfSwitch(false); + RADIOLIB_ASSERT(state); + + // set DIO2 to clock output and DIO3 to data input + // this is done exclusively by writing magic values to even more magic registers + uint8_t val = 0; + + state = readRegister(RADIOLIB_SX126X_REG_TX_BITBANG_ENABLE_1, &val, 1); + RADIOLIB_ASSERT(state); + val &= ~(0x07 << 4); + val |= (0x01 << 4); + state = writeRegister(RADIOLIB_SX126X_REG_TX_BITBANG_ENABLE_1, &val, 1); + RADIOLIB_ASSERT(state); + + state = readRegister(RADIOLIB_SX126X_REG_TX_BITBANG_ENABLE_0, &val, 1); + RADIOLIB_ASSERT(state); + val &= ~(0x0F << 0); + val |= (0x0C << 0); + state = writeRegister(RADIOLIB_SX126X_REG_TX_BITBANG_ENABLE_0, &val, 1); + RADIOLIB_ASSERT(state); + + state = readRegister(RADIOLIB_SX126X_REG_DIOX_OUT_ENABLE, &val, 1); + RADIOLIB_ASSERT(state); + val &= ~(0x01 << 3); + val |= (0x01 << 3); + state = writeRegister(RADIOLIB_SX126X_REG_DIOX_OUT_ENABLE, &val, 1); + RADIOLIB_ASSERT(state); + + state = readRegister(RADIOLIB_SX126X_REG_DIOX_IN_ENABLE, &val, 1); + RADIOLIB_ASSERT(state); + val &= ~(0x01 << 3); + val |= (0x01 << 3); + state = writeRegister(RADIOLIB_SX126X_REG_DIOX_IN_ENABLE, &val, 1); + RADIOLIB_ASSERT(state); + + // enable TxDone interrupt + state = setDioIrqParams(RADIOLIB_SX126X_IRQ_TX_DONE, RADIOLIB_SX126X_IRQ_TX_DONE); + RADIOLIB_ASSERT(state); + + // set preamble length to the maximum to prevent SX126x from exiting Tx mode for a while + state = setPreambleLength(0xFFFF); + RADIOLIB_ASSERT(state); + + return(state); +} + int16_t SX126x::scanChannel(uint8_t symbolNum, uint8_t detPeak, uint8_t detMin) { // set mode to CAD int state = startChannelScan(symbolNum, detPeak, detMin); diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index 57dcb7cb..8b8bd4fb 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -83,8 +83,11 @@ #define RADIOLIB_SX126X_REG_DIOX_IN_ENABLE 0x0583 #define RADIOLIB_SX126X_REG_DIOX_PULL_UP_CTRL 0x0584 #define RADIOLIB_SX126X_REG_DIOX_PULL_DOWN_CTRL 0x0585 +#define RADIOLIB_SX126X_REG_TX_BITBANG_ENABLE_0 0x0587 +#define RADIOLIB_SX126X_REG_TX_BITBANG_ENABLE_1 0x0680 #define RADIOLIB_SX126X_REG_WHITENING_INITIAL_MSB 0x06B8 #define RADIOLIB_SX126X_REG_WHITENING_INITIAL_LSB 0x06B9 +#define RADIOLIB_SX126X_REG_RX_TX_PLD_LEN 0x06BB #define RADIOLIB_SX126X_REG_CRC_INITIAL_MSB 0x06BC #define RADIOLIB_SX126X_REG_CRC_INITIAL_LSB 0x06BD #define RADIOLIB_SX126X_REG_CRC_POLYNOMIAL_MSB 0x06BE @@ -102,6 +105,7 @@ #define RADIOLIB_SX126X_REG_IQ_CONFIG 0x0736 #define RADIOLIB_SX126X_REG_LORA_SYNC_WORD_MSB 0x0740 #define RADIOLIB_SX126X_REG_LORA_SYNC_WORD_LSB 0x0741 +#define RADIOLIB_SX126X_REG_RX_ADDR_PTR 0x0803 #define RADIOLIB_SX126X_REG_RANDOM_NUMBER_0 0x0819 #define RADIOLIB_SX126X_REG_RANDOM_NUMBER_1 0x081A #define RADIOLIB_SX126X_REG_RANDOM_NUMBER_2 0x081B @@ -1013,6 +1017,7 @@ class SX126x: public PhysicalLayer { int16_t setFrequencyRaw(float freq); int16_t setPacketMode(uint8_t mode, uint8_t len); int16_t setHeaderType(uint8_t headerType, size_t len = 0xFF); + int16_t directMode(); // fixes to errata int16_t fixSensitivity();