Przeglądaj źródła

Создал структуру vco_params для хранения параметров lmx2594. Создал методы для расчёта и отправки этих параметров

Anatoliy Chigirinskiy 1 rok temu
rodzic
commit
e35a5f7837
2 zmienionych plików z 170 dodań i 289 usunięć
  1. 148 289
      Devices/lmx2594.c
  2. 22 0
      Devices/lmx2594.h

+ 148 - 289
Devices/lmx2594.c

@@ -2,6 +2,148 @@
 #include <math.h>
 
 
+struct vco_params calculate_vco_params (double lmx_freq, double f_pd) {
+    struct vco_params params;
+
+      if (lmx_freq >= 7500e6 && lmx_freq <= 8600e6) {
+        params.vco_core = 1;
+        params.f_coremin = 7500e6;
+        params.f_coremax = 8600e6;
+        params.c_core_min = 164;
+        params.c_core_max = 12;
+        params.a_core_min = 299;
+        params.a_core_max = 240;
+    }
+    else if (lmx_freq > 8600e6 && lmx_freq < 9800e6) {
+        params.vco_core = 2;
+        params.f_coremin = 8600e6;
+        params.f_coremax = 9800e6;
+        params.c_core_min = 165;
+        params.c_core_max = 16;
+        params.a_core_min = 356;
+        params.a_core_max = 247;
+    }
+    else if (lmx_freq >= 9800e6 && lmx_freq <= 10800e6) {
+        params.vco_core = 3;
+        params.f_coremin = 9800e6;
+        params.f_coremax = 10800e6;
+        params.c_core_min = 158;
+        params.c_core_max = 19;
+        params.a_core_min = 324;
+        params.a_core_max = 224;
+    }
+    else if (lmx_freq > 10800e6 && lmx_freq <= 12000e6) {
+        params.vco_core = 4;
+        params.f_coremin = 10800e6;
+        params.f_coremax = 12000e6;
+        params.c_core_min = 140;
+        params.c_core_max = 0;
+        params.a_core_min = 383;
+        params.a_core_max = 244;
+    }
+    else if (lmx_freq > 12000e6 && lmx_freq <= 12900e6) {
+        params.vco_core = 5;
+        params.f_coremin = 12000e6;
+        params.f_coremax = 12900e6;
+        params.c_core_min = 183;
+        params.c_core_max = 36;
+        params.a_core_min = 205;
+        params.a_core_max = 146;
+    }
+    else if (lmx_freq > 12900e6 && lmx_freq <= 13900e6) {
+        params.vco_core = 6;
+        params.f_coremin = 12900e6;
+        params.f_coremax = 13900e6;
+        params.c_core_min = 155;
+        params.c_core_max = 6;
+        params.a_core_min = 242;
+        params.a_core_max = 163;
+    }
+    else if (lmx_freq > 13900e6 && lmx_freq <= 15000e6) {
+        params.vco_core = 7;
+        params.f_coremin = 13900e6;
+        params.f_coremax = 15000e6;
+        params.c_core_min = 175;
+        params.c_core_max = 19;
+        params.a_core_min = 323;
+        params.a_core_max = 244;
+    }
+
+    if (lmx_freq >=11900e6 && lmx_freq <=12100e6) {
+        params.vco_daciset_strt = 300;
+        params.vco_core = 4;
+        params.vco_cap_ctrl_strt = 1;
+    }
+
+    params.vco_cap_ctrl_strt = round(params.c_core_min - (params.c_core_min - params.c_core_max) * (lmx_freq - params.f_coremin) / (params.f_coremax - params.f_coremin));
+    params.vco_daciset_strt = round(params.a_core_min + (params.a_core_min - params.a_core_max) * (lmx_freq - params.f_coremin) / (params.f_coremax - params.f_coremin));
+
+    if (lmx_freq <= 12500e6) {
+        params.pfd_dly_sel = 1;
+    }
+    else if (lmx_freq > 12500e6) {
+        params.pfd_dly_sel = 2;
+    }
+
+    if (f_pd <= 100e6) {
+        params.fcal_hpfd_adj = ENUM_LMX2594_R0_FCAL_HPFD_ADJ_LESS100MHZ;
+    }
+    else if (f_pd > 100e6 && f_pd <= 150e6) {
+        params.fcal_hpfd_adj = ENUM_LMX2594_R0_FCAL_HPFD_ADJ_100_150MHZ;
+    }
+    else if (f_pd > 150e6 && f_pd <= 200e6) {
+        params.fcal_hpfd_adj = ENUM_LMX2594_R0_FCAL_HPFD_ADJ_150_200MHZ;
+    }
+    else if (f_pd > 200e6) {
+        params.fcal_hpfd_adj = ENUM_LMX2594_R0_FCAL_HPFD_ADJ_MORE200MHZ;
+    }
+
+    // SET the CAL_CLK_DIV value
+    if (f_pd <= 200e6 ) {
+        params.cal_clk_div = ENUM_LMX2594_R1_CAL_CLK_DIV1;
+    }
+    else if (f_pd > 200e6 && f_pd <= 400e6) {
+        params.cal_clk_div = ENUM_LMX2594_R1_CAL_CLK_DIV2;
+    }
+    else if (f_pd > 400e6 && f_pd < 800e6) {
+        params.cal_clk_div = ENUM_LMX2594_R1_CAL_CLK_DIV4;
+    }
+
+    // Calculate the ACAL_CMP_DLY
+    double Fsmclk = f_pd/(pow(2,params.cal_clk_div));
+    params.acal_cmp_dly = (uint8_t) ((uint64_t)round((Fsmclk)/10e6)); 
+    return params;
+}
+
+void set_vco_params (struct vco_params *params) {
+    // Set the VCO_CORE
+    lmx2594regs[112 - VCO_SEL] = lmx2594regs[112 - VCO_SEL] & (~BITM_LMX2594_R20_VCO_SEL);
+    lmx2594regs[112 - VCO_SEL] = lmx2594regs[112 - VCO_SEL] | (params->vco_core << BITP_LMX2594_R20_VCO_SEL);
+    // Set the VCO_CAP_CTRL_START
+    lmx2594regs[112 - CAP_CTRL_START] = lmx2594regs[112 - CAP_CTRL_START] & (~BITM_LMX2594_R78_VCO_CAP_CTRL_START);
+    lmx2594regs[112 - CAP_CTRL_START] = lmx2594regs[112 - CAP_CTRL_START] | (params->vco_cap_ctrl_strt << BITP_LMX2594_R78_VCO_CAP_CTRL_START);
+    // Set the VCO_DACISET
+    lmx2594regs[112 - VCO_DACISET] = lmx2594regs[112 - VCO_DACISET] & (~BITM_LMX2594_R17_VCO_DACISET);
+    lmx2594regs[112 - VCO_DACISET] = lmx2594regs[112 - VCO_DACISET] | (params->vco_daciset_strt << BITP_LMX2594_R17_VCO_DACISET);
+    
+    // Set PFD_DLY_SEL 
+    lmx2594regs[112-PFD_DLY_SEL] = lmx2594regs[112-PFD_DLY_SEL] & (~BITM_LMX2594_R37_PFD_DLY_SEL);
+    lmx2594regs[112-PFD_DLY_SEL] = lmx2594regs[112-PFD_DLY_SEL] | (params->pfd_dly_sel << BITP_LMX2594_R37_PFD_DLY_SEL);
+
+    // Set the FCAL_HPFD_ADJ
+    lmx2594regs[112-FCAL_ADDR] = lmx2594regs[112-FCAL_ADDR] & (~BITM_LMX2594_RO_FCAL_HPFD_ADJ);
+    lmx2594regs[112-FCAL_ADDR] = lmx2594regs[112-FCAL_ADDR] | params->fcal_hpfd_adj;
+
+    // SET the CAL_CLK_DIV value
+    lmx2594regs[112-R1_ADDR] = lmx2594regs[112-R1_ADDR] & (~BITM_LMX2594_R1_CAL_CLK_DIV);
+    lmx2594regs[112-R1_ADDR] = lmx2594regs[112-R1_ADDR] | params->cal_clk_div;
+
+    // Set the ACAL_CMP_DLY value
+    lmx2594regs[112-R4_ADDR] = lmx2594regs[112-R4_ADDR] & (~BITM_LMX2594_R4_ACAL_CMP_DLY);
+    lmx2594regs[112-R4_ADDR] = lmx2594regs[112-R4_ADDR] | (params->acal_cmp_dly << BITP_LMX2594_R4_ACAL_CMP_DLY);
+
+}
+
 const uint32_t lmx2594_rst[] = {
         0x002516,
         0x002514
@@ -169,149 +311,11 @@ int lmx_freq_set_main_band_int_mode(void *bar1, double lmx_freq, double f_pd) {
         }
     };
 
-    int vco_core;
-    double f_coremin;
-    double f_coremax;
-    int c_core_min;
-    int c_core_max;
-    int a_core_min;
-    int a_core_max;
-    uint16_t vco_cap_ctrl_strt;
-    uint16_t vco_daciset_strt;
-
     // Partial assist for the calibration
+    struct vco_params params = calculate_vco_params(lmx_freq, f_pd);
 
-    //Determine a VCO core and other parameters
-
-    if (lmx_freq >= 7500e6 && lmx_freq <= 8600e6) {
-        vco_core = 1;
-        f_coremin = 7500e6;
-        f_coremax = 8600e6;
-        c_core_min = 164;
-        c_core_max = 12;
-        a_core_min = 299;
-        a_core_max = 240;
-    }
-    else if (lmx_freq > 8600e6 && lmx_freq < 9800e6) {
-        vco_core = 2;
-        f_coremin = 8600e6;
-        f_coremax = 9800e6;
-        c_core_min = 165;
-        c_core_max = 16;
-        a_core_min = 356;
-        a_core_max = 247;
-    }
-    else if (lmx_freq >= 9800e6 && lmx_freq <= 10800e6) {
-        vco_core = 3;
-        f_coremin = 9800e6;
-        f_coremax = 10800e6;
-        c_core_min = 158;
-        c_core_max = 19;
-        a_core_min = 324;
-        a_core_max = 224;
-    }
-    else if (lmx_freq > 10800e6 && lmx_freq <= 12000e6) {
-        vco_core = 4;
-        f_coremin = 10800e6;
-        f_coremax = 12000e6;
-        c_core_min = 140;
-        c_core_max = 0;
-        a_core_min = 383;
-        a_core_max = 244;
-    }
-    else if (lmx_freq > 12000e6 && lmx_freq <= 12900e6) {
-        vco_core = 5;
-        f_coremin = 12000e6;
-        f_coremax = 12900e6;
-        c_core_min = 183;
-        c_core_max = 36;
-        a_core_min = 205;
-        a_core_max = 146;
-    }
-    else if (lmx_freq > 12900e6 && lmx_freq <= 13900e6) {
-        vco_core = 6;
-        f_coremin = 12900e6;
-        f_coremax = 13900e6;
-        c_core_min = 155;
-        c_core_max = 6;
-        a_core_min = 242;
-        a_core_max = 163;
-    }
-    else if (lmx_freq > 13900e6 && lmx_freq <= 15000e6) {
-        vco_core = 7;
-        f_coremin = 13900e6;
-        f_coremax = 15000e6;
-        c_core_min = 175;
-        c_core_max = 19;
-        a_core_min = 323;
-        a_core_max = 244;
-    };
-    if (lmx_freq >=11900e6 && lmx_freq <=12100e6) {
-        vco_daciset_strt = 300;
-        vco_core = 4;
-        vco_cap_ctrl_strt = 1;
-    }
-    vco_cap_ctrl_strt = round(c_core_min - (c_core_min - c_core_max) * (lmx_freq - f_coremin) / (f_coremax - f_coremin));
-    vco_daciset_strt = round(a_core_min + (a_core_min - a_core_max) * (lmx_freq - f_coremin) / (f_coremax - f_coremin));
-    //Set the VCO_CORE 
-    lmx2594regs[112 - VCO_SEL] = lmx2594regs[112 - VCO_SEL] & (~BITM_LMX2594_R20_VCO_SEL);
-    lmx2594regs[112 - VCO_SEL] = lmx2594regs[112 - VCO_SEL] | (vco_core << BITP_LMX2594_R20_VCO_SEL);
-    // Set the VCO_CAP_CTRL
-    lmx2594regs[112 - CAP_CTRL_START] = lmx2594regs[112 - CAP_CTRL_START] & (~BITM_LMX2594_R78_VCO_CAP_CTRL_START);
-    lmx2594regs[112 - CAP_CTRL_START] = lmx2594regs[112 - CAP_CTRL_START] | (vco_cap_ctrl_strt << BITP_LMX2594_R78_VCO_CAP_CTRL_START);
-    // Set the VCO_DACISET
-    lmx2594regs[112 - VCO_DACISET] = lmx2594regs[112 - VCO_DACISET] & (~BITM_LMX2594_R17_VCO_DACISET);
-    lmx2594regs[112 - VCO_DACISET] = lmx2594regs[112 - VCO_DACISET] | (vco_daciset_strt << BITP_LMX2594_R17_VCO_DACISET);
-
-    // Set the PF_DLY_SEL
-    if (lmx_freq <= 12500e6) {
-        lmx2594regs[112-PFD_DLY_SEL] = lmx2594regs[112-PFD_DLY_SEL] & (~BITM_LMX2594_R37_PFD_DLY_SEL);
-        lmx2594regs[112-PFD_DLY_SEL] = lmx2594regs[112-PFD_DLY_SEL] | (0x1 << BITP_LMX2594_R37_PFD_DLY_SEL);
-    }
-    else if (lmx_freq > 12500e6) {
-        lmx2594regs[112-PFD_DLY_SEL] = lmx2594regs[112-PFD_DLY_SEL] & (~BITM_LMX2594_R37_PFD_DLY_SEL);
-        lmx2594regs[112-PFD_DLY_SEL] = lmx2594regs[112-PFD_DLY_SEL] | (0x2 << BITP_LMX2594_R37_PFD_DLY_SEL);
-    };
-    int cal_clk_div;
-    //SET the FCAL_HPFD_ADJ
-    if (f_pd <= 100e6) {
-        lmx2594regs[112-FCAL_ADDR] = lmx2594regs[112-FCAL_ADDR] & (~BITM_LMX2594_RO_FCAL_HPFD_ADJ);
-        lmx2594regs[112-FCAL_ADDR] = lmx2594regs[112-FCAL_ADDR] | ENUM_LMX2594_R0_FCAL_HPFD_ADJ_LESS100MHZ;
-    }
-    else if (f_pd > 100e6 && f_pd <= 150e6) {
-        lmx2594regs[112-FCAL_ADDR] = lmx2594regs[112-FCAL_ADDR] & (~BITM_LMX2594_RO_FCAL_HPFD_ADJ);
-        lmx2594regs[112-FCAL_ADDR] = lmx2594regs[112-FCAL_ADDR] | ENUM_LMX2594_R0_FCAL_HPFD_ADJ_100_150MHZ;
-    }
-    else if (f_pd > 150e6 && f_pd <= 200e6) {
-        lmx2594regs[112-FCAL_ADDR] = lmx2594regs[112-FCAL_ADDR] & (~BITM_LMX2594_RO_FCAL_HPFD_ADJ);
-        lmx2594regs[112-FCAL_ADDR] = lmx2594regs[112-FCAL_ADDR] | ENUM_LMX2594_R0_FCAL_HPFD_ADJ_150_200MHZ;
-    }
-    else if (f_pd > 200e6) {
-        lmx2594regs[112-FCAL_ADDR] = lmx2594regs[112-FCAL_ADDR] & (~BITM_LMX2594_RO_FCAL_HPFD_ADJ);
-        lmx2594regs[112-FCAL_ADDR] = lmx2594regs[112-FCAL_ADDR] | ENUM_LMX2594_R0_FCAL_HPFD_ADJ_MORE200MHZ;
-    }
-    // SET the CAL_CLK_DIV value 
-    if (f_pd <= 200e6 ) {
-        lmx2594regs[112-R1_ADDR] = lmx2594regs[112-R1_ADDR] & (~BITM_LMX2594_R1_CAL_CLK_DIV);
-        lmx2594regs[112-R1_ADDR] = lmx2594regs[112-R1_ADDR] | ENUM_LMX2594_R1_CAL_CLK_DIV1;
-        cal_clk_div = 0;
-    }
-    else if (f_pd > 200e6 && f_pd <= 400e6) {
-        lmx2594regs[112-R1_ADDR] = lmx2594regs[112-R1_ADDR] & (~BITM_LMX2594_R1_CAL_CLK_DIV);
-        lmx2594regs[112-R1_ADDR] = lmx2594regs[112-R1_ADDR] | ENUM_LMX2594_R1_CAL_CLK_DIV2;
-        cal_clk_div = 1;
-    }
-    else if (f_pd > 400e6 && f_pd < 800e6) {
-         lmx2594regs[112-R1_ADDR] = lmx2594regs[112-R1_ADDR] & (~BITM_LMX2594_R1_CAL_CLK_DIV);
-        lmx2594regs[112-R1_ADDR] = lmx2594regs[112-R1_ADDR] | ENUM_LMX2594_R1_CAL_CLK_DIV4;
-        cal_clk_div = 2;
-    };
-    //Calculate the ACAL_CMP_DLY
-    double Fsmclk = f_pd/(pow(2,cal_clk_div));
-    uint8_t acal_cmp_dly = (uint8_t) ((uint64_t)round((Fsmclk)/10e6));
-    //Set the ACAL_CMP_DLY value
-    lmx2594regs[112-R4_ADDR] = lmx2594regs[112-R4_ADDR] &(~BITM_LMX2594_R4_ACAL_CMP_DLY);
-    lmx2594regs[112-R4_ADDR]  = lmx2594regs[112-R4_ADDR] | (acal_cmp_dly << BITP_LMX2594_R4_ACAL_CMP_DLY);
+    // Set the vco params
+    set_vco_params(&params);
     // SET the N_DIV
     lmx2594regs[112-PLL_N_S] = lmx2594regs[112-PLL_N_S] &(~0xFFFF);
     lmx2594regs[112-PLL_N_S] = lmx2594regs[112-PLL_N_S] | (N >> 16);
@@ -322,7 +326,6 @@ int lmx_freq_set_main_band_int_mode(void *bar1, double lmx_freq, double f_pd) {
     // Clear the SEG1_EN bit
     lmx2594regs[112-CHDIV_DIV2] = lmx2594regs[112 - CHDIV_DIV2] & (~BITM_LMX2594_R31_CHDIV_DIV2);
     // Set the OUTA_MUX to channel divider R45[12:11]; 0 - Channel divider, 1 - VCO;
-    // Removed unnecessary commented-out LMX_HEADER definition
     lmx2594regs[112 - OUTA_MUX] = lmx2594regs[112 - OUTA_MUX] | ENUM_LMX2594_R45_OUTA_MUX_VCO;
        // Program the FCAL_EN bit
     lmx2594regs[112-FCAL_ADDR] = lmx2594regs[112-FCAL_ADDR] & (~BITM_LMX2594_R0_FCAL);   
@@ -341,8 +344,6 @@ int lmx_freq_set_main_band_int_mode(void *bar1, double lmx_freq, double f_pd) {
             lmx2594regs[112 - OUTA_MUX],
             lmx2594regs[112-FCAL_ADDR]
     };
-    // Create a header for the LMX2594 with the appropriate number of words
-    // uint32_t LMX_HEADER = ((0 << 23) | (DeviceIdLmx2594 << 18) | ((sizeof(lmx_change_freq_regs)/4) << 1) | 1);
      // Create a header for the LMX2594 with the appropriate number of words MOSI 4
     uint32_t LMX_HEADER = ((0x1<< 23) | ((sizeof(lmx_change_freq_regs) / 4) << BITP_LMX2594_4MOSI_HEADER) | 1);
     uint32_t *ptr = bar1 + LMX_BASE_ADDR;
@@ -361,16 +362,6 @@ int lmx_freq_set_out_of_band_int_mode(void *bar1, double lmx_freq, double f_pd)
     uint8_t ch_div_reg = 0; // 2
     double vco_div = 7.5e9 / lmx_freq;
 
-    int vco_core;
-    double f_coremin;
-    double f_coremax;
-    int c_core_min;
-    int c_core_max;
-    int a_core_min;
-    int a_core_max;
-    uint16_t vco_cap_ctrl_strt;
-    uint16_t vco_daciset_strt;
-
     // minimum N_div value is 28 and Vco frequency can't be less than 7.5 GHz
     if (f_vco < 7.5e9) {
         if (vco_div > 2 && vco_div <= 4) {
@@ -516,141 +507,9 @@ int lmx_freq_set_out_of_band_int_mode(void *bar1, double lmx_freq, double f_pd)
     };
     // Partial assist for the calibration
 
-    //Determine a VCO core and other parameters
-
-    if (f_vco >= 7500e6 && f_vco <= 8600e6) {
-        vco_core = 1;
-        f_coremin = 7500e6;
-        f_coremax = 8600e6;
-        c_core_min = 164;
-        c_core_max = 12;
-        a_core_min = 299;
-        a_core_max = 240;
-    }
-    else if (f_vco > 8600e6 && f_vco < 9800e6) {
-        vco_core = 2;
-        f_coremin = 8600e6;
-        f_coremax = 9800e6;
-        c_core_min = 165;
-        c_core_max = 16;
-        a_core_min = 356;
-        a_core_max = 247;
-    }
-    else if (f_vco >= 9800e6 && f_vco <= 10800e6) {
-        vco_core = 3;
-        f_coremin = 9800e6;
-        f_coremax = 10800e6;
-        c_core_min = 158;
-        c_core_max = 19;
-        a_core_min = 324;
-        a_core_max = 224;
-    }
-    else if (f_vco > 10800e6 && f_vco <= 12000e6) {
-        vco_core = 4;
-        f_coremin = 10800e6;
-        f_coremax = 12000e6;
-        c_core_min = 140;
-        c_core_max = 0;
-        a_core_min = 383;
-        a_core_max = 244;
-    }
-    else if (f_vco > 12000e6 && f_vco <= 12900e6) {
-        vco_core = 5;
-        f_coremin = 12000e6;
-        f_coremax = 12900e6;
-        c_core_min = 183;
-        c_core_max = 36;
-        a_core_min = 205;
-        a_core_max = 146;
-    }
-    else if (f_vco > 12900e6 && f_vco <= 13900e6) {
-        vco_core = 6;
-        f_coremin = 12900e6;
-        f_coremax = 13900e6;
-        c_core_min = 155;
-        c_core_max = 6;
-        a_core_min = 242;
-        a_core_max = 163;
-    }
-    else if (f_vco > 13900e6 && f_vco <= 15000e6) {
-        vco_core = 7;
-        f_coremin = 13900e6;
-        f_coremax = 15000e6;
-        c_core_min = 175;
-        c_core_max = 19;
-        a_core_min = 323;
-        a_core_max = 244;
-    };
-
-    vco_cap_ctrl_strt = round(c_core_min - (c_core_min - c_core_max) * (f_vco - f_coremin) / (f_coremax - f_coremin));
-    vco_daciset_strt = round(a_core_min + (a_core_min - a_core_max) * (f_vco - f_coremin) / (f_coremax - f_coremin));
-   
-    if (f_vco >=11900e6 && f_vco <=12100e6) {
-        vco_daciset_strt = 300;
-        vco_core = 4;
-        vco_cap_ctrl_strt = 1;
-    }
-    // Calibration assist 
-    //Set the VCO_CORE 
-    lmx2594regs[112 - VCO_SEL] = lmx2594regs[112 - VCO_SEL] & (~BITM_LMX2594_R20_VCO_SEL);
-    lmx2594regs[112 - VCO_SEL] = lmx2594regs[112 - VCO_SEL] | (vco_core << BITP_LMX2594_R20_VCO_SEL);
-    // Set the VCO_CAP_CTRL_START
-    lmx2594regs[112 - CAP_CTRL_START] = lmx2594regs[112 - CAP_CTRL_START] & (~BITM_LMX2594_R78_VCO_CAP_CTRL_START);
-    lmx2594regs[112 - CAP_CTRL_START] = lmx2594regs[112 - CAP_CTRL_START] | (vco_cap_ctrl_strt << BITP_LMX2594_R78_VCO_CAP_CTRL_START);
-    // Set the VCO_DACISET
-    lmx2594regs[112 - VCO_DACISET] = lmx2594regs[112 - VCO_DACISET] & (~BITM_LMX2594_R17_VCO_DACISET);
-    lmx2594regs[112 - VCO_DACISET] = lmx2594regs[112 - VCO_DACISET] | (vco_daciset_strt << BITP_LMX2594_R17_VCO_DACISET);
-
-    // Set the PFD_DLY_SEL to appropriate value
-    if (f_vco <= 12500e6) {
-        lmx2594regs[112-PFD_DLY_SEL] = lmx2594regs[112-PFD_DLY_SEL] & (~BITM_LMX2594_R37_PFD_DLY_SEL);
-        lmx2594regs[112-PFD_DLY_SEL] = lmx2594regs[112-PFD_DLY_SEL] | (0x1 << BITP_LMX2594_R37_PFD_DLY_SEL);
-        // printf("PFD_DLY_SEL = %d\n", 1);
-    }
-    else if (f_vco > 12500e6) {
-        lmx2594regs[112-PFD_DLY_SEL] = lmx2594regs[112-PFD_DLY_SEL] & (~BITM_LMX2594_R37_PFD_DLY_SEL);
-        lmx2594regs[112-PFD_DLY_SEL] = lmx2594regs[112-PFD_DLY_SEL] | (0x2 << BITP_LMX2594_R37_PFD_DLY_SEL);
-        // printf("PFD_DLY_SEL = %d\n", 2);
-    }
-    if (f_pd <= 100e6) {
-        lmx2594regs[112-FCAL_ADDR] = lmx2594regs[112-FCAL_ADDR] & (~BITM_LMX2594_RO_FCAL_HPFD_ADJ);
-        lmx2594regs[112-FCAL_ADDR] = lmx2594regs[112-FCAL_ADDR] | ENUM_LMX2594_R0_FCAL_HPFD_ADJ_LESS100MHZ;
-    }
-    else if (f_pd > 100e6 && f_pd <= 150e6) {
-        lmx2594regs[112-FCAL_ADDR] = lmx2594regs[112-FCAL_ADDR] & (~BITM_LMX2594_RO_FCAL_HPFD_ADJ);
-        lmx2594regs[112-FCAL_ADDR] = lmx2594regs[112-FCAL_ADDR] | ENUM_LMX2594_R0_FCAL_HPFD_ADJ_100_150MHZ;
-    }
-    else if (f_pd > 150e6 && f_pd <= 200e6) {
-        lmx2594regs[112-FCAL_ADDR] = lmx2594regs[112-FCAL_ADDR] & (~BITM_LMX2594_RO_FCAL_HPFD_ADJ);
-        lmx2594regs[112-FCAL_ADDR] = lmx2594regs[112-FCAL_ADDR] | ENUM_LMX2594_R0_FCAL_HPFD_ADJ_150_200MHZ;
-    }
-    else if (f_pd > 200e6) {
-        lmx2594regs[112-FCAL_ADDR] = lmx2594regs[112-FCAL_ADDR] & (~BITM_LMX2594_RO_FCAL_HPFD_ADJ);
-        lmx2594regs[112-FCAL_ADDR] = lmx2594regs[112-FCAL_ADDR] | ENUM_LMX2594_R0_FCAL_HPFD_ADJ_MORE200MHZ;
-    };
-    // SET the CAL_CLK_DIV value 
-    int cal_clk_div;
-    if (f_pd <= 200e6 ) {
-        lmx2594regs[112-R1_ADDR] = lmx2594regs[112-R1_ADDR] & (~BITM_LMX2594_R1_CAL_CLK_DIV);
-        lmx2594regs[112-R1_ADDR] = lmx2594regs[112-R1_ADDR] | ENUM_LMX2594_R1_CAL_CLK_DIV1;
-        cal_clk_div =0;
-    }
-    else if (f_pd > 200e6 && f_pd <= 400e6) {
-        lmx2594regs[112-R1_ADDR] = lmx2594regs[112-R1_ADDR] & (~BITM_LMX2594_R1_CAL_CLK_DIV);
-        lmx2594regs[112-R1_ADDR] = lmx2594regs[112-R1_ADDR] | ENUM_LMX2594_R1_CAL_CLK_DIV2;
-        cal_clk_div =1;
-    }
-    else if (f_pd > 400e6 && f_pd < 800e6) {
-         lmx2594regs[112-R1_ADDR] = lmx2594regs[112-R1_ADDR] & (~BITM_LMX2594_R1_CAL_CLK_DIV);
-        lmx2594regs[112-R1_ADDR] = lmx2594regs[112-R1_ADDR] | ENUM_LMX2594_R1_CAL_CLK_DIV4;
-        cal_clk_div = 2;
-    };
-    //Calculate the ACAL_CMP_DLY
-    double Fsmclk = f_pd/(pow(2,cal_clk_div));
-    uint8_t acal_cmp_dly = (uint8_t) ((uint64_t)round((Fsmclk)/10e6));;
-    //Set the ACAL_CMP_DLY value
-    lmx2594regs[112-R4_ADDR] = lmx2594regs[112-R4_ADDR] &(~BITM_LMX2594_R4_ACAL_CMP_DLY);
-    lmx2594regs[112-R4_ADDR]  = lmx2594regs[112-R4_ADDR] | (acal_cmp_dly << BITP_LMX2594_R4_ACAL_CMP_DLY);
+    struct vco_params params = calculate_vco_params(f_vco, f_pd);
+    // Set the vco params
+    set_vco_params(&params);
     // Set the N value
     lmx2594regs[112-PLL_N_S] = lmx2594regs[112-PLL_N_S] &(~0xFFFF);
     lmx2594regs[112-PLL_N_S] = lmx2594regs[112-PLL_N_S] | (N >> 16);

+ 22 - 0
Devices/lmx2594.h

@@ -7,6 +7,28 @@
 #define     LMX_BASE_ADDR       0x04
 #define     LMX_LD_STATUS_ADDR  0x18
 
+
+struct vco_params {
+    int vco_core;
+    double f_coremin;
+    double f_coremax;
+    int c_core_min;
+    int c_core_max;
+    int a_core_min;
+    int a_core_max;
+    uint16_t vco_cap_ctrl_strt;
+    uint16_t vco_daciset_strt;
+    uint8_t acal_cmp_dly;
+    uint8_t cal_clk_div;
+    uint8_t pfd_dly_sel;
+    uint8_t fcal_hpfd_adj; 
+
+
+};
+
+void set_vco_params (struct vco_params *params);
+struct vco_params calculate_vco_params (double lmx_freq, double f_pd);
+
 void lmx2594_init(void *bar1);
 void auto_cal(void *bar1);