Created method for setting AFC bandwidth
This commit is contained in:
parent
99386beec7
commit
2ae0188e50
2 changed files with 56 additions and 22 deletions
|
@ -84,8 +84,15 @@ int16_t SX127x::beginFSK(uint8_t chipVersion, float br, float freqDev, float rxB
|
||||||
state = SX127x::setBitRate(br);
|
state = SX127x::setBitRate(br);
|
||||||
RADIOLIB_ASSERT(state);
|
RADIOLIB_ASSERT(state);
|
||||||
|
|
||||||
// set frequency deviation
|
// set receiver bandwidth
|
||||||
state = SX127x::setFrequencyDeviation(freqDev);
|
state = SX127x::setRxBandwidth(rxBw);
|
||||||
|
RADIOLIB_ASSERT(state);
|
||||||
|
|
||||||
|
//set AFC bandwidth
|
||||||
|
state = SX127x::setAFCBandwidth(rxBw);
|
||||||
|
RADIOLIB_ASSERT(state);
|
||||||
|
|
||||||
|
state = _mod->SPIsetRegValue(SX127X_REG_RX_CONFIG, 0x1E);//TODO
|
||||||
RADIOLIB_ASSERT(state);
|
RADIOLIB_ASSERT(state);
|
||||||
|
|
||||||
// set receiver bandwidth
|
// set receiver bandwidth
|
||||||
|
@ -731,6 +738,19 @@ int16_t SX127x::setFrequencyDeviation(float freqDev) {
|
||||||
return(state);
|
return(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t SX127x::calculateBWManExp(float bandwidth) const
|
||||||
|
{
|
||||||
|
for(uint8_t e = 7; e >= 1; e--) {
|
||||||
|
for(int8_t m = 2; m >= 0; m--) {
|
||||||
|
float point = (SX127X_CRYSTAL_FREQ * 1000000.0)/(((4 * m) + 16) * ((uint32_t)1 << (e + 2)));
|
||||||
|
if(abs(bandwidth - ((point / 1000.0) + 0.05)) <= 0.5) {
|
||||||
|
return((m << 3) | e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int16_t SX127x::setRxBandwidth(float rxBw) {
|
int16_t SX127x::setRxBandwidth(float rxBw) {
|
||||||
// check active modem
|
// check active modem
|
||||||
if(getActiveModem() != SX127X_FSK_OOK) {
|
if(getActiveModem() != SX127X_FSK_OOK) {
|
||||||
|
@ -743,26 +763,24 @@ int16_t SX127x::setRxBandwidth(float rxBw) {
|
||||||
int16_t state = setMode(SX127X_STANDBY);
|
int16_t state = setMode(SX127X_STANDBY);
|
||||||
RADIOLIB_ASSERT(state);
|
RADIOLIB_ASSERT(state);
|
||||||
|
|
||||||
// calculate exponent and mantissa values
|
// set Rx bandwidth
|
||||||
for(uint8_t e = 7; e >= 1; e--) {
|
return(_mod->SPIsetRegValue(SX127X_REG_RX_BW, calculateBWManExp(rxBw), 4, 0));
|
||||||
for(int8_t m = 2; m >= 0; m--) {
|
}
|
||||||
float point = (SX127X_CRYSTAL_FREQ * 1000000.0)/(((4 * m) + 16) * ((uint32_t)1 << (e + 2)));
|
|
||||||
if(abs(rxBw - ((point / 1000.0) + 0.05)) <= 0.5) {
|
int16_t SX127x::setAFCBandwidth(float rxBw){
|
||||||
// set Rx bandwidth during AFC
|
// check active modem
|
||||||
state = _mod->SPIsetRegValue(SX127X_REG_AFC_BW, (m << 3) | e, 4, 0);
|
if(getActiveModem() != SX127X_FSK_OOK){
|
||||||
|
return(ERR_WRONG_MODEM);
|
||||||
|
}
|
||||||
|
|
||||||
|
RADIOLIB_CHECK_RANGE(rxBw, 2.6, 250.0, ERR_INVALID_RX_BANDWIDTH);
|
||||||
|
|
||||||
|
// set mode to STANDBY
|
||||||
|
int16_t state = setMode(SX127X_STANDBY);
|
||||||
RADIOLIB_ASSERT(state);
|
RADIOLIB_ASSERT(state);
|
||||||
|
|
||||||
// set Rx bandwidth
|
// set AFC bandwidth
|
||||||
state = _mod->SPIsetRegValue(SX127X_REG_RX_BW, (m << 3) | e, 4, 0);
|
return(_mod->SPIsetRegValue(SX127X_REG_AFC_BW, calculateBWManExp(rxBw), 4, 0));
|
||||||
if(state == ERR_NONE) {
|
|
||||||
SX127x::_rxBw = rxBw;
|
|
||||||
}
|
|
||||||
|
|
||||||
return(state);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return(ERR_UNKNOWN);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t SX127x::setSyncWord(uint8_t* syncWord, size_t len) {
|
int16_t SX127x::setSyncWord(uint8_t* syncWord, size_t len) {
|
||||||
|
|
|
@ -814,6 +814,15 @@ class SX127x: public PhysicalLayer {
|
||||||
*/
|
*/
|
||||||
int16_t setRxBandwidth(float rxBw);
|
int16_t setRxBandwidth(float rxBw);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Sets FSK automatic frequency correction bandwidth. Allowed values range from 2.6 to 250 kHz. Only available in FSK mode.
|
||||||
|
|
||||||
|
\param rxBw Receiver AFC bandwidth to be set (in kHz).
|
||||||
|
|
||||||
|
\returns \ref status_codes
|
||||||
|
*/
|
||||||
|
int16_t setAFCBandwidth(float afcBw);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\brief Sets FSK sync word. Allowed sync words are up to 8 bytes long and can not contain null bytes. Only available in FSK mode.
|
\brief Sets FSK sync word. Allowed sync words are up to 8 bytes long and can not contain null bytes. Only available in FSK mode.
|
||||||
|
|
||||||
|
@ -1006,7 +1015,6 @@ class SX127x: public PhysicalLayer {
|
||||||
uint8_t _sf = 0;
|
uint8_t _sf = 0;
|
||||||
uint8_t _cr = 0;
|
uint8_t _cr = 0;
|
||||||
float _br = 0;
|
float _br = 0;
|
||||||
float _rxBw = 0;
|
|
||||||
bool _ook = false;
|
bool _ook = false;
|
||||||
bool _crcEnabled = false;
|
bool _crcEnabled = false;
|
||||||
size_t _packetLength = 0;
|
size_t _packetLength = 0;
|
||||||
|
@ -1030,6 +1038,14 @@ class SX127x: public PhysicalLayer {
|
||||||
int16_t setActiveModem(uint8_t modem);
|
int16_t setActiveModem(uint8_t modem);
|
||||||
void clearIRQFlags();
|
void clearIRQFlags();
|
||||||
void clearFIFO(size_t count); // used mostly to clear remaining bytes in FIFO after a packet read
|
void clearFIFO(size_t count); // used mostly to clear remaining bytes in FIFO after a packet read
|
||||||
|
/**
|
||||||
|
* @brief Calculate exponent and mantissa values for receiver bandwidth and AFC
|
||||||
|
*
|
||||||
|
* \param bandwidth bandwidth to be set (in kHz).
|
||||||
|
*
|
||||||
|
* \returns bandwidth in manitsa and exponent format
|
||||||
|
*/
|
||||||
|
uint8_t calculateBWManExp(float bandwidth) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue