From f0e686eaa959f1e0b796fd10cb051d4ba2691b9f Mon Sep 17 00:00:00 2001 From: jgromes Date: Fri, 14 Mar 2025 20:14:52 +0100 Subject: [PATCH] [Si443x] Add CRC configuration (#1430) --- src/modules/Si443x/Si443x.cpp | 17 ++++++++++++++--- src/modules/Si443x/Si443x.h | 9 +++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/modules/Si443x/Si443x.cpp b/src/modules/Si443x/Si443x.cpp index cf88f7a3..b121635a 100644 --- a/src/modules/Si443x/Si443x.cpp +++ b/src/modules/Si443x/Si443x.cpp @@ -54,10 +54,13 @@ int16_t Si443x::begin(float br, float freqDev, float rxBw, uint8_t preambleLen) state = packetMode(); RADIOLIB_ASSERT(state); - state = setDataShaping(0); + state = setDataShaping(RADIOLIB_SHAPING_NONE); RADIOLIB_ASSERT(state); - state = setEncoding(0); + state = setEncoding(RADIOLIB_ENCODING_NRZ); + RADIOLIB_ASSERT(state); + + state = setCRC(true); RADIOLIB_ASSERT(state); state = variablePacketLengthMode(); @@ -293,7 +296,8 @@ int16_t Si443x::startReceive() { this->mod->setRfSwitchState(Module::MODE_RX); // set interrupt mapping - this->mod->SPIwriteRegister(RADIOLIB_SI443X_REG_INTERRUPT_ENABLE_1, RADIOLIB_SI443X_VALID_PACKET_RECEIVED_ENABLED | RADIOLIB_SI443X_CRC_ERROR_ENABLED); + uint8_t irq = this->crcEnabled ? (RADIOLIB_SI443X_VALID_PACKET_RECEIVED_ENABLED | RADIOLIB_SI443X_CRC_ERROR_ENABLED) : RADIOLIB_SI443X_VALID_PACKET_RECEIVED_ENABLED; + this->mod->SPIwriteRegister(RADIOLIB_SI443X_REG_INTERRUPT_ENABLE_1, irq); this->mod->SPIwriteRegister(RADIOLIB_SI443X_REG_INTERRUPT_ENABLE_2, 0x00); // set mode to receive @@ -654,6 +658,13 @@ int16_t Si443x::clearIrqFlags(uint32_t irq) { return(RADIOLIB_ERR_NONE); } +int16_t Si443x::setCRC(bool enable, bool mode) { + this->crcEnabled = enable; + uint8_t crcEn = enable ? RADIOLIB_SI443X_CRC_ON : RADIOLIB_SI443X_CRC_OFF; + uint8_t crcCfg = mode ? RADIOLIB_SI443X_CRC_IBM_CRC16 : RADIOLIB_SI443X_CRC_CCITT; + return(this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_DATA_ACCESS_CONTROL, crcEn | crcCfg, 2, 0)); +} + Module* Si443x::getMod() { return(this->mod); } diff --git a/src/modules/Si443x/Si443x.h b/src/modules/Si443x/Si443x.h index 42ddc9e7..a5e843dd 100644 --- a/src/modules/Si443x/Si443x.h +++ b/src/modules/Si443x/Si443x.h @@ -836,6 +836,14 @@ class Si443x: public PhysicalLayer { */ int16_t clearIrqFlags(uint32_t irq) override; + /*! + \brief Enables/disables CRC of transmitted or received packets. + \param enable Enable (true) or disable (false) CRC. + \param mode Set CRC mode + \returns \ref status_codes + */ + int16_t setCRC(bool enable, bool mode = false); + #if !RADIOLIB_GODMODE && !RADIOLIB_LOW_LEVEL protected: #endif @@ -858,6 +866,7 @@ class Si443x: public PhysicalLayer { size_t packetLength = 0; bool packetLengthQueried = false; uint8_t packetLengthConfig = RADIOLIB_SI443X_FIXED_PACKET_LENGTH_ON; + bool crcEnabled = false; bool findChip(); void clearIrqStatus();