From 762a3d576ebfa0203498a36671925a7d7bc2807c Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Tue, 4 Oct 2022 21:58:18 -0400 Subject: [PATCH] expose ADF7021 AFC control to the host (optionally); --- ADF7021.cpp | 187 ++++++++++++++++++++----------------------------- ADF7021.h | 24 ------- Defines.h | 6 -- IO.h | 2 + SerialPort.cpp | 15 ++++ 5 files changed, 94 insertions(+), 140 deletions(-) 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);