diff --git a/examples/SX126x/SX126x_FSK_Modem/SX126x_FSK_Modem.ino b/examples/SX126x/SX126x_FSK_Modem/SX126x_FSK_Modem.ino index 65373380..f961f5a6 100644 --- a/examples/SX126x/SX126x_FSK_Modem/SX126x_FSK_Modem.ino +++ b/examples/SX126x/SX126x_FSK_Modem/SX126x_FSK_Modem.ino @@ -24,7 +24,7 @@ void setup() { // carrier frequency: 434.0 MHz // bit rate: 48.0 kbps // frequency deviation: 50.0 kHz - // Rx bandwidth: 117.3 kHz + // Rx bandwidth: 156.2 kHz // output power: 14 dBm // current limit: 60.0 mA // preamble length: 16 bits diff --git a/keywords.txt b/keywords.txt index 7f96ac03..aa731e66 100644 --- a/keywords.txt +++ b/keywords.txt @@ -222,3 +222,7 @@ ERR_INVALID_NUM_BROAD_ADDRS LITERAL1 ERR_INVALID_CRC_CONFIGURATION LITERAL1 LORA_DETECTED LITERAL1 ERR_INVALID_TCXO_VOLTAGE LITERAL1 +ERR_INVALID_MODULATION_PARAMETERS LITERAL1 +ERR_SPI_CMD_TIMEOUT LITERAL1 +ERR_SPI_CMD_INVALID LITERAL1 +ERR_SPI_CMD_FAILED LITERAL1 diff --git a/src/TypeDef.h b/src/TypeDef.h index 8fadb264..9362018f 100644 --- a/src/TypeDef.h +++ b/src/TypeDef.h @@ -112,5 +112,9 @@ #define ERR_INVALID_CRC_CONFIGURATION -701 #define LORA_DETECTED -702 #define ERR_INVALID_TCXO_VOLTAGE -703 +#define ERR_INVALID_MODULATION_PARAMETERS -704 +#define ERR_SPI_CMD_TIMEOUT -705 +#define ERR_SPI_CMD_INVALID -706 +#define ERR_SPI_CMD_FAILED -707 #endif diff --git a/src/modules/SX1262.h b/src/modules/SX1262.h index a80f92d1..ee668095 100644 --- a/src/modules/SX1262.h +++ b/src/modules/SX1262.h @@ -16,7 +16,7 @@ class SX1262: public SX126x { // basic methods int16_t begin(float freq = 434.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint16_t syncWord = SX126X_SYNC_WORD_PRIVATE, int8_t power = 14, float currentLimit = 60.0, uint16_t preambleLength = 8); - int16_t beginFSK(float freq = 434.0, float br = 48.0, float freqDev = 50.0, float rxBw = 117.3, int8_t power = 14, float currentLimit = 60.0, uint16_t preambleLength = 16, float dataShaping = 0.5); + int16_t beginFSK(float freq = 434.0, float br = 48.0, float freqDev = 50.0, float rxBw = 156.2, int8_t power = 14, float currentLimit = 60.0, uint16_t preambleLength = 16, float dataShaping = 0.5); // configuration methods int16_t setFrequency(float freq); diff --git a/src/modules/SX126x.cpp b/src/modules/SX126x.cpp index 4fe2c359..2d8bf23e 100644 --- a/src/modules/SX126x.cpp +++ b/src/modules/SX126x.cpp @@ -67,7 +67,8 @@ int16_t SX126x::beginFSK(float br, float freqDev, float rxBw, uint16_t preambleL // initialize configuration variables (will be overwritten during public settings configuration) _br = 21333; // 48.0 kbps _freqDev = 52428; // 50.0 kHz - _rxBw = SX126X_GFSK_RX_BW_117_3; + _rxBw = SX126X_GFSK_RX_BW_156_2; + _rxBwKhz = 156.2; _pulseShape = SX126X_GFSK_FILTER_GAUSS_0_5; _crcTypeFSK = SX126X_GFSK_CRC_2_BYTE_INV; // CCIT CRC configuration _preambleLengthFSK = preambleLength; @@ -163,7 +164,10 @@ int16_t SX126x::transmit(uint8_t* data, size_t len, uint8_t addr) { DEBUG_PRINTLN(F(" us")); // start transmission - startTransmit(data, len, addr); + int16_t state = startTransmit(data, len, addr); + if(state != ERR_NONE) { + return(state); + } // wait for packet transmission or timeout uint32_t start = micros(); @@ -508,8 +512,13 @@ int16_t SX126x::setFrequencyDeviation(float freqDev) { } // calculate raw frequency deviation value - //_freqDev = (uint32_t)((freqDev * 1000.0) / ((SX126X_CRYSTAL_FREQ * 1000000.0) / (float)((uint32_t)(1) << 25))); - _freqDev = (uint32_t)(((freqDev * 1000.0) * (float)((uint32_t)(1) << 25)) / (SX126X_CRYSTAL_FREQ * 1000000.0)); + uint32_t freqDevRaw = (uint32_t)(((freqDev * 1000.0) * (float)((uint32_t)(1) << 25)) / (SX126X_CRYSTAL_FREQ * 1000000.0)); + + // check modulation parameters + if(2 * freqDevRaw + _br > _rxBwKhz * 1000.0) { + return(ERR_INVALID_MODULATION_PARAMETERS); + } + _freqDev = freqDevRaw; // update modulation parameters setModulationParamsFSK(_br, _pulseShape, _rxBw, _freqDev); @@ -529,7 +538,13 @@ int16_t SX126x::setBitRate(float br) { } // calculate raw bit rate value - _br = (uint32_t)((SX126X_CRYSTAL_FREQ * 1000000.0 * 32.0) / (br * 1000.0)); + uint32_t brRaw = (uint32_t)((SX126X_CRYSTAL_FREQ * 1000000.0 * 32.0) / (br * 1000.0)); + + // check modulation parameters + if(2 * _freqDev + brRaw > _rxBwKhz * 1000.0) { + return(ERR_INVALID_MODULATION_PARAMETERS); + } + _br = brRaw; // update modulation parameters setModulationParamsFSK(_br, _pulseShape, _rxBw, _freqDev); @@ -543,6 +558,12 @@ int16_t SX126x::setRxBandwidth(float rxBw) { return(ERR_WRONG_MODEM); } + // check modulation parameters + if(2 * _freqDev + _br > rxBw * 1000.0) { + return(ERR_INVALID_MODULATION_PARAMETERS); + } + _rxBwKhz = rxBw; + // check alowed receiver bandwidth values if(abs(rxBw - 4.8) <= 0.001) { _rxBw = SX126X_GFSK_RX_BW_4_8; diff --git a/src/modules/SX126x.h b/src/modules/SX126x.h index d3da4c00..c2878e31 100644 --- a/src/modules/SX126x.h +++ b/src/modules/SX126x.h @@ -401,6 +401,7 @@ class SX126x: public PhysicalLayer { uint32_t _br, _freqDev; uint8_t _rxBw, _pulseShape, _crcTypeFSK, _syncWordLength, _addrComp; uint16_t _preambleLengthFSK; + float _rxBwKhz; float _dataRate;