[CC1101] Added data shaping and encoding methods

This commit is contained in:
jgromes 2020-02-11 14:28:42 +01:00
parent 13d7f9364c
commit 2a1b25ff61
2 changed files with 69 additions and 0 deletions

View file

@ -78,6 +78,15 @@ int16_t CC1101::begin(float freq, float br, float freqDev, float rxBw, int8_t po
// configure default preamble lenght // configure default preamble lenght
state = setPreambleLength(preambleLength); state = setPreambleLength(preambleLength);
RADIOLIB_ASSERT(state);
// set default data shaping
state = setDataShaping(0);
RADIOLIB_ASSERT(state);
// set default encoding
state = setEncoding(2);
RADIOLIB_ASSERT(state);
// flush FIFOs // flush FIFOs
SPIsendCommand(CC1101_CMD_FLUSH_RX); SPIsendCommand(CC1101_CMD_FLUSH_RX);
@ -665,6 +674,47 @@ int16_t CC1101::setPromiscuousMode(bool promiscuous) {
return(state); return(state);
} }
int16_t CC1101::setDataShaping(float sh) {
// set mode to standby
int16_t state = standby();
RADIOLIB_ASSERT(state);
// set data shaping
sh *= 10.0;
if(abs(sh - 0.0) <= 0.001) {
state = _mod->SPIsetRegValue(CC1101_REG_MDMCFG2, CC1101_MOD_FORMAT_2_FSK, 6, 4);
} else if(abs(sh - 5.0) <= 0.001) {
state = _mod->SPIsetRegValue(CC1101_REG_MDMCFG2, CC1101_MOD_FORMAT_GFSK, 6, 4);
} else {
return(ERR_INVALID_DATA_SHAPING);
}
return(state);
}
int16_t CC1101::setEncoding(uint8_t encoding) {
// set mode to standby
int16_t state = standby();
RADIOLIB_ASSERT(state);
// set encoding
switch(encoding) {
case 0:
state = _mod->SPIsetRegValue(CC1101_REG_MDMCFG2, CC1101_MANCHESTER_EN_OFF, 3, 3);
RADIOLIB_ASSERT(state);
return(_mod->SPIsetRegValue(CC1101_REG_PKTCTRL0, CC1101_WHITE_DATA_OFF, 6, 6));
case 1:
state = _mod->SPIsetRegValue(CC1101_REG_MDMCFG2, CC1101_MANCHESTER_EN_ON, 3, 3);
RADIOLIB_ASSERT(state);
return(_mod->SPIsetRegValue(CC1101_REG_PKTCTRL0, CC1101_WHITE_DATA_OFF, 6, 6));
case 2:
state = _mod->SPIsetRegValue(CC1101_REG_MDMCFG2, CC1101_MANCHESTER_EN_OFF, 3, 3);
RADIOLIB_ASSERT(state);
return(_mod->SPIsetRegValue(CC1101_REG_PKTCTRL0, CC1101_WHITE_DATA_ON, 6, 6));
default:
return(ERR_INVALID_ENCODING);
}
}
int16_t CC1101::config() { int16_t CC1101::config() {
// Reset the radio. Registers may be dirty from previous usage. // Reset the radio. Registers may be dirty from previous usage.
SPIsendCommand(CC1101_CMD_RESET); SPIsendCommand(CC1101_CMD_RESET);

View file

@ -837,6 +837,25 @@ class CC1101: public PhysicalLayer {
*/ */
int16_t setPromiscuousMode(bool promiscuous = true); int16_t setPromiscuousMode(bool promiscuous = true);
/*!
\brief Sets Gaussian filter bandwidth-time product that will be used for data shaping.
Allowed value is 0.5. Set to 0 to disable data shaping.
\param sh Gaussian shaping bandwidth-time product that will be used for data shaping
\returns \ref status_codes
*/
int16_t setDataShaping(float sh);
/*!
\brief Sets transmission encoding.
\param encoding Encoding to be used. Set to 0 for NRZ, 1 for Manchester and 2 for whitening.
\returns \ref status_codes
*/
int16_t setEncoding(uint8_t encoding);
#ifndef RADIOLIB_GODMODE #ifndef RADIOLIB_GODMODE
private: private:
#endif #endif