[SX126x] Added support for AFSK transmission

pull/684/head
jgromes 2023-02-11 14:11:44 +01:00
rodzic 526adc7431
commit dc050df8d9
2 zmienionych plików z 62 dodań i 0 usunięć

Wyświetl plik

@ -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);

Wyświetl plik

@ -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();