From f5be40fe5bd6170287e31acd1b1ee12536affe98 Mon Sep 17 00:00:00 2001 From: Michael Ossmann Date: Wed, 12 Mar 2014 12:40:45 -0600 Subject: [PATCH] fixed tuning bug --- firmware/common/rffc5071.c | 10 ++++++---- firmware/common/tuning.c | 20 ++------------------ 2 files changed, 8 insertions(+), 22 deletions(-) diff --git a/firmware/common/rffc5071.c b/firmware/common/rffc5071.c index 74de7b4e..d39337ea 100644 --- a/firmware/common/rffc5071.c +++ b/firmware/common/rffc5071.c @@ -406,6 +406,7 @@ void rffc5071_enable(void) { #define LO_MAX 5400 #define REF_FREQ 50 +#define FREQ_ONE_MHZ (1000*1000) /* configure frequency synthesizer in integer mode (lo in MHz) */ uint64_t rffc5071_config_synth_int(uint16_t lo) { @@ -422,7 +423,7 @@ uint64_t rffc5071_config_synth_int(uint16_t lo) { /* Calculate n_lo */ uint8_t n_lo = 0; uint16_t x = LO_MAX / lo; - while (x > 1) { + while ((x > 1) && (n_lo < 5)) { n_lo++; x >>= 1; } @@ -445,13 +446,14 @@ uint64_t rffc5071_config_synth_int(uint16_t lo) { uint64_t tmp_n = ((uint64_t)fvco << 29ULL) / (fbkdiv*REF_FREQ) ; n = tmp_n >> 29ULL; + p1nmsb = (tmp_n >> 13ULL) & 0xffff; p1nlsb = (tmp_n >> 5ULL) & 0xff; - //~ tune_freq = REF_FREQ*tmp_n*fbkdiv/lodiv / (1 << 29); - tune_freq_hz = REF_FREQ*tmp_n*fbkdiv/lodiv * 1000*1000 / (1 << 29ULL); + tune_freq_hz = (REF_FREQ * (tmp_n >> 5ULL) * fbkdiv * FREQ_ONE_MHZ) + / (lodiv * (1 << 24ULL)); LOG("# lo=%d n_lo=%d lodiv=%d fvco=%d fbkdiv=%d n=%d tune_freq_hz=%d\n", - lo, n_lo, lodiv, fvco, fbkdiv, n, tune_freq); + lo, n_lo, lodiv, fvco, fbkdiv, n, tune_freq); /* Path 1 */ set_RFFC5071_P1LODIV(n_lo); diff --git a/firmware/common/tuning.c b/firmware/common/tuning.c index 6d2ddb9c..9651e8ae 100644 --- a/firmware/common/tuning.c +++ b/firmware/common/tuning.c @@ -70,15 +70,7 @@ bool set_freq(const uint64_t freq) RFFC5071_freq_mhz = (max2837_freq_nominal_hz / FREQ_ONE_MHZ) - freq_mhz; /* Set Freq and read real freq */ real_RFFC5071_freq_hz = rffc5071_set_frequency(RFFC5071_freq_mhz); - if(real_RFFC5071_freq_hz < RFFC5071_freq_mhz * FREQ_ONE_MHZ) - { - tmp_hz = -(RFFC5071_freq_mhz * FREQ_ONE_MHZ - real_RFFC5071_freq_hz); - }else - { - tmp_hz = (real_RFFC5071_freq_hz - RFFC5071_freq_mhz * FREQ_ONE_MHZ); - } - MAX2837_freq_hz = max2837_freq_nominal_hz + tmp_hz + freq_hz; - max2837_set_frequency(MAX2837_freq_hz); + max2837_set_frequency(freq + real_RFFC5071_freq_hz); }else if( (freq_mhz >= MIN_BYPASS_FREQ_MHZ) && (freq_mhz < MAX_BYPASS_FREQ_MHZ) ) { rf_path_set_filter(RF_PATH_FILTER_BYPASS); @@ -101,15 +93,7 @@ bool set_freq(const uint64_t freq) RFFC5071_freq_mhz = freq_mhz - (max2837_freq_nominal_hz / FREQ_ONE_MHZ); /* Set Freq and read real freq */ real_RFFC5071_freq_hz = rffc5071_set_frequency(RFFC5071_freq_mhz); - if(real_RFFC5071_freq_hz < RFFC5071_freq_mhz * FREQ_ONE_MHZ) - { - tmp_hz = (RFFC5071_freq_mhz * FREQ_ONE_MHZ - real_RFFC5071_freq_hz); - }else - { - tmp_hz = -(real_RFFC5071_freq_hz - RFFC5071_freq_mhz * FREQ_ONE_MHZ); - } - MAX2837_freq_hz = max2837_freq_nominal_hz + tmp_hz + freq_hz; - max2837_set_frequency(MAX2837_freq_hz); + max2837_set_frequency(freq - real_RFFC5071_freq_hz); }else { /* Error freq_mhz too high */