From ee01691dc411818d41a8a29dc430300e9a85ceb1 Mon Sep 17 00:00:00 2001 From: Andy CA6JAU Date: Fri, 10 Feb 2017 17:58:51 -0300 Subject: [PATCH] Adding 220 MHz and 900 MHz bands support --- ADF7021.cpp | 52 +++++++++++++++++++++++++++++++++++++++------------- ADF7021.h | 18 ++++++++++++------ IO.cpp | 6 ++++-- IO.h | 12 ++++++++---- 4 files changed, 63 insertions(+), 25 deletions(-) diff --git a/ADF7021.cpp b/ADF7021.cpp index a53e567..fa795f8 100644 --- a/ADF7021.cpp +++ b/ADF7021.cpp @@ -134,13 +134,40 @@ void CIO::ifConf() float divider; uint8_t N_divider; uint16_t F_divider; - + uint32_t div2; + + uint32_t ADF7021_REG1 = 0; uint32_t ADF7021_REG2 = 0; uint32_t ADF7021_REG3 = 0; uint32_t ADF7021_REG4 = 0; uint32_t ADF7021_REG13 = 0; - - divider = (m_frequency_rx - 100000) / (ADF7021_PFD / 2.0); + + // Check frequency band + if( (m_frequency_tx >= VHF1_MIN) && (m_frequency_tx < VHF1_MAX) ) { + ADF7021_REG1 = ADF7021_REG1_VHF1; // VHF1, external VCO + div2 = 1U; + } + else if( (m_frequency_tx >= VHF2_MIN) && (m_frequency_tx < VHF2_MAX) ) { + ADF7021_REG1 = ADF7021_REG1_VHF2; // VHF1, external VCO + div2 = 1U; + } + else if( (m_frequency_tx >= UHF1_MIN)&&(m_frequency_tx < UHF1_MAX) ) { + ADF7021_REG1 = ADF7021_REG1_UHF1; // UHF1, internal VCO + div2 = 1U; + } + else if( (m_frequency_tx >= UHF2_MIN)&&(m_frequency_tx < UHF2_MAX) ) { + ADF7021_REG1 = ADF7021_REG1_UHF2; // UHF2, internal VCO + div2 = 2U; + } + else { + ADF7021_REG1 = ADF7021_REG1_UHF1; // UHF1, internal VCO + div2 = 1U; + } + + if( div2 == 1U ) + divider = (m_frequency_rx - 100000) / (ADF7021_PFD / 2U); + else + divider = (m_frequency_rx - 100000) / ADF7021_PFD; N_divider = floor(divider); divider = (divider - N_divider) * 32768; @@ -157,7 +184,10 @@ void CIO::ifConf() ADF7021_RX_REG0 |= (uint32_t) N_divider << 19; // frequency; ADF7021_RX_REG0 |= (uint32_t) F_divider << 4; // frequency; - divider = m_frequency_tx / (ADF7021_PFD / 2.0); + if( div2 == 1U ) + divider = m_frequency_tx / (ADF7021_PFD / 2U); + else + divider = m_frequency_tx / ADF7021_PFD; N_divider = floor(divider); divider = (divider - N_divider) * 32768; @@ -192,7 +222,7 @@ void CIO::ifConf() ADF7021_REG13 |= (uint32_t) ADF7021_SLICER_TH_DSTAR << 4; // slicer threshold ADF7021_REG2 = (uint32_t) 0b00 << 28; // clock normal - ADF7021_REG2 |= (uint32_t) ADF7021_DEV_DSTAR << 19; // deviation + ADF7021_REG2 |= (uint32_t) (ADF7021_DEV_DSTAR / div2)<< 19; // deviation ADF7021_REG2 |= (uint32_t) 0b001 << 4; // modulation (GMSK) } else if (m_dmrEnable) { @@ -213,7 +243,7 @@ void CIO::ifConf() ADF7021_REG13 |= (uint32_t) ADF7021_SLICER_TH_DMR << 4; // slicer threshold ADF7021_REG2 = (uint32_t) 0b10 << 28; // invert data - ADF7021_REG2 |= (uint32_t) ADF7021_DEV_DMR << 19; // deviation + ADF7021_REG2 |= (uint32_t) (ADF7021_DEV_DMR / div2) << 19; // deviation ADF7021_REG2 |= (uint32_t) 0b111 << 4; // modulation (4FSK) } else if (m_ysfEnable) { @@ -234,7 +264,7 @@ void CIO::ifConf() ADF7021_REG13 |= (uint32_t) ADF7021_SLICER_TH_YSF << 4; // slicer threshold ADF7021_REG2 = (uint32_t) 0b10 << 28; // invert data - ADF7021_REG2 |= (uint32_t) ADF7021_DEV_YSF << 19; // deviation + ADF7021_REG2 |= (uint32_t) (ADF7021_DEV_YSF / div2) << 19; // deviation ADF7021_REG2 |= (uint32_t) 0b111 << 4; // modulation (4FSK) } else if (m_p25Enable) { @@ -255,16 +285,12 @@ void CIO::ifConf() ADF7021_REG13 |= (uint32_t) ADF7021_SLICER_TH_P25 << 4; // slicer threshold ADF7021_REG2 = (uint32_t) 0b10 << 28; // invert data - ADF7021_REG2 |= (uint32_t) ADF7021_DEV_P25 << 19; // deviation + ADF7021_REG2 |= (uint32_t) (ADF7021_DEV_P25 / div2) << 19; // deviation ADF7021_REG2 |= (uint32_t) 0b111 << 4; // modulation (4FSK) } // VCO/OSCILLATOR (REG1) - if( (m_frequency_tx >= VHF_MIN) && (m_frequency_tx < VHF_MAX) ) - AD7021_control_word = ADF7021_REG1_VHF; // VHF, external VCO - else if( (m_frequency_tx >= UHF_MIN)&&(m_frequency_tx < UHF_MAX) ) - AD7021_control_word = ADF7021_REG1_UHF; // UHF, internal VCO - + AD7021_control_word = ADF7021_REG1; Send_AD7021_control(); // TX/RX CLOCK (3) diff --git a/ADF7021.h b/ADF7021.h index 16227f6..b80c945 100644 --- a/ADF7021.h +++ b/ADF7021.h @@ -41,8 +41,10 @@ www.analog.com/media/en/technical-documentation/data-sheets/ADF7021.pdf #define ADF7021_PFD 3686400.0 // PLL (REG 01) -#define ADF7021_REG1_VHF 0x021F5041 -#define ADF7021_REG1_UHF 0x00575041 +#define ADF7021_REG1_VHF1 0x021F5041 +#define ADF7021_REG1_VHF2 0x021F5041 +#define ADF7021_REG1_UHF1 0x00575041 +#define ADF7021_REG1_UHF2 0x00535041 // Deviation of modulator (REG 02) #define ADF7021_DEV_DSTAR 43U @@ -91,8 +93,10 @@ www.analog.com/media/en/technical-documentation/data-sheets/ADF7021.pdf #define ADF7021_PFD 4920000.0 // PLL (REG 01) -#define ADF7021_REG1_VHF 0x021F5041 -#define ADF7021_REG1_UHF 0x00575041 +#define ADF7021_REG1_VHF1 0x021F5041 +#define ADF7021_REG1_VHF2 0x021F5041 +#define ADF7021_REG1_UHF1 0x00575041 +#define ADF7021_REG1_UHF2 0x00535041 // Deviation of modulator (REG 02) #define ADF7021_DEV_DSTAR 32U @@ -141,8 +145,10 @@ www.analog.com/media/en/technical-documentation/data-sheets/ADF7021.pdf #define ADF7021_PFD 6144000.0 // PLL (REG 01) -#define ADF7021_REG1_VHF 0x021F5021 -#define ADF7021_REG1_UHF 0x00575021 +#define ADF7021_REG1_VHF1 0x021F5021 +#define ADF7021_REG1_VHF2 0x021F5021 +#define ADF7021_REG1_UHF1 0x00575021 +#define ADF7021_REG1_UHF2 0x00535021 // Deviation of modulator (REG 02) #define ADF7021_DEV_DSTAR 26U diff --git a/IO.cpp b/IO.cpp index d5b938f..f26920e 100644 --- a/IO.cpp +++ b/IO.cpp @@ -192,8 +192,10 @@ uint8_t CIO::setFreq(uint32_t frequency_rx, uint32_t frequency_tx) // power level m_power = 0x20; - if( !( ((frequency_rx >= VHF_MIN)&&(frequency_rx < VHF_MAX)) || ((frequency_tx >= VHF_MIN)&&(frequency_tx < VHF_MAX)) || \ - ((frequency_rx >= UHF_MIN)&&(frequency_rx < UHF_MAX)) || ((frequency_tx >= UHF_MIN)&&(frequency_tx < UHF_MAX)) ) ) + if( !( ((frequency_rx >= VHF1_MIN)&&(frequency_rx < VHF1_MAX)) || ((frequency_tx >= VHF1_MIN)&&(frequency_tx < VHF1_MAX)) || \ + ((frequency_rx >= UHF1_MIN)&&(frequency_rx < UHF1_MAX)) || ((frequency_tx >= UHF1_MIN)&&(frequency_tx < UHF1_MAX)) || \ + ((frequency_rx >= VHF2_MIN)&&(frequency_rx < VHF2_MAX)) || ((frequency_tx >= VHF2_MIN)&&(frequency_tx < VHF2_MAX)) || \ + ((frequency_rx >= UHF2_MIN)&&(frequency_rx < UHF2_MAX)) || ((frequency_tx >= UHF2_MIN)&&(frequency_tx < UHF2_MAX)) ) ) return 4U; m_frequency_rx = frequency_rx; diff --git a/IO.h b/IO.h index 788c2c4..cd5b67f 100644 --- a/IO.h +++ b/IO.h @@ -26,10 +26,14 @@ #define LOW 0 #define HIGH 1 -#define VHF_MIN 144000000 -#define VHF_MAX 148000000 -#define UHF_MIN 430000000 -#define UHF_MAX 450000000 +#define VHF1_MIN 144000000 +#define VHF1_MAX 148000000 +#define VHF2_MIN 219000000 +#define VHF2_MAX 225000000 +#define UHF1_MIN 420000000 +#define UHF1_MAX 450000000 +#define UHF2_MIN 902000000 +#define UHF2_MAX 928000000 extern uint32_t m_frequency_rx; extern uint32_t m_frequency_tx;