From a570b43f19c9f6958ec476c58688eddde5880d58 Mon Sep 17 00:00:00 2001 From: Andy CA6JAU Date: Sat, 12 Aug 2017 17:02:31 -0400 Subject: [PATCH] Adding 12.5 kHz IF filtering for D-Star and P25, and IF fine auto-calibration --- ADF7021.cpp | 36 ++++++++++++++++++++++-------------- IO.h | 2 +- IOArduino.cpp | 4 ++-- IOSTM.cpp | 4 ++-- 4 files changed, 27 insertions(+), 19 deletions(-) diff --git a/ADF7021.cpp b/ADF7021.cpp index 268ee75..50c51a7 100644 --- a/ADF7021.cpp +++ b/ADF7021.cpp @@ -288,7 +288,7 @@ void CIO::ifConf(MMDVM_STATE modemState, bool reset) ADF7021_REG4 |= (uint32_t) 0b10 << 8; ADF7021_REG4 |= (uint32_t) ADF7021_DISC_BW_DSTAR << 10; // Disc BW ADF7021_REG4 |= (uint32_t) ADF7021_POST_BW_DSTAR << 20; // Post dem BW - ADF7021_REG4 |= (uint32_t) 0b10 << 30; // IF filter + ADF7021_REG4 |= (uint32_t) 0b00 << 30; // IF filter (12.5 kHz) ADF7021_REG13 = (uint32_t) 0b1101 << 0; // register 13 ADF7021_REG13 |= (uint32_t) ADF7021_SLICER_TH_DSTAR << 4; // slicer threshold @@ -311,7 +311,7 @@ void CIO::ifConf(MMDVM_STATE modemState, bool reset) ADF7021_REG4 |= (uint32_t) 0b11 << 8; ADF7021_REG4 |= (uint32_t) ADF7021_DISC_BW_DMR << 10; // Disc BW ADF7021_REG4 |= (uint32_t) ADF7021_POST_BW_DMR << 20; // Post dem BW - ADF7021_REG4 |= (uint32_t) 0b10 << 30; // IF filter + ADF7021_REG4 |= (uint32_t) 0b10 << 30; // IF filter (25 kHz) ADF7021_REG13 = (uint32_t) 0b1101 << 0; // register 13 ADF7021_REG13 |= (uint32_t) ADF7021_SLICER_TH_DMR << 4; // slicer threshold @@ -338,7 +338,7 @@ void CIO::ifConf(MMDVM_STATE modemState, bool reset) ADF7021_REG4 |= (uint32_t) 0b11 << 8; ADF7021_REG4 |= (uint32_t) (m_LoDevYSF ? ADF7021_DISC_BW_YSF_L : ADF7021_DISC_BW_YSF_H) << 10; // Disc BW ADF7021_REG4 |= (uint32_t) ADF7021_POST_BW_YSF << 20; // Post dem BW - ADF7021_REG4 |= (uint32_t) 0b10 << 30; // IF filter + ADF7021_REG4 |= (uint32_t) 0b10 << 30; // IF filter (25 kHz) ADF7021_REG13 = (uint32_t) 0b1101 << 0; // register 13 ADF7021_REG13 |= (uint32_t) (m_LoDevYSF ? ADF7021_SLICER_TH_YSF_L : ADF7021_SLICER_TH_YSF_H) << 4; // slicer threshold @@ -365,7 +365,7 @@ void CIO::ifConf(MMDVM_STATE modemState, bool reset) ADF7021_REG4 |= (uint32_t) 0b11 << 8; ADF7021_REG4 |= (uint32_t) ADF7021_DISC_BW_P25 << 10; // Disc BW ADF7021_REG4 |= (uint32_t) ADF7021_POST_BW_P25 << 20; // Post dem BW - ADF7021_REG4 |= (uint32_t) 0b10 << 30; // IF filter + ADF7021_REG4 |= (uint32_t) 0b00 << 30; // IF filter (12.5 kHz) ADF7021_REG13 = (uint32_t) 0b1101 << 0; // register 13 ADF7021_REG13 |= (uint32_t) ADF7021_SLICER_TH_P25 << 4; // slicer threshold @@ -394,13 +394,17 @@ void CIO::ifConf(MMDVM_STATE modemState, bool reset) // DEMOD (4) AD7021_control_word = ADF7021_REG4; Send_AD7021_control(); + + // IF fine cal (6) + AD7021_control_word = ADF7021_REG6; + Send_AD7021_control(); - // IF FILTER (5) + // IF coarse cal (5) AD7021_control_word = ADF7021_REG5; Send_AD7021_control(); - // Delay for coarse IF filter calibration - delay_ifcal_coarse(); + // Delay for filter calibration + delay_IFcal(); // Frequency RX (0) setRX(); @@ -481,7 +485,7 @@ void CIO::ifConf2(MMDVM_STATE modemState) ADF7021_REG4 |= (uint32_t) 0b10 << 8; ADF7021_REG4 |= (uint32_t) ADF7021_DISC_BW_DSTAR << 10; // Disc BW ADF7021_REG4 |= (uint32_t) ADF7021_POST_BW_DSTAR << 20; // Post dem BW - ADF7021_REG4 |= (uint32_t) 0b10 << 30; // IF filter + ADF7021_REG4 |= (uint32_t) 0b00 << 30; // IF filter (12.5 kHz) ADF7021_REG13 = (uint32_t) 0b1101 << 0; // register 13 ADF7021_REG13 |= (uint32_t) ADF7021_SLICER_TH_DSTAR << 4; // slicer threshold @@ -504,7 +508,7 @@ void CIO::ifConf2(MMDVM_STATE modemState) ADF7021_REG4 |= (uint32_t) 0b11 << 8; ADF7021_REG4 |= (uint32_t) ADF7021_DISC_BW_DMR << 10; // Disc BW ADF7021_REG4 |= (uint32_t) ADF7021_POST_BW_DMR << 20; // Post dem BW - ADF7021_REG4 |= (uint32_t) 0b10 << 30; // IF filter + ADF7021_REG4 |= (uint32_t) 0b10 << 30; // IF filter (25 kHz) ADF7021_REG13 = (uint32_t) 0b1101 << 0; // register 13 ADF7021_REG13 |= (uint32_t) ADF7021_SLICER_TH_DMR << 4; // slicer threshold @@ -527,7 +531,7 @@ void CIO::ifConf2(MMDVM_STATE modemState) ADF7021_REG4 |= (uint32_t) 0b11 << 8; ADF7021_REG4 |= (uint32_t) (m_LoDevYSF ? ADF7021_DISC_BW_YSF_L : ADF7021_DISC_BW_YSF_H) << 10; // Disc BW ADF7021_REG4 |= (uint32_t) ADF7021_POST_BW_YSF << 20; // Post dem BW - ADF7021_REG4 |= (uint32_t) 0b10 << 30; // IF filter + ADF7021_REG4 |= (uint32_t) 0b10 << 30; // IF filter (25 kHz) ADF7021_REG13 = (uint32_t) 0b1101 << 0; // register 13 ADF7021_REG13 |= (uint32_t) (m_LoDevYSF ? ADF7021_SLICER_TH_YSF_L : ADF7021_SLICER_TH_YSF_H) << 4; // slicer threshold @@ -550,7 +554,7 @@ void CIO::ifConf2(MMDVM_STATE modemState) ADF7021_REG4 |= (uint32_t) 0b11 << 8; ADF7021_REG4 |= (uint32_t) ADF7021_DISC_BW_P25 << 10; // Disc BW ADF7021_REG4 |= (uint32_t) ADF7021_POST_BW_P25 << 20; // Post dem BW - ADF7021_REG4 |= (uint32_t) 0b10 << 30; // IF filter + ADF7021_REG4 |= (uint32_t) 0b00 << 30; // IF filter (12.5 kHz) ADF7021_REG13 = (uint32_t) 0b1101 << 0; // register 13 ADF7021_REG13 |= (uint32_t) ADF7021_SLICER_TH_P25 << 4; // slicer threshold @@ -576,12 +580,16 @@ void CIO::ifConf2(MMDVM_STATE modemState) AD7021_control_word = ADF7021_REG4; Send_AD7021_control2(); - // IF FILTER (5) + // IF fine cal (6) + AD7021_control_word = ADF7021_REG6; + Send_AD7021_control(); + + // IF coarse cal (5) AD7021_control_word = ADF7021_REG5; - Send_AD7021_control2(); + Send_AD7021_control(); // Delay for coarse IF filter calibration - delay_ifcal_coarse(); + delay_IFcal(); // Frequency RX (0) and set to RX only AD7021_control_word = ADF7021_RX_REG0; diff --git a/IO.h b/IO.h index b79348b..429fd1f 100644 --- a/IO.h +++ b/IO.h @@ -113,7 +113,7 @@ public: // Misc functions void dlybit(void); - void delay_ifcal_coarse(void); + void delay_IFcal(void); void delay_reset(void); void delay_us(uint32_t us); diff --git a/IOArduino.cpp b/IOArduino.cpp index 0ee64cd..e8aa67f 100644 --- a/IOArduino.cpp +++ b/IOArduino.cpp @@ -132,8 +132,8 @@ extern "C" { } #endif -void CIO::delay_ifcal_coarse() { - delayMicroseconds(300); +void CIO::delay_IFcal() { + delayMicroseconds(10000); } void CIO::delay_reset() { diff --git a/IOSTM.cpp b/IOSTM.cpp index 15ee353..e99f583 100644 --- a/IOSTM.cpp +++ b/IOSTM.cpp @@ -658,8 +658,8 @@ static inline void delay_us(uint32_t us) { : "r0"); } -void CIO::delay_ifcal_coarse() { - delay_us(300); +void CIO::delay_IFcal() { + delay_us(10000); } void CIO::delay_reset() {