[SX126x] Added FSK modulation parameters check
This commit is contained in:
parent
e445888510
commit
9d34a7aede
6 changed files with 37 additions and 7 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue