[SX126x] Added FSK modulation parameters check

This commit is contained in:
jgromes 2019-05-21 11:19:16 +02:00
parent e445888510
commit 9d34a7aede
6 changed files with 37 additions and 7 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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