Liangzhen Lai / Mbed 2 deprecated Orange_Ferrari_board_functional

Dependencies:   DDRO_Farrari mbed

Fork of DDRO_Farrari by Liangzhen Lai

Committer:
liangzhen
Date:
Thu Feb 20 03:40:20 2014 +0000
Revision:
2:e94460b2149f
Parent:
1:6a820a0ca03b
Child:
3:e1a6e12233dd
updated with new PLL configuration function

Who changed what in which revision?

UserRevisionLine numberNew contents of line
liangzhen 0:84a8bcfbdec9 1
liangzhen 0:84a8bcfbdec9 2 #include "mbed.h"
liangzhen 0:84a8bcfbdec9 3 #include "dac.h"
liangzhen 0:84a8bcfbdec9 4 #include "board_test.h"
liangzhen 0:84a8bcfbdec9 5 #include "scan.h"
liangzhen 0:84a8bcfbdec9 6 #include "power.h"
liangzhen 0:84a8bcfbdec9 7 #include "pinout.h"
liangzhen 0:84a8bcfbdec9 8 #include "pll.h"
liangzhen 0:84a8bcfbdec9 9 #include "lcd.h"
liangzhen 0:84a8bcfbdec9 10 #include "jtag.h"
liangzhen 0:84a8bcfbdec9 11 #include "mmap.h"
liangzhen 1:6a820a0ca03b 12 #include "clock.h"
liangzhen 0:84a8bcfbdec9 13 #include "EasyBMP.h"
liangzhen 1:6a820a0ca03b 14 #include "main.h"
liangzhen 0:84a8bcfbdec9 15
liangzhen 2:e94460b2149f 16 //#define WRITE_RESULTS
liangzhen 2:e94460b2149f 17 FILE *results_file;
liangzhen 2:e94460b2149f 18
liangzhen 2:e94460b2149f 19 DigitalOut myled(LED4);
liangzhen 2:e94460b2149f 20 #ifdef WRITE_RESULTS
liangzhen 2:e94460b2149f 21 //LocalFileSystem local("local"); // Create the local filesystem under the name "local"
liangzhen 2:e94460b2149f 22 #endif
liangzhen 2:e94460b2149f 23
liangzhen 1:6a820a0ca03b 24 int main()
liangzhen 1:6a820a0ca03b 25 {
liangzhen 1:6a820a0ca03b 26 float core_volt = 1;
liangzhen 2:e94460b2149f 27 #ifdef WRITE_RESULTS
liangzhen 2:e94460b2149f 28 results_file=fopen("/local/results.txt", "a"); // Open "out.txt" on the local file system for writing
liangzhen 2:e94460b2149f 29 #endif
liangzhen 2:e94460b2149f 30
liangzhen 0:84a8bcfbdec9 31
liangzhen 1:6a820a0ca03b 32 //wdt.kick(20.0);
liangzhen 0:84a8bcfbdec9 33 pc.printf("Begin FFT\r\n");
liangzhen 0:84a8bcfbdec9 34 power_down();
liangzhen 1:6a820a0ca03b 35 power_up(core_volt); // Power Up Chip
liangzhen 0:84a8bcfbdec9 36 pc.printf("Powered up!\r\n");
liangzhen 0:84a8bcfbdec9 37
liangzhen 0:84a8bcfbdec9 38 PORESETn = 0;
liangzhen 0:84a8bcfbdec9 39 CORERESETn = 0;
liangzhen 1:6a820a0ca03b 40 wait_us(100);
liangzhen 2:e94460b2149f 41 pc.getc();
liangzhen 0:84a8bcfbdec9 42 PORESETn = 1;
liangzhen 0:84a8bcfbdec9 43 CORERESETn = 1;
liangzhen 2:e94460b2149f 44 pc.getc();
liangzhen 0:84a8bcfbdec9 45 JTAG jtag;
liangzhen 0:84a8bcfbdec9 46 int idcode = jtag.readID();
liangzhen 0:84a8bcfbdec9 47 if(idcode != 0x4ba00477) {
liangzhen 0:84a8bcfbdec9 48 pc.printf("ERROR: IDCode %X\r\n", idcode);
liangzhen 1:6a820a0ca03b 49 wait(2);
liangzhen 0:84a8bcfbdec9 50 power_down();
liangzhen 0:84a8bcfbdec9 51 return -1;
liangzhen 0:84a8bcfbdec9 52 }
liangzhen 0:84a8bcfbdec9 53 pc.printf("IDCode %X\r\n", idcode);
liangzhen 1:6a820a0ca03b 54
liangzhen 0:84a8bcfbdec9 55 jtag.reset();
liangzhen 0:84a8bcfbdec9 56 jtag.leaveState();
liangzhen 0:84a8bcfbdec9 57 jtag.PowerupDAP();
liangzhen 1:6a820a0ca03b 58 // setup necessary internal clock source selection
liangzhen 1:6a820a0ca03b 59 jtag.writeMemory(intclk_source, 2);
liangzhen 1:6a820a0ca03b 60 jtag.writeMemory(extclk_source, 1);
liangzhen 1:6a820a0ca03b 61 jtag.writeMemory(ext_div_by, 10);
liangzhen 2:e94460b2149f 62 for(int iter=0; iter<3; iter++) {
liangzhen 2:e94460b2149f 63 #ifdef WRITE_RESULTS
liangzhen 2:e94460b2149f 64 fprintf(results_file,"Iteration: %d\n", iter);
liangzhen 2:e94460b2149f 65 #endif
liangzhen 2:e94460b2149f 66 float voltage=1;
liangzhen 2:e94460b2149f 67 for(int i=0; i<=5; i++) {
liangzhen 2:e94460b2149f 68 voltage = 1 - 0.04*i;
liangzhen 2:e94460b2149f 69 power_core(voltage);
liangzhen 2:e94460b2149f 70 #ifdef WRITE_RESULTS
liangzhen 2:e94460b2149f 71 fprintf(results_file,"V: %f\n", voltage);
liangzhen 2:e94460b2149f 72 #endif
liangzhen 2:e94460b2149f 73 int upper = 120;
liangzhen 2:e94460b2149f 74 int lower = 22;
liangzhen 2:e94460b2149f 75 while (upper-lower > 1) {
liangzhen 2:e94460b2149f 76 int middle = (upper+lower)/2;
liangzhen 2:e94460b2149f 77 middle = middle * 5;
liangzhen 2:e94460b2149f 78 bool if_pass = true;
liangzhen 2:e94460b2149f 79 for (int j=1; j<10; j++) {
liangzhen 2:e94460b2149f 80 if(!check_FFT_Freq(jtag,middle)) {
liangzhen 2:e94460b2149f 81 if_pass = false;
liangzhen 2:e94460b2149f 82 j=10;
liangzhen 2:e94460b2149f 83 }
liangzhen 2:e94460b2149f 84 }
liangzhen 2:e94460b2149f 85 if(if_pass) {
liangzhen 2:e94460b2149f 86 lower = middle/5;
liangzhen 2:e94460b2149f 87 } else {
liangzhen 2:e94460b2149f 88 upper = middle/5;
liangzhen 2:e94460b2149f 89 }
liangzhen 2:e94460b2149f 90 }
liangzhen 2:e94460b2149f 91 pc.printf("fft working frequency: %d MHz\r\n", lower*5);
liangzhen 2:e94460b2149f 92 #ifdef WRITE_RESULTS
liangzhen 2:e94460b2149f 93 fprintf(results_file,"FFT: %d\n", lower*5);
liangzhen 2:e94460b2149f 94 #endif
liangzhen 2:e94460b2149f 95 set_pll_frequency (200, jtag);
liangzhen 2:e94460b2149f 96 DDRO_Sensor(jtag);
liangzhen 2:e94460b2149f 97 wait(1);
liangzhen 2:e94460b2149f 98 gain_ctrl=1;
liangzhen 2:e94460b2149f 99 #ifdef WRITE_RESULTS
liangzhen 2:e94460b2149f 100 fprintf(results_file,"GAIN_CTRL = 1\r\n");
liangzhen 2:e94460b2149f 101 fprintf(results_file,"SEN: %f\r\n",meas_sen.read());
liangzhen 2:e94460b2149f 102 fprintf(results_file,"MEM1: %f\r\n",meas_mem1.read());
liangzhen 2:e94460b2149f 103 fprintf(results_file,"MEM2: %f\r\n",meas_mem2.read());
liangzhen 2:e94460b2149f 104 fprintf(results_file,"CORE: %f\r\n",meas_core.read());
liangzhen 2:e94460b2149f 105 #endif
liangzhen 2:e94460b2149f 106 wait(1);
liangzhen 2:e94460b2149f 107 gain_ctrl=0;
liangzhen 2:e94460b2149f 108 #ifdef WRITE_RESULTS
liangzhen 2:e94460b2149f 109
liangzhen 2:e94460b2149f 110 fprintf(results_file,"GAIN_CTRL = 0\r\n");
liangzhen 2:e94460b2149f 111 fprintf(results_file,"SEN: %f\r\n",meas_sen.read());
liangzhen 2:e94460b2149f 112 fprintf(results_file,"MEM1: %f\r\n",meas_mem1.read());
liangzhen 2:e94460b2149f 113 fprintf(results_file,"MEM2: %f\r\n",meas_mem2.read());
liangzhen 2:e94460b2149f 114 fprintf(results_file,"CORE: %f\r\n",meas_core.read());
liangzhen 2:e94460b2149f 115 #endif
liangzhen 2:e94460b2149f 116 }
liangzhen 2:e94460b2149f 117 }
liangzhen 1:6a820a0ca03b 118 /*
liangzhen 2:e94460b2149f 119
liangzhen 0:84a8bcfbdec9 120 jtag.writeMemory(ddro_pad_out, 0xffffffff);
liangzhen 1:6a820a0ca03b 121 printf("Reading ddro pad out %x\r\n", jtag.readMemory(ddro_pad_out));
liangzhen 0:84a8bcfbdec9 122 jtag.writeMemory(ddro_div_by, 0xffffffff);
liangzhen 1:6a820a0ca03b 123 printf("Reading ddro div by %x\r\n", jtag.readMemory(ddro_div_by));
liangzhen 2:e94460b2149f 124 */
liangzhen 1:6a820a0ca03b 125
liangzhen 2:e94460b2149f 126
liangzhen 1:6a820a0ca03b 127
liangzhen 0:84a8bcfbdec9 128 pc.printf("Powering Down\r\n");
liangzhen 0:84a8bcfbdec9 129 power_down();
liangzhen 2:e94460b2149f 130 #ifdef WRITE_RESULTS
liangzhen 2:e94460b2149f 131 fclose(results_file);
liangzhen 2:e94460b2149f 132 #endif
liangzhen 0:84a8bcfbdec9 133 pc.printf("Done\r\n");
liangzhen 2:e94460b2149f 134 while(1) {
liangzhen 2:e94460b2149f 135 myled = 1;
liangzhen 2:e94460b2149f 136 wait(0.2);
liangzhen 2:e94460b2149f 137 myled = 0;
liangzhen 2:e94460b2149f 138 wait(0.2);
liangzhen 2:e94460b2149f 139 }
liangzhen 0:84a8bcfbdec9 140 }
liangzhen 0:84a8bcfbdec9 141
liangzhen 1:6a820a0ca03b 142 int check_FFT_Freq(JTAG &jtag, int fMHz)
liangzhen 1:6a820a0ca03b 143 {
liangzhen 1:6a820a0ca03b 144 if(jtag.loadProgram()) {
liangzhen 1:6a820a0ca03b 145 dual_printf("Load Failed");
liangzhen 1:6a820a0ca03b 146 exit(1);
liangzhen 1:6a820a0ca03b 147 }
liangzhen 1:6a820a0ca03b 148 set_pll_frequency (fMHz, jtag);
liangzhen 1:6a820a0ca03b 149 //dual_printf("Resetting");
liangzhen 1:6a820a0ca03b 150 CORERESETn = 0;
liangzhen 1:6a820a0ca03b 151 CORERESETn = 1;
liangzhen 1:6a820a0ca03b 152 wait(0.2);
liangzhen 1:6a820a0ca03b 153 jtag.reset();
liangzhen 1:6a820a0ca03b 154 jtag.leaveState();
liangzhen 1:6a820a0ca03b 155 jtag.PowerupDAP();
liangzhen 1:6a820a0ca03b 156 unsigned int buffer_fft[64];
liangzhen 1:6a820a0ca03b 157 for (int number1=0; number1<=63; number1++) {
liangzhen 1:6a820a0ca03b 158 buffer_fft[number1] = jtag.readMemory(0x24000100 + number1*4);
liangzhen 1:6a820a0ca03b 159 jtag.writeMemory(0x24000100 + number1*4,0xF0F0F0F0);
liangzhen 1:6a820a0ca03b 160 //printf("new[%d]: %d\r\n", number1, buffer_fft[number1]);
liangzhen 0:84a8bcfbdec9 161 }
liangzhen 1:6a820a0ca03b 162 if ( buffer_fft[0] == 0x0000fffc && buffer_fft[1]==0x0000fffd && buffer_fft[2]==0xffc0000a && buffer_fft[3]==0x0000fffe &&
liangzhen 1:6a820a0ca03b 163 buffer_fft[4]==0x0000fffd && buffer_fft[5]==0x0000ffff && buffer_fft[6]==0x0000fffd && buffer_fft[7]==0x00000000 &&
liangzhen 1:6a820a0ca03b 164 buffer_fft[8]==0x0000ffff && buffer_fft[9]==0x0000ffff && buffer_fft[10]==0xfffeffff && buffer_fft[11]==0xffff0000 &&
liangzhen 1:6a820a0ca03b 165 buffer_fft[12]==0x0000ffff && buffer_fft[13]==0xffff0000 && buffer_fft[14]==0xfffffffe && buffer_fft[15]==0xffff0000 &&
liangzhen 1:6a820a0ca03b 166 buffer_fft[16]==0x00010000 && buffer_fft[17]==0x0001ffff && buffer_fft[18]==0x0000ffff && buffer_fft[19]==0x0001ffff &&
liangzhen 1:6a820a0ca03b 167 buffer_fft[20]==0x0001fffe && buffer_fft[21]==0x0000fffe && buffer_fft[22]==0x0001fffe && buffer_fft[23]==0x0000ffff &&
liangzhen 1:6a820a0ca03b 168 buffer_fft[24]==0x0000ffff && buffer_fft[25]==0x0001fffe && buffer_fft[26]==0x0000ffff && buffer_fft[27]==0x00010000 &&
liangzhen 1:6a820a0ca03b 169 buffer_fft[28]==0x0001ffff && buffer_fft[29]==0x00010000 && buffer_fft[30]==0x0000ffff && buffer_fft[31]==0x00010000 &&
liangzhen 1:6a820a0ca03b 170 buffer_fft[32]==0x0000ffff && buffer_fft[33]==0x0000ffff && buffer_fft[34]==0x0000ffff && buffer_fft[35]==0x0000ffff &&
liangzhen 1:6a820a0ca03b 171 buffer_fft[36]==0x0000fffe && buffer_fft[37]==0x0000ffff && buffer_fft[38]==0x0000fffe && buffer_fft[39]==0x00000000 &&
liangzhen 1:6a820a0ca03b 172 buffer_fft[40]==0xffffffff && buffer_fft[41]==0x0000ffff && buffer_fft[42]==0xffffffff && buffer_fft[43]==0x00000000 &&
liangzhen 1:6a820a0ca03b 173 buffer_fft[44]==0x0000ffff && buffer_fft[45]==0x00000000 && buffer_fft[46]==0xffffffff && buffer_fft[47]==0x00000000 &&
liangzhen 1:6a820a0ca03b 174 buffer_fft[48]==0x00000000 && buffer_fft[49]==0x00000000 && buffer_fft[50]==0x00000000 && buffer_fft[51]==0x00000000 &&
liangzhen 1:6a820a0ca03b 175 buffer_fft[52]==0x0000ffff && buffer_fft[53]==0x0000ffff && buffer_fft[54]==0x0000ffff && buffer_fft[55]==0x00000000 &&
liangzhen 1:6a820a0ca03b 176 buffer_fft[56]==0xfffeffff && buffer_fft[57]==0xffffffff && buffer_fft[58]==0xffff0000 && buffer_fft[59]==0x00000000 &&
liangzhen 1:6a820a0ca03b 177 buffer_fft[60]==0x0000ffff && buffer_fft[61]==0x00000000 && buffer_fft[62]==0x003d000c && buffer_fft[63]==0x00000000 ) {
liangzhen 1:6a820a0ca03b 178 return 1;
liangzhen 1:6a820a0ca03b 179 } else {
liangzhen 1:6a820a0ca03b 180 return 0;
liangzhen 1:6a820a0ca03b 181 }
liangzhen 0:84a8bcfbdec9 182 }
liangzhen 0:84a8bcfbdec9 183
liangzhen 1:6a820a0ca03b 184 void DDRO_Sensor(JTAG &jtag)
liangzhen 1:6a820a0ca03b 185 {
liangzhen 0:84a8bcfbdec9 186 /**********************enable****************************************/
liangzhen 0:84a8bcfbdec9 187 jtag.writeMemory(ddro_syn_en, 0xffffffff);
liangzhen 0:84a8bcfbdec9 188 jtag.writeMemory(ddro_inv_en, 0xffffffff);
liangzhen 0:84a8bcfbdec9 189 /**********************set ref_clk and samp_clk**********************/
liangzhen 1:6a820a0ca03b 190 jtag.writeMemory(ddro_ref_src, 0x00000002);
liangzhen 0:84a8bcfbdec9 191 /**********************write threshold*******************************/
liangzhen 1:6a820a0ca03b 192 jtag.writeMemory(ddro_threshold, 100000);
liangzhen 1:6a820a0ca03b 193 //jtag.writeMemory(0xe000e104, 0x000000ff); // enable interrupts
liangzhen 0:84a8bcfbdec9 194
liangzhen 2:e94460b2149f 195 for (int ro_id=3; ro_id<=15; ro_id++) {
liangzhen 2:e94460b2149f 196 unsigned int meas1_s, meas1_e, meas2_s, meas2_e;
liangzhen 2:e94460b2149f 197 int delta1, delta2;
liangzhen 2:e94460b2149f 198 //pc.printf("RO %d\r\n ", ro_id-2);
liangzhen 1:6a820a0ca03b 199 jtag.writeMemory(ddro_samp_src, ro_id);
liangzhen 1:6a820a0ca03b 200 jtag.writeMemory(ddro_start, 0);
liangzhen 2:e94460b2149f 201 meas1_s = jtag.readMemory(ddro_count);
liangzhen 2:e94460b2149f 202 //pc.printf("Counter starts at: %d ", meas1);
liangzhen 2:e94460b2149f 203 jtag.writeMemory(ddro_start, 1);
liangzhen 2:e94460b2149f 204 wait_us(50000);
liangzhen 2:e94460b2149f 205 jtag.writeMemory(ddro_start, 0);
liangzhen 2:e94460b2149f 206 meas1_e = jtag.readMemory(ddro_count);
liangzhen 2:e94460b2149f 207 //pc.printf("ends at: %d\r\n", meas1);
liangzhen 2:e94460b2149f 208 delta1 = meas1_e - meas1_s;
liangzhen 2:e94460b2149f 209
liangzhen 2:e94460b2149f 210 jtag.writeMemory(ddro_samp_src, ro_id);
liangzhen 2:e94460b2149f 211 jtag.writeMemory(ddro_start, 0);
liangzhen 2:e94460b2149f 212 meas2_s = jtag.readMemory(ddro_count);
liangzhen 2:e94460b2149f 213 //pc.printf("Counter starts at: %d ", meas1);
liangzhen 1:6a820a0ca03b 214 jtag.writeMemory(ddro_start, 1);
liangzhen 1:6a820a0ca03b 215 wait_us(50000);
liangzhen 1:6a820a0ca03b 216 jtag.writeMemory(ddro_start, 0);
liangzhen 2:e94460b2149f 217 meas2_e = jtag.readMemory(ddro_count);
liangzhen 2:e94460b2149f 218 delta2 = meas2_e - meas2_s;
liangzhen 2:e94460b2149f 219 //printf("ends at: %d\r\n", meas1);
liangzhen 2:e94460b2149f 220
liangzhen 2:e94460b2149f 221 if ( (float)delta2/meas1_e>=0.95 && (float)delta2/meas1_e<=1.05 ) {
liangzhen 2:e94460b2149f 222 pc.printf("RO %d: %d\n\r", ro_id, (delta2+meas1_e)/2);
liangzhen 2:e94460b2149f 223 #ifdef WRITE_RESULTS
liangzhen 2:e94460b2149f 224 fprintf(results_file,"RO %d: %d\n\r", ro_id, (delta2+meas1_e)/2);
liangzhen 2:e94460b2149f 225 #endif
liangzhen 2:e94460b2149f 226 } else if ((float)delta1/meas2_e>=0.95 && (float)delta1/meas2_e<=1.05 ) {
liangzhen 2:e94460b2149f 227 pc.printf("RO %d: %d\n\r", ro_id, (delta1+meas2_e)/2);
liangzhen 2:e94460b2149f 228 #ifdef WRITE_RESULTS
liangzhen 2:e94460b2149f 229 fprintf(results_file,"RO %d: %d\n\r", ro_id, (delta1+meas2_e)/2);
liangzhen 2:e94460b2149f 230 #endif
liangzhen 2:e94460b2149f 231 } else if ( (float)delta2/delta1 >=0.95 && (float)delta2/delta1<=1.05 ) {
liangzhen 2:e94460b2149f 232 pc.printf("RO %d: %d\n\r", ro_id, (delta1+delta2)/2);
liangzhen 2:e94460b2149f 233 #ifdef WRITE_RESULTS
liangzhen 2:e94460b2149f 234 fprintf(results_file,"RO %d: %d\n\r", ro_id, (delta1+delta2)/2);
liangzhen 2:e94460b2149f 235 #endif
liangzhen 2:e94460b2149f 236 } else if ( (float)meas2_e/meas1_e >=0.95 && (float)meas2_e/meas1_e<=1.05 ) {
liangzhen 2:e94460b2149f 237 pc.printf("RO %d: %d\n\r", ro_id, (meas1_e+meas2_e)/2);
liangzhen 2:e94460b2149f 238 #ifdef WRITE_RESULTS
liangzhen 2:e94460b2149f 239 fprintf(results_file,"RO %d: %d\n\r", ro_id, (meas1_e+meas2_e)/2);
liangzhen 2:e94460b2149f 240 #endif
liangzhen 2:e94460b2149f 241 } else {
liangzhen 2:e94460b2149f 242 pc.printf("Error in measuring DDRO %d\n\r", ro_id);
liangzhen 2:e94460b2149f 243 #ifdef WRITE_RESULTS
liangzhen 2:e94460b2149f 244 fprintf(results_file,"Error in measuring DDRO %d\n\r", ro_id);
liangzhen 2:e94460b2149f 245 #endif
liangzhen 2:e94460b2149f 246 }
liangzhen 1:6a820a0ca03b 247 }
liangzhen 1:6a820a0ca03b 248 }