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.
Dependents: Orange_Ferrari_board_functional
Diff: pll.cpp
- Revision:
- 1:6a820a0ca03b
- Parent:
- 0:84a8bcfbdec9
--- 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