diff --git a/ADF7021.cpp b/ADF7021.cpp
index 92019ee..d4577f0 100644
--- a/ADF7021.cpp
+++ b/ADF7021.cpp
@@ -79,6 +79,11 @@ int8_t m_dmrPostBWAdj;
int8_t m_p25PostBWAdj;
int8_t m_nxdnPostBWAdj;
+bool m_afcEnable;
+uint8_t m_afcKI;
+uint8_t m_afcKP;
+uint8_t m_afcRange;
+
// ---------------------------------------------------------------------------
// Global Functions
// ---------------------------------------------------------------------------
@@ -292,8 +297,6 @@ void IO::interrupt2()
///
void IO::rf1Conf(DVM_STATE modemState, bool reset)
{
- int32_t AFC_OFFSET = 0;
-
uint32_t txFrequencyTmp, rxFrequencyTmp;
DEBUG4("IO::rf1Conf(): configuring ADF for Tx/Rx; modemState/reset/rxGain", modemState, reset, m_gainMode);
@@ -310,21 +313,6 @@ void IO::rf1Conf(DVM_STATE modemState, bool reset)
delayReset();
}
- switch (modemState) {
- case STATE_DMR:
- case STATE_CW:
- AFC_OFFSET = AFC_OFFSET_DMR;
- break;
- case STATE_P25:
- AFC_OFFSET = AFC_OFFSET_P25;
- break;
- case STATE_NXDN:
- AFC_OFFSET = AFC_OFFSET_NXDN;
- break;
- default:
- break;
- }
-
/*
** VCO/Oscillator (Register 1)
*/
@@ -335,9 +323,9 @@ void IO::rf1Conf(DVM_STATE modemState, bool reset)
*/
float divider = 0.0f;
if (div2 == 1U)
- divider = (m_rxFrequency - 100000 + AFC_OFFSET) / (ADF7021_PFD / 2U);
+ divider = (m_rxFrequency - 100000) / (ADF7021_PFD / 2U);
else
- divider = (m_rxFrequency - 100000 + (2 * AFC_OFFSET)) / ADF7021_PFD;
+ divider = (m_rxFrequency - 100000) / ADF7021_PFD;
// calculate Integer_N and Fractional_N divider values for Rx
RX_N_Divider = floor(divider);
@@ -649,6 +637,21 @@ void IO::setRFAdjust(int8_t dmrDiscBWAdj, int8_t p25DiscBWAdj, int8_t nxdnDiscBW
m_nxdnPostBWAdj = nxdnPostBWADJ;
}
+///
+/// Sets the RF AFC parameters.
+///
+///
+///
+///
+///
+void IO::setAFCParams(bool afcEnable, uint8_t afcKI, uint8_t afcKP, uint8_t afcRange)
+{
+ m_afcEnable = afcEnable;
+ m_afcKI = afcKI;
+ m_afcKP = afcKP;
+ m_afcRange = afcRange;
+}
+
///
///
///
@@ -965,33 +968,24 @@ void IO::configureTxRx(DVM_STATE modemState)
/*
** AFC (Register 10)
*/
+ ADF7021_REG10 = (uint32_t)ADF7021_REG10_ADDR; // Register Address 10
+
+ if (m_afcEnable) {
+ ADF7021_REG10 |= (uint32_t)ADF7021_REG10_AFC_ENABLE << 4; // AFC Enable/Disable
+ } else {
+ ADF7021_REG10 |= (uint32_t)ADF7021_REG10_AFC_DISABLE << 4; // AFC Enable/Disable
+ }
+
/** Support for 14.7456 MHz TCXO (modified RF7021SE boards) */
#if defined(ADF7021_14_7456)
- ADF7021_REG10 = (uint32_t)ADF7021_REG10_ADDR; // Register Address 10
-#if defined(ADF7021_ENABLE_4FSK_AFC)
- ADF7021_REG10 |= (uint32_t)ADF7021_REG10_AFC_ENABLE << 4; // AFC Enable/Disable
-#else
- ADF7021_REG10 |= (uint32_t)ADF7021_REG10_AFC_DISABLE << 4; // AFC Enable/Disable
-#endif
ADF7021_REG10 |= (uint32_t)(569 & 0xFFFU) << 5; // AFC Scaling Factor
- ADF7021_REG10 |= (uint32_t)(15 & 0xFU) << 17; // KI
- ADF7021_REG10 |= (uint32_t)(4 & 0x7U) << 21; // KP
- ADF7021_REG10 |= (uint32_t)(4 & 0xFFU) << 24; // Maximum AFC Range
-
/** Support for 12.2880 MHz TCXO */
#elif defined(ADF7021_12_2880)
- ADF7021_REG10 = (uint32_t)ADF7021_REG10_ADDR; // Register Address 10
-#if defined(ADF7021_ENABLE_4FSK_AFC)
- ADF7021_REG10 |= (uint32_t)ADF7021_REG10_AFC_ENABLE << 4; // AFC Enable/Disable
-#else
- ADF7021_REG10 |= (uint32_t)ADF7021_REG10_AFC_DISABLE << 4; // AFC Enable/Disable
-#endif
ADF7021_REG10 |= (uint32_t)(683 & 0xFFFU) << 5; // AFC Scaling Factor
- ADF7021_REG10 |= (uint32_t)(15 & 0xFU) << 17; // KI
- ADF7021_REG10 |= (uint32_t)(4 & 0x7U) << 21; // KP
- ADF7021_REG10 |= (uint32_t)(4 & 0xFFU) << 24; // Maximum AFC Range
-
#endif
+ ADF7021_REG10 |= (uint32_t)(m_afcKI & 0xFU) << 17; // KI
+ ADF7021_REG10 |= (uint32_t)(m_afcKP & 0x7U) << 21; // KP
+ ADF7021_REG10 |= (uint32_t)(m_afcRange & 0xFFU) << 24; // Maximum AFC Range
/*
** Demodulator Setup (Register 4)
@@ -1053,33 +1047,24 @@ void IO::configureTxRx(DVM_STATE modemState)
/*
** AFC (Register 10)
*/
+ ADF7021_REG10 = (uint32_t)ADF7021_REG10_ADDR; // Register Address 10
+
+ if (m_afcEnable) {
+ ADF7021_REG10 |= (uint32_t)ADF7021_REG10_AFC_ENABLE << 4; // AFC Enable/Disable
+ } else {
+ ADF7021_REG10 |= (uint32_t)ADF7021_REG10_AFC_DISABLE << 4; // AFC Enable/Disable
+ }
+
/** Support for 14.7456 MHz TCXO (modified RF7021SE boards) */
#if defined(ADF7021_14_7456)
- ADF7021_REG10 = (uint32_t)ADF7021_REG10_ADDR; // Register Address 10
-#if defined(ADF7021_ENABLE_4FSK_AFC)
- ADF7021_REG10 |= (uint32_t)ADF7021_REG10_AFC_ENABLE << 4; // AFC Enable/Disable
-#else
- ADF7021_REG10 |= (uint32_t)ADF7021_REG10_AFC_DISABLE << 4; // AFC Enable/Disable
-#endif
ADF7021_REG10 |= (uint32_t)(569 & 0xFFFU) << 5; // AFC Scaling Factor
- ADF7021_REG10 |= (uint32_t)(15 & 0xFU) << 17; // KI
- ADF7021_REG10 |= (uint32_t)(4 & 0x7U) << 21; // KP
- ADF7021_REG10 |= (uint32_t)(4 & 0xFFU) << 24; // Maximum AFC Range
-
/** Support for 12.2880 MHz TCXO */
#elif defined(ADF7021_12_2880)
- ADF7021_REG10 = (uint32_t)ADF7021_REG10_ADDR; // Register Address 10
-#if defined(ADF7021_ENABLE_4FSK_AFC)
- ADF7021_REG10 |= (uint32_t)ADF7021_REG10_AFC_ENABLE << 4; // AFC Enable/Disable
-#else
- ADF7021_REG10 |= (uint32_t)ADF7021_REG10_AFC_DISABLE << 4; // AFC Enable/Disable
-#endif
ADF7021_REG10 |= (uint32_t)(683 & 0xFFFU) << 5; // AFC Scaling Factor
- ADF7021_REG10 |= (uint32_t)(15 & 0xFU) << 17; // KI
- ADF7021_REG10 |= (uint32_t)(4 & 0x7U) << 21; // KP
- ADF7021_REG10 |= (uint32_t)(4 & 0xFFU) << 24; // Maximum AFC Range
-
#endif
+ ADF7021_REG10 |= (uint32_t)(m_afcKI & 0xFU) << 17; // KI
+ ADF7021_REG10 |= (uint32_t)(m_afcKP & 0x7U) << 21; // KP
+ ADF7021_REG10 |= (uint32_t)(m_afcRange & 0xFFU) << 24; // Maximum AFC Range
/*
** Demodulator Setup (Register 4)
@@ -1141,33 +1126,24 @@ void IO::configureTxRx(DVM_STATE modemState)
/*
** AFC (Register 10)
*/
+ ADF7021_REG10 = (uint32_t)ADF7021_REG10_ADDR; // Register Address 10
+
+ if (m_afcEnable) {
+ ADF7021_REG10 |= (uint32_t)ADF7021_REG10_AFC_ENABLE << 4; // AFC Enable/Disable
+ } else {
+ ADF7021_REG10 |= (uint32_t)ADF7021_REG10_AFC_DISABLE << 4; // AFC Enable/Disable
+ }
+
/** Support for 14.7456 MHz TCXO (modified RF7021SE boards) */
#if defined(ADF7021_14_7456)
- ADF7021_REG10 = (uint32_t)ADF7021_REG10_ADDR; // Register Address 10
-#if defined(ADF7021_ENABLE_4FSK_AFC)
- ADF7021_REG10 |= (uint32_t)ADF7021_REG10_AFC_ENABLE << 4; // AFC Enable/Disable
-#else
- ADF7021_REG10 |= (uint32_t)ADF7021_REG10_AFC_DISABLE << 4; // AFC Enable/Disable
-#endif
ADF7021_REG10 |= (uint32_t)(569 & 0xFFFU) << 5; // AFC Scaling Factor
- ADF7021_REG10 |= (uint32_t)(15 & 0xFU) << 17; // KI
- ADF7021_REG10 |= (uint32_t)(4 & 0x7U) << 21; // KP
- ADF7021_REG10 |= (uint32_t)(4 & 0xFFU) << 24; // Maximum AFC Range
-
/** Support for 12.2880 MHz TCXO */
#elif defined(ADF7021_12_2880)
- ADF7021_REG10 = (uint32_t)ADF7021_REG10_ADDR; // Register Address 10
-#if defined(ADF7021_ENABLE_4FSK_AFC)
- ADF7021_REG10 |= (uint32_t)ADF7021_REG10_AFC_ENABLE << 4; // AFC Enable/Disable
-#else
- ADF7021_REG10 |= (uint32_t)ADF7021_REG10_AFC_DISABLE << 4; // AFC Enable/Disable
-#endif
ADF7021_REG10 |= (uint32_t)(683 & 0xFFFU) << 5; // AFC Scaling Factor
- ADF7021_REG10 |= (uint32_t)(15 & 0xFU) << 17; // KI
- ADF7021_REG10 |= (uint32_t)(4 & 0x7U) << 21; // KP
- ADF7021_REG10 |= (uint32_t)(4 & 0xFFU) << 24; // Maximum AFC Range
-
#endif
+ ADF7021_REG10 |= (uint32_t)(m_afcKI & 0xFU) << 17; // KI
+ ADF7021_REG10 |= (uint32_t)(m_afcKP & 0x7U) << 21; // KP
+ ADF7021_REG10 |= (uint32_t)(m_afcRange & 0xFFU) << 24; // Maximum AFC Range
/*
** Demodulator Setup (Register 4)
@@ -1239,32 +1215,24 @@ void IO::configureTxRx(DVM_STATE modemState)
/*
** AFC (Register 10)
*/
+ ADF7021_REG10 = (uint32_t)ADF7021_REG10_ADDR; // Register Address 10
+
+ if (m_afcEnable) {
+ ADF7021_REG10 |= (uint32_t)ADF7021_REG10_AFC_ENABLE << 4; // AFC Enable/Disable
+ } else {
+ ADF7021_REG10 |= (uint32_t)ADF7021_REG10_AFC_DISABLE << 4; // AFC Enable/Disable
+ }
+
/** Support for 14.7456 MHz TCXO (modified RF7021SE boards) */
#if defined(ADF7021_14_7456)
- ADF7021_REG10 = (uint32_t)ADF7021_REG10_ADDR; // Register Address 10
-#if defined(ADF7021_ENABLE_4FSK_AFC)
- ADF7021_REG10 |= (uint32_t)ADF7021_REG10_AFC_ENABLE << 4; // AFC Enable/Disable
-#else
- ADF7021_REG10 |= (uint32_t)ADF7021_REG10_AFC_DISABLE << 4; // AFC Enable/Disable
-#endif
ADF7021_REG10 |= (uint32_t)(569 & 0xFFFU) << 5; // AFC Scaling Factor
- ADF7021_REG10 |= (uint32_t)(15 & 0xFU) << 17; // KI
- ADF7021_REG10 |= (uint32_t)(4 & 0x7U) << 21; // KP
- ADF7021_REG10 |= (uint32_t)(4 & 0xFFU) << 24; // Maximum AFC Range
-
/** Support for 12.2880 MHz TCXO */
#elif defined(ADF7021_12_2880)
- ADF7021_REG10 = (uint32_t)ADF7021_REG10_ADDR; // Register Address 10
-#if defined(ADF7021_ENABLE_4FSK_AFC)
- ADF7021_REG10 |= (uint32_t)ADF7021_REG10_AFC_ENABLE << 4; // AFC Enable/Disable
-#else
- ADF7021_REG10 |= (uint32_t)ADF7021_REG10_AFC_DISABLE << 4; // AFC Enable/Disable
-#endif
ADF7021_REG10 |= (uint32_t)(683 & 0xFFFU) << 5; // AFC Scaling Factor
- ADF7021_REG10 |= (uint32_t)(15 & 0xFU) << 17; // KI
- ADF7021_REG10 |= (uint32_t)(4 & 0x7U) << 21; // KP
- ADF7021_REG10 |= (uint32_t)(4 & 0xFFU) << 24; // Maximum AFC Range
#endif
+ ADF7021_REG10 |= (uint32_t)(m_afcKI & 0xFU) << 17; // KI
+ ADF7021_REG10 |= (uint32_t)(m_afcKP & 0x7U) << 21; // KP
+ ADF7021_REG10 |= (uint32_t)(m_afcRange & 0xFFU) << 24; // Maximum AFC Range
/*
** Demodulator Setup (Register 4)
@@ -1325,25 +1293,24 @@ void IO::configureTxRx(DVM_STATE modemState)
/*
** AFC (Register 10)
*/
+ ADF7021_REG10 = (uint32_t)ADF7021_REG10_ADDR; // Register Address 10
+
+ if (m_afcEnable) {
+ ADF7021_REG10 |= (uint32_t)ADF7021_REG10_AFC_ENABLE << 4; // AFC Enable/Disable
+ } else {
+ ADF7021_REG10 |= (uint32_t)ADF7021_REG10_AFC_DISABLE << 4; // AFC Enable/Disable
+ }
+
/** Support for 14.7456 MHz TCXO (modified RF7021SE boards) */
#if defined(ADF7021_14_7456)
- ADF7021_REG10 = (uint32_t)ADF7021_REG10_ADDR; // Register Address 10
- ADF7021_REG10 |= (uint32_t)ADF7021_REG10_AFC_ENABLE << 4; // AFC Enable/Disable
ADF7021_REG10 |= (uint32_t)(569 & 0xFFFU) << 5; // AFC Scaling Factor
- ADF7021_REG10 |= (uint32_t)(11 & 0xFU) << 17; // KI
- ADF7021_REG10 |= (uint32_t)(4 & 0x7U) << 21; // KP
- ADF7021_REG10 |= (uint32_t)(12 & 0xFFU) << 24; // Maximum AFC Range
-
/** Support for 12.2880 MHz TCXO */
#elif defined(ADF7021_12_2880)
- ADF7021_REG10 = (uint32_t)ADF7021_REG10_ADDR; // Register Address 10
- ADF7021_REG10 |= (uint32_t)ADF7021_REG10_AFC_ENABLE << 4; // AFC Enable/Disable
ADF7021_REG10 |= (uint32_t)(683 & 0xFFFU) << 5; // AFC Scaling Factor
- ADF7021_REG10 |= (uint32_t)(11 & 0xFU) << 17; // KI
- ADF7021_REG10 |= (uint32_t)(4 & 0x7U) << 21; // KP
- ADF7021_REG10 |= (uint32_t)(12 & 0xFFU) << 24; // Maximum AFC Range
-
#endif
+ ADF7021_REG10 |= (uint32_t)(m_afcKI & 0xFU) << 17; // KI
+ ADF7021_REG10 |= (uint32_t)(m_afcKP & 0x7U) << 21; // KP
+ ADF7021_REG10 |= (uint32_t)(m_afcRange & 0xFFU) << 24; // Maximum AFC Range
/*
** Demodulator Setup (Register 4)
diff --git a/ADF7021.h b/ADF7021.h
index 79ae44a..caee7a8 100644
--- a/ADF7021.h
+++ b/ADF7021.h
@@ -90,30 +90,6 @@
#define ADF7021_DISC_BW_MAX 660
#define ADF7021_POST_BW_MAX 1023
-#if defined(ADF7021_ENABLE_4FSK_AFC)
-
-#if defined(ADF7021_AFC_POS)
-
-#define AFC_OFFSET_DMR -125
-#define AFC_OFFSET_P25 -125
-#define AFC_OFFSET_NXDN -125
-
-#else
-
-#define AFC_OFFSET_DMR 125
-#define AFC_OFFSET_P25 125
-#define AFC_OFFSET_NXDN 125
-
-#endif // ADF7021_AFC_POS
-
-#else
-
-#define AFC_OFFSET_DMR 0
-#define AFC_OFFSET_P25 0
-#define AFC_OFFSET_NXDN 0
-
-#endif // ADF7021_ENABLE_4FSK_AFC
-
/*
- Most of the registers values are obteined from ADI eval software:
http://www.analog.com/en/products/rf-microwave/integrated-transceivers-transmitters-receivers/low-power-rf-transceivers/adf7021.html
diff --git a/Defines.h b/Defines.h
index 79ae004..fc5c38a 100644
--- a/Defines.h
+++ b/Defines.h
@@ -119,12 +119,6 @@ typedef unsigned long long ulong64_t;
// Support for ADF7021-N version:
// #define ADF7021_N_VER
-// Enable AFC support for DMR and P25 (experimental)
-// #define ADF7021_ENABLE_4FSK_AFC
-
-// Configure AFC with positive initial frequency offset
-// #define ADF7021_AFC_POS
-
// Force the internal L (internal VCO inductor) for UHF 380 and T-band
#define FORCE_UHF_INTERAL_L
diff --git a/IO.h b/IO.h
index 86d14f6..181b4cb 100644
--- a/IO.h
+++ b/IO.h
@@ -114,6 +114,8 @@ public:
uint8_t setRFParams(uint32_t rxFreq, uint32_t txFreq, uint8_t rfPower, ADF_GAIN_MODE gainMode);
/// Sets the RF adjustment parameters.
void setRFAdjust(int8_t dmrDiscBWAdj, int8_t p25DiscBWAdj, int8_t nxdnDiscBWAdj, int8_t dmrPostBWAdj, int8_t p25PostBWAdj, int8_t nxdnPostBWAdj);
+ /// Sets the RF AFC adjustment parameters.
+ void setAFCParams(bool afcEnable, uint8_t afcKI, uint8_t afcKP, uint8_t afcRange);
/// Flag indicating the TX ring buffer has overflowed.
bool hasTXOverflow(void);
diff --git a/SerialPort.cpp b/SerialPort.cpp
index 47001a7..8407763 100644
--- a/SerialPort.cpp
+++ b/SerialPort.cpp
@@ -1346,6 +1346,21 @@ uint8_t SerialPort::setRFParams(const uint8_t* data, uint8_t length)
if (nxdnPostBWAdj < -128)
return RSN_INVALID_REQUEST;
+ // support optional AFC parameters
+ if (length > 17U) {
+ if (length < 19U)
+ return RSN_ILLEGAL_LENGTH;
+
+ bool afcEnable = (data[17U] & 0x80U) == 0x80U;
+ uint8_t afcKI = data[17U] & 0x0FU;
+ uint8_t afcKP = (data[17U] >> 4) & 0x07U;
+ uint8_t afcRange = data[18U];
+
+ io.setAFCParams(afcEnable, afcKI, afcKP, afcRange);
+ } else {
+ io.setAFCParams(false, 11, 4, 2);
+ }
+
gainMode = (ADF_GAIN_MODE)data[14U];
io.setRFAdjust(dmrDiscBWAdj, p25DiscBWAdj, nxdnDiscBWAdj, dmrPostBWAdj, p25PostBWAdj, nxdnPostBWAdj);