Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of DDRO_Farrari by
Diff: pll.cpp
- Revision:
- 1:6a820a0ca03b
- Parent:
- 0:84a8bcfbdec9
- Child:
- 10:95e9932f7990
--- a/pll.cpp Mon Oct 07 22:58:19 2013 +0000 +++ b/pll.cpp Mon Oct 21 22:36:51 2013 +0000 @@ -25,24 +25,24 @@ pc.printf("RangeB out of 1-32 range\r\n"); } - unsigned long long dco = PLL_REF / prediv * multint_upper * multint; - if(dco < 2500000000 || dco > 5000000000){ - pc.printf("Dco out of 2.5G-5G range\r\n"); + int dco = (PLL_REF / prediv) * multint_upper * multint; + if(dco < 2500000 || dco > 5000000){ + pc.printf("Dco=%d out of 2.5G-5G range\r\n",dco); } - unsigned long long internal = dco / multint_upper; - if(internal < 9800000 || internal > 3200000000){ - //\ pc.printf("Dco out of 9.8M-3.2G range\r\n"); + int internal = dco / multint_upper; + if(internal < 9800 || internal > 3200000){ + pc.printf("internal=%d out of 9.8M-3.2G range\r\n",internal); } - unsigned long long prescale_dco = dco / range_upper; - if(prescale_dco > 3200000000){ - // pc.printf("Prescale DCO out of 0-3.2G range\r\n"); + int prescale_dco = dco / range_upper; + if(prescale_dco > 3200000){ + pc.printf("Prescale DCO out of 0-3.2G range\r\n"); } - unsigned long long out_a = prescale_dco / rangea; - if(out_a < 20000000 || out_a > 3000000000){ + int out_a = prescale_dco / rangea; + if(out_a < 20000 || out_a > 3000000){ pc.printf("Out A out of 20M-3.0G range\r\n"); } - unsigned long long out_b = prescale_dco / rangeb; - if(out_b < 20000000 || out_b > 3000000000){ + int out_b = prescale_dco / rangeb; + if(out_b < 20000 || out_b > 3000000){ pc.printf("Out B out of 20M-3.0G range\r\n"); } @@ -107,7 +107,6 @@ range_upper = get_binline_by_num("/local/Prangeup.txt", range_upper); rangea = get_binline_by_num("/local/Prange.txt", rangea); rangeb = get_binline_by_num("/local/Prange.txt", rangeb); - jtag.writeMemory(PLL_CE1CCB, 1); jtag.writeMemory(PLL_CE1MPGC1, 1); jtag.writeMemory(PLL_FFTUNE, fftune(0)); @@ -115,9 +114,9 @@ jtag.writeMemory(PLL_LFTUNE_40_32, lftune_hi()); jtag.writeMemory(PLL_INTFBK, 1); jtag.writeMemory(PLL_PREDIV, prediv); - jtag.writeMemory(PLL_MULTINT, multint_upper << 8 | multint); jtag.writeMemory(PLL_RANGEA, range_upper << 5 | rangea); jtag.writeMemory(PLL_RANGEB, range_upper << 5 | rangeb); + jtag.writeMemory(PLL_MULTINT, multint_upper << 8 | multint); } @@ -140,4 +139,61 @@ unsigned long long lftune(){ // 41 bits return 0x05040100000L; +} + +/* +unsigned long long calc_pll_freqs(unsigned int prediv, unsigned int multint_upper, unsigned int multint, + unsigned int range_upper, unsigned int rangea, unsigned int rangeb) + dco = (PLL_REF / prediv) * multint_upper * multint; + prescale_dco = dco / range_upper; + out_a = prescale_dco / rangea; +*/ +int set_pll_frequency (int fMHz, JTAG &jtag) { + jtag.writeMemory(intclk_source, 0); + int counter = fMHz / 5; + int frequency = counter * 5; + if (frequency >= 625) { + pc.printf("Frequency > 625 MHz out of range!\r\nClock source changed to HCLK_EXT\r\n"); + return 1; + } /* + else if (frequency >= 625) { + //counter between 125 and 200 + // 20*125/4=625 + // 20*200/4=1G + jtag_pll(jtag, 1, 1, counter, 1, 4, 4); + calculated_f = calc_pll_freqs(1, 1, counter, 1, 4, 4)/1000; + if (calculated_f != frequency) { + pc.printf("PLL frequency not match!\r\n"); + } + } */ + else if (frequency >= 325) { + //counter between 65 and 125 + // 20*2*65/8=325 + // 20*2*125/8=625 + jtag_pll(jtag, 1, 2, counter, 1, 8, 8); + } else if (frequency >= 210) { + //counter between 42 and 65 + // 20*3*42/12=210 + // 20*3*65/12=325 + jtag_pll(jtag, 1, 3, counter, 1, 12, 12); + } else if (frequency >= 105) { + //counter between 21 and 42 + // 20*6*21/24=125 + // 20*6*42/24=210 + jtag_pll(jtag, 1, 3, 2*counter, 1, 24, 24); + } else { + pc.printf("Frequency < 105M out of range!\r\nClock source changed to HCLK_EXT\r\n"); + return 1; + } + jtag.writeMemory(PLL_RESET, 1); + wait_us(10); + jtag.writeMemory(PLL_RESET, 0); + wait_us(10); + if(jtag.readMemory(PLL_PLLLOCK)==0) { + pc.printf("PLL lock failed!\r\nClock source changed to HCLK_EXT\r\n"); + return 1; + } else { + jtag.writeMemory(intclk_source, 2); + return 0; + } } \ No newline at end of file