diff --git a/src/modules/CC1101.cpp b/src/modules/CC1101.cpp index 658a3ba2..c39c48e6 100644 --- a/src/modules/CC1101.cpp +++ b/src/modules/CC1101.cpp @@ -8,7 +8,7 @@ CC1101::CC1101(Module* module) : PhysicalLayer(CC1101_CRYSTAL_FREQ, CC1101_DIV_E _syncWordLength = CC1101_DEFAULT_SYNC_WORD_LENGTH; } -int16_t CC1101::begin(float freq, float br, float rxBw, float freqDev, int8_t power) { +int16_t CC1101::begin(float freq, float br, float rxBw, float freqDev, int8_t power, uint8_t preambleLength) { // set module properties _mod->SPIreadCommand = CC1101_CMD_READ; _mod->SPIwriteCommand = CC1101_CMD_WRITE; @@ -88,6 +88,12 @@ int16_t CC1101::begin(float freq, float br, float rxBw, float freqDev, int8_t po return(state); } + // configure default preamble lenght + state = setPreambleLength(preambleLength); + if (state != ERR_NONE) { + return(state); + } + // flush FIFOs SPIsendCommand(CC1101_CMD_FLUSH_RX); SPIsendCommand(CC1101_CMD_FLUSH_TX); @@ -474,6 +480,43 @@ int16_t CC1101::setSyncWord(uint8_t syncH, uint8_t syncL, uint8_t maxErrBits) { return(setSyncWord(syncWord, sizeof(syncWord), maxErrBits)); } +int16_t CC1101::setPreambleLength(uint8_t preambleLength) { + // check allowed values + uint8_t value; + switch(preambleLength){ + case 2: + value = CC1101_NUM_PREAMBLE_2; + break; + case 3: + value = CC1101_NUM_PREAMBLE_3; + break; + case 4: + value = CC1101_NUM_PREAMBLE_4; + break; + case 6: + value = CC1101_NUM_PREAMBLE_6; + break; + case 8: + value = CC1101_NUM_PREAMBLE_8; + break; + case 12: + value = CC1101_NUM_PREAMBLE_12; + break; + case 16: + value = CC1101_NUM_PREAMBLE_16; + break; + case 24: + value = CC1101_NUM_PREAMBLE_24; + break; + default: + return(ERR_INVALID_PREAMBLE_LENGTH); + } + + + return SPIsetRegValue(CC1101_REG_MDMCFG1, value, 6, 4); +} + + int16_t CC1101::setNodeAddress(uint8_t nodeAddr, uint8_t numBroadcastAddrs) { if(!(numBroadcastAddrs > 0) && (numBroadcastAddrs <= 2)) { return(ERR_INVALID_NUM_BROAD_ADDRS); diff --git a/src/modules/CC1101.h b/src/modules/CC1101.h index 92440449..30e64353 100644 --- a/src/modules/CC1101.h +++ b/src/modules/CC1101.h @@ -533,9 +533,11 @@ class CC1101: public PhysicalLayer { \param power Output power in dBm. Defaults to 0 dBm. + \param preambleLength Preamble Length in bytes. Defaults to 4 bytes. + \returns \ref status_codes */ - int16_t begin(float freq = 868.0, float br = 4.8, float rxBw = 325.0, float freqDev = 48.0, int8_t power = 0); + int16_t begin(float freq = 868.0, float br = 4.8, float rxBw = 325.0, float freqDev = 48.0, int8_t power = 0, uint8_t preambleLength = 4); /*! \brief Blocking binary transmit method. @@ -716,6 +718,15 @@ class CC1101: public PhysicalLayer { */ int16_t setSyncWord(uint8_t* syncWord, uint8_t len, uint8_t maxErrBits = 0); + /*! + \brief Sets preamble length. + + \param preambleLength Preamble length to be set (in bytes), allowed values: 2, 3, 4, 6, 8, 12, 16, 24 + + \returns \ref status_codes + */ + int16_t setPreambleLength(uint8_t preambleLength); + /*! \brief Sets node and broadcast addresses. Calling this method will also enable address filtering.