Created method for setting AFC bandwidth

pull/282/head
Libor Tomsik 2021-04-15 08:05:05 +02:00
rodzic 99386beec7
commit 2ae0188e50
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 29CB8B18FAB6FBDB
2 zmienionych plików z 56 dodań i 22 usunięć

Wyświetl plik

@ -84,8 +84,15 @@ int16_t SX127x::beginFSK(uint8_t chipVersion, float br, float freqDev, float rxB
state = SX127x::setBitRate(br);
RADIOLIB_ASSERT(state);
// set frequency deviation
state = SX127x::setFrequencyDeviation(freqDev);
// set receiver bandwidth
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);
// set receiver bandwidth
@ -731,6 +738,19 @@ int16_t SX127x::setFrequencyDeviation(float freqDev) {
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) {
// check active modem
if(getActiveModem() != SX127X_FSK_OOK) {
@ -743,26 +763,24 @@ int16_t SX127x::setRxBandwidth(float rxBw) {
int16_t state = setMode(SX127X_STANDBY);
RADIOLIB_ASSERT(state);
// calculate exponent and mantissa values
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(rxBw - ((point / 1000.0) + 0.05)) <= 0.5) {
// set Rx bandwidth during AFC
state = _mod->SPIsetRegValue(SX127X_REG_AFC_BW, (m << 3) | e, 4, 0);
RADIOLIB_ASSERT(state);
// set Rx bandwidth
return(_mod->SPIsetRegValue(SX127X_REG_RX_BW, calculateBWManExp(rxBw), 4, 0));
}
// set Rx bandwidth
state = _mod->SPIsetRegValue(SX127X_REG_RX_BW, (m << 3) | e, 4, 0);
if(state == ERR_NONE) {
SX127x::_rxBw = rxBw;
}
return(state);
}
int16_t SX127x::setAFCBandwidth(float rxBw){
// check active modem
if(getActiveModem() != SX127X_FSK_OOK){
return(ERR_WRONG_MODEM);
}
}
return(ERR_UNKNOWN);
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);
// set AFC bandwidth
return(_mod->SPIsetRegValue(SX127X_REG_AFC_BW, calculateBWManExp(rxBw), 4, 0));
}
int16_t SX127x::setSyncWord(uint8_t* syncWord, size_t len) {

Wyświetl plik

@ -814,6 +814,15 @@ class SX127x: public PhysicalLayer {
*/
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.
@ -993,7 +1002,7 @@ class SX127x: public PhysicalLayer {
int16_t invertIQ(bool invertIQ);
#if !defined(RADIOLIB_GODMODE) && !defined(RADIOLIB_LOW_LEVEL)
protected:
protected:
#endif
Module* _mod;
@ -1006,7 +1015,6 @@ class SX127x: public PhysicalLayer {
uint8_t _sf = 0;
uint8_t _cr = 0;
float _br = 0;
float _rxBw = 0;
bool _ook = false;
bool _crcEnabled = false;
size_t _packetLength = 0;
@ -1030,6 +1038,14 @@ class SX127x: public PhysicalLayer {
int16_t setActiveModem(uint8_t modem);
void clearIRQFlags();
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