From 868235788197aa81bcfafb019c3581417556d55a Mon Sep 17 00:00:00 2001 From: jgromes Date: Mon, 6 Jul 2020 11:14:33 +0200 Subject: [PATCH] [Si443x] Synced parameters of all FSK modules --- .../Si443x_Settings/Si443x_Settings.ino | 3 ++- src/modules/Si443x/Si4430.cpp | 4 ++-- src/modules/Si443x/Si4430.h | 4 +++- src/modules/Si443x/Si4431.cpp | 4 ++-- src/modules/Si443x/Si4431.h | 4 +++- src/modules/Si443x/Si4432.cpp | 4 ++-- src/modules/Si443x/Si4432.h | 4 +++- src/modules/Si443x/Si443x.cpp | 23 +++++++++++++++++-- src/modules/Si443x/Si443x.h | 13 ++++++++++- 9 files changed, 50 insertions(+), 13 deletions(-) diff --git a/examples/Si443x/Si443x_Settings/Si443x_Settings.ino b/examples/Si443x/Si443x_Settings/Si443x_Settings.ino index ee5f7e9b..cd420505 100644 --- a/examples/Si443x/Si443x_Settings/Si443x_Settings.ino +++ b/examples/Si443x/Si443x_Settings/Si443x_Settings.ino @@ -58,7 +58,8 @@ void setup() { // frequency deviation: 60.0 kHz // Rx bandwidth: 335.5 kHz // output power: 17 dBm - state = radio2.begin(868.0, 200.0, 60.0, 335.5, 17); + // preamble length: 32 bits + state = radio2.begin(868.0, 200.0, 60.0, 335.5, 17, 32); if (state == ERR_NONE) { Serial.println(F("success!")); } else { diff --git a/src/modules/Si443x/Si4430.cpp b/src/modules/Si443x/Si4430.cpp index 3f31370c..778ee9dd 100644 --- a/src/modules/Si443x/Si4430.cpp +++ b/src/modules/Si443x/Si4430.cpp @@ -5,9 +5,9 @@ Si4430::Si4430(Module* mod) : Si4432(mod) { } -int16_t Si4430::begin(float freq, float br, float freqDev, float rxBw, int8_t power) { +int16_t Si4430::begin(float freq, float br, float freqDev, float rxBw, int8_t power, uint8_t preambleLen) { // execute common part - int16_t state = Si443x::begin(br, freqDev, rxBw); + int16_t state = Si443x::begin(br, freqDev, rxBw, preambleLen); RADIOLIB_ASSERT(state); // configure publicly accessible settings diff --git a/src/modules/Si443x/Si4430.h b/src/modules/Si443x/Si4430.h index ff3b06f6..ca8a1b8f 100644 --- a/src/modules/Si443x/Si4430.h +++ b/src/modules/Si443x/Si4430.h @@ -40,9 +40,11 @@ class Si4430: public Si4432 { \param power Transmission output power in dBm. Allowed values range from -8 to 13 dBm in 3 dBm steps. + \param preambleLen Preamble Length in bits. Defaults to 16 bits. + \returns \ref status_codes */ - int16_t begin(float freq = 434.0, float br = 48.0, float freqDev = 50.0, float rxBw = 181.1, int8_t power = 10); + int16_t begin(float freq = 434.0, float br = 48.0, float freqDev = 50.0, float rxBw = 181.1, int8_t power = 10, uint8_t preambleLen = 16); // configuration methods diff --git a/src/modules/Si443x/Si4431.cpp b/src/modules/Si443x/Si4431.cpp index 54371858..88e43396 100644 --- a/src/modules/Si443x/Si4431.cpp +++ b/src/modules/Si443x/Si4431.cpp @@ -5,9 +5,9 @@ Si4431::Si4431(Module* mod) : Si4432(mod) { } -int16_t Si4431::begin(float freq, float br, float freqDev, float rxBw, int8_t power) { +int16_t Si4431::begin(float freq, float br, float freqDev, float rxBw, int8_t power, uint8_t preambleLen) { // execute common part - int16_t state = Si443x::begin(br, freqDev, rxBw); + int16_t state = Si443x::begin(br, freqDev, rxBw, preambleLen); RADIOLIB_ASSERT(state); // configure publicly accessible settings diff --git a/src/modules/Si443x/Si4431.h b/src/modules/Si443x/Si4431.h index 00167a7d..0143d41b 100644 --- a/src/modules/Si443x/Si4431.h +++ b/src/modules/Si443x/Si4431.h @@ -40,9 +40,11 @@ class Si4431: public Si4432 { \param power Transmission output power in dBm. Allowed values range from -8 to 13 dBm in 3 dBm steps. + \param preambleLen Preamble Length in bits. Defaults to 16 bits. + \returns \ref status_codes */ - int16_t begin(float freq = 434.0, float br = 48.0, float freqDev = 50.0, float rxBw = 181.1, int8_t power = 10); + int16_t begin(float freq = 434.0, float br = 48.0, float freqDev = 50.0, float rxBw = 181.1, int8_t power = 10, uint8_t preambleLen = 16); // configuration methods diff --git a/src/modules/Si443x/Si4432.cpp b/src/modules/Si443x/Si4432.cpp index 0c9dee43..8037edcf 100644 --- a/src/modules/Si443x/Si4432.cpp +++ b/src/modules/Si443x/Si4432.cpp @@ -5,9 +5,9 @@ Si4432::Si4432(Module* mod) : Si443x(mod) { } -int16_t Si4432::begin(float freq, float br, float freqDev, float rxBw, int8_t power) { +int16_t Si4432::begin(float freq, float br, float freqDev, float rxBw, int8_t power, uint8_t preambleLen) { // execute common part - int16_t state = Si443x::begin(br, freqDev, rxBw); + int16_t state = Si443x::begin(br, freqDev, rxBw, preambleLen); RADIOLIB_ASSERT(state); // configure publicly accessible settings diff --git a/src/modules/Si443x/Si4432.h b/src/modules/Si443x/Si4432.h index 7537e689..2f785634 100644 --- a/src/modules/Si443x/Si4432.h +++ b/src/modules/Si443x/Si4432.h @@ -40,9 +40,11 @@ class Si4432: public Si443x { \param power Transmission output power in dBm. Allowed values range from -1 to 20 dBm in 3 dBm steps. + \param preambleLen Preamble Length in bits. Defaults to 16 bits. + \returns \ref status_codes */ - int16_t begin(float freq = 434.0, float br = 48.0, float freqDev = 50.0, float rxBw = 181.1, int8_t power = 11); + int16_t begin(float freq = 434.0, float br = 48.0, float freqDev = 50.0, float rxBw = 181.1, int8_t power = 10, uint8_t preambleLen = 16); // configuration methods diff --git a/src/modules/Si443x/Si443x.cpp b/src/modules/Si443x/Si443x.cpp index 78c95b74..84534e09 100644 --- a/src/modules/Si443x/Si443x.cpp +++ b/src/modules/Si443x/Si443x.cpp @@ -5,7 +5,7 @@ Si443x::Si443x(Module* mod) : PhysicalLayer(SI443X_FREQUENCY_STEP_SIZE, SI443X_M _mod = mod; } -int16_t Si443x::begin(float br, float freqDev, float rxBw) { +int16_t Si443x::begin(float br, float freqDev, float rxBw, uint8_t preambleLen) { // set module properties _mod->init(RADIOLIB_USE_SPI); Module::pinMode(_mod->getIrq(), INPUT); @@ -38,7 +38,10 @@ int16_t Si443x::begin(float br, float freqDev, float rxBw) { state = setRxBandwidth(rxBw); RADIOLIB_ASSERT(state); - uint8_t syncWord[] = {0x2D, 0x01}; + state = setPreambleLength(preambleLen); + RADIOLIB_ASSERT(state); + + uint8_t syncWord[] = {0x12, 0xAD}; state = setSyncWord(syncWord, sizeof(syncWord)); RADIOLIB_ASSERT(state); @@ -477,6 +480,22 @@ int16_t Si443x::setSyncWord(uint8_t* syncWord, size_t len) { return(state); } +int16_t Si443x::setPreambleLength(uint8_t preambleLen) { + // Si443x configures preamble length in bytes + if(preambleLen % 8 != 0) { + return(ERR_INVALID_PREAMBLE_LENGTH); + } + + // set default preamble length + uint8_t preLenBytes = preambleLen / 8; + int16_t state = _mod->SPIsetRegValue(SI443X_REG_PREAMBLE_LENGTH, preLenBytes); + RADIOLIB_ASSERT(state); + + // set default preamble detection threshold to 50% of preamble length (in units of 4 bits) + uint8_t preThreshold = preambleLen / 4; + return(_mod->SPIsetRegValue(SI443X_REG_PREAMBLE_DET_CONTROL, preThreshold << 4, 3, 7)); +} + size_t Si443x::getPacketLength(bool update) { // TODO variable length mode if(!_packetLengthQueried && update) { diff --git a/src/modules/Si443x/Si443x.h b/src/modules/Si443x/Si443x.h index 6cabb7d4..b5ffeb54 100644 --- a/src/modules/Si443x/Si443x.h +++ b/src/modules/Si443x/Si443x.h @@ -579,9 +579,11 @@ class Si443x: public PhysicalLayer { \param rxBw Receiver bandwidth in kHz. + \param preambleLen Preamble Length in bits. + \returns \ref status_codes */ - int16_t begin(float br, float freqDev, float rxBw); + int16_t begin(float br, float freqDev, float rxBw, uint8_t preambleLen); /*! \brief Reset method. Will reset the chip to the default state using SDN pin. @@ -735,6 +737,15 @@ class Si443x: public PhysicalLayer { */ int16_t setSyncWord(uint8_t* syncWord, size_t len); + /*! + \brief Sets preamble length. + + \param preambleLen Preamble length to be set (in bits). + + \returns \ref status_codes + */ + int16_t setPreambleLength(uint8_t preambleLen); + /*! \brief Query modem for the packet length of received payload.