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.
Dependencies: DDRO_Farrari mbed
Fork of DDRO_Farrari by
main.cpp@3:e1a6e12233dd, 2014-07-17 (annotated)
- Committer:
- liangzhen
- Date:
- Thu Jul 17 22:16:45 2014 +0000
- Revision:
- 3:e1a6e12233dd
- Parent:
- 2:e94460b2149f
simplify for functional purpose only
Who changed what in which revision?
User | Revision | Line number | New 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 | 3:e1a6e12233dd | 31 | // power up the board |
liangzhen | 3:e1a6e12233dd | 32 | pc.printf("Begin\r\n"); |
liangzhen | 0:84a8bcfbdec9 | 33 | power_down(); |
liangzhen | 1:6a820a0ca03b | 34 | power_up(core_volt); // Power Up Chip |
liangzhen | 0:84a8bcfbdec9 | 35 | pc.printf("Powered up!\r\n"); |
liangzhen | 3:e1a6e12233dd | 36 | pc.printf("Start reading IDCode...\r\n"); |
liangzhen | 0:84a8bcfbdec9 | 37 | |
liangzhen | 3:e1a6e12233dd | 38 | // initializing the resets |
liangzhen | 0:84a8bcfbdec9 | 39 | PORESETn = 0; |
liangzhen | 0:84a8bcfbdec9 | 40 | CORERESETn = 0; |
liangzhen | 1:6a820a0ca03b | 41 | wait_us(100); |
liangzhen | 0:84a8bcfbdec9 | 42 | PORESETn = 1; |
liangzhen | 0:84a8bcfbdec9 | 43 | CORERESETn = 1; |
liangzhen | 0:84a8bcfbdec9 | 44 | JTAG jtag; |
liangzhen | 3:e1a6e12233dd | 45 | |
liangzhen | 3:e1a6e12233dd | 46 | // read and verify chip ID |
liangzhen | 0:84a8bcfbdec9 | 47 | int idcode = jtag.readID(); |
liangzhen | 0:84a8bcfbdec9 | 48 | if(idcode != 0x4ba00477) { |
liangzhen | 0:84a8bcfbdec9 | 49 | pc.printf("ERROR: IDCode %X\r\n", idcode); |
liangzhen | 1:6a820a0ca03b | 50 | wait(2); |
liangzhen | 0:84a8bcfbdec9 | 51 | power_down(); |
liangzhen | 0:84a8bcfbdec9 | 52 | return -1; |
liangzhen | 0:84a8bcfbdec9 | 53 | } |
liangzhen | 0:84a8bcfbdec9 | 54 | pc.printf("IDCode %X\r\n", idcode); |
liangzhen | 1:6a820a0ca03b | 55 | |
liangzhen | 3:e1a6e12233dd | 56 | // power up the JTAG port |
liangzhen | 0:84a8bcfbdec9 | 57 | jtag.reset(); |
liangzhen | 0:84a8bcfbdec9 | 58 | jtag.leaveState(); |
liangzhen | 0:84a8bcfbdec9 | 59 | jtag.PowerupDAP(); |
liangzhen | 3:e1a6e12233dd | 60 | |
liangzhen | 1:6a820a0ca03b | 61 | // setup necessary internal clock source selection |
liangzhen | 1:6a820a0ca03b | 62 | jtag.writeMemory(intclk_source, 2); |
liangzhen | 1:6a820a0ca03b | 63 | jtag.writeMemory(extclk_source, 1); |
liangzhen | 1:6a820a0ca03b | 64 | jtag.writeMemory(ext_div_by, 10); |
liangzhen | 3:e1a6e12233dd | 65 | |
liangzhen | 3:e1a6e12233dd | 66 | float voltage=1; |
liangzhen | 3:e1a6e12233dd | 67 | power_core(voltage); |
liangzhen | 3:e1a6e12233dd | 68 | pc.printf("V: %f\r\n", voltage); |
liangzhen | 2:e94460b2149f | 69 | |
liangzhen | 3:e1a6e12233dd | 70 | // load program |
liangzhen | 3:e1a6e12233dd | 71 | if(jtag.loadProgram()) { |
liangzhen | 3:e1a6e12233dd | 72 | dual_printf("Load Failed"); |
liangzhen | 3:e1a6e12233dd | 73 | exit(1); |
liangzhen | 2:e94460b2149f | 74 | } |
liangzhen | 3:e1a6e12233dd | 75 | |
liangzhen | 3:e1a6e12233dd | 76 | // reset the core and let it run |
liangzhen | 3:e1a6e12233dd | 77 | CORERESETn = 0; |
liangzhen | 3:e1a6e12233dd | 78 | CORERESETn = 1; |
liangzhen | 3:e1a6e12233dd | 79 | wait(0.2); |
liangzhen | 3:e1a6e12233dd | 80 | |
liangzhen | 3:e1a6e12233dd | 81 | // open the JTAG port again |
liangzhen | 3:e1a6e12233dd | 82 | jtag.reset(); |
liangzhen | 3:e1a6e12233dd | 83 | jtag.leaveState(); |
liangzhen | 3:e1a6e12233dd | 84 | jtag.PowerupDAP(); |
liangzhen | 3:e1a6e12233dd | 85 | |
liangzhen | 3:e1a6e12233dd | 86 | // verify the output here with the following functions |
liangzhen | 3:e1a6e12233dd | 87 | // unsigned int readMemory(unsigned int address); |
liangzhen | 3:e1a6e12233dd | 88 | // void writeMemory(unsigned int address, unsigned int value); |
liangzhen | 3:e1a6e12233dd | 89 | |
liangzhen | 3:e1a6e12233dd | 90 | |
liangzhen | 0:84a8bcfbdec9 | 91 | pc.printf("Powering Down\r\n"); |
liangzhen | 0:84a8bcfbdec9 | 92 | power_down(); |
liangzhen | 0:84a8bcfbdec9 | 93 | pc.printf("Done\r\n"); |
liangzhen | 2:e94460b2149f | 94 | while(1) { |
liangzhen | 2:e94460b2149f | 95 | myled = 1; |
liangzhen | 2:e94460b2149f | 96 | wait(0.2); |
liangzhen | 2:e94460b2149f | 97 | myled = 0; |
liangzhen | 2:e94460b2149f | 98 | wait(0.2); |
liangzhen | 2:e94460b2149f | 99 | } |
liangzhen | 0:84a8bcfbdec9 | 100 | } |
liangzhen | 0:84a8bcfbdec9 | 101 | |
liangzhen | 1:6a820a0ca03b | 102 | int check_FFT_Freq(JTAG &jtag, int fMHz) |
liangzhen | 1:6a820a0ca03b | 103 | { |
liangzhen | 1:6a820a0ca03b | 104 | if(jtag.loadProgram()) { |
liangzhen | 1:6a820a0ca03b | 105 | dual_printf("Load Failed"); |
liangzhen | 1:6a820a0ca03b | 106 | exit(1); |
liangzhen | 1:6a820a0ca03b | 107 | } |
liangzhen | 1:6a820a0ca03b | 108 | set_pll_frequency (fMHz, jtag); |
liangzhen | 1:6a820a0ca03b | 109 | //dual_printf("Resetting"); |
liangzhen | 1:6a820a0ca03b | 110 | CORERESETn = 0; |
liangzhen | 1:6a820a0ca03b | 111 | CORERESETn = 1; |
liangzhen | 1:6a820a0ca03b | 112 | wait(0.2); |
liangzhen | 1:6a820a0ca03b | 113 | jtag.reset(); |
liangzhen | 1:6a820a0ca03b | 114 | jtag.leaveState(); |
liangzhen | 1:6a820a0ca03b | 115 | jtag.PowerupDAP(); |
liangzhen | 1:6a820a0ca03b | 116 | unsigned int buffer_fft[64]; |
liangzhen | 1:6a820a0ca03b | 117 | for (int number1=0; number1<=63; number1++) { |
liangzhen | 1:6a820a0ca03b | 118 | buffer_fft[number1] = jtag.readMemory(0x24000100 + number1*4); |
liangzhen | 1:6a820a0ca03b | 119 | jtag.writeMemory(0x24000100 + number1*4,0xF0F0F0F0); |
liangzhen | 1:6a820a0ca03b | 120 | //printf("new[%d]: %d\r\n", number1, buffer_fft[number1]); |
liangzhen | 0:84a8bcfbdec9 | 121 | } |
liangzhen | 1:6a820a0ca03b | 122 | if ( buffer_fft[0] == 0x0000fffc && buffer_fft[1]==0x0000fffd && buffer_fft[2]==0xffc0000a && buffer_fft[3]==0x0000fffe && |
liangzhen | 1:6a820a0ca03b | 123 | buffer_fft[4]==0x0000fffd && buffer_fft[5]==0x0000ffff && buffer_fft[6]==0x0000fffd && buffer_fft[7]==0x00000000 && |
liangzhen | 1:6a820a0ca03b | 124 | buffer_fft[8]==0x0000ffff && buffer_fft[9]==0x0000ffff && buffer_fft[10]==0xfffeffff && buffer_fft[11]==0xffff0000 && |
liangzhen | 1:6a820a0ca03b | 125 | buffer_fft[12]==0x0000ffff && buffer_fft[13]==0xffff0000 && buffer_fft[14]==0xfffffffe && buffer_fft[15]==0xffff0000 && |
liangzhen | 1:6a820a0ca03b | 126 | buffer_fft[16]==0x00010000 && buffer_fft[17]==0x0001ffff && buffer_fft[18]==0x0000ffff && buffer_fft[19]==0x0001ffff && |
liangzhen | 1:6a820a0ca03b | 127 | buffer_fft[20]==0x0001fffe && buffer_fft[21]==0x0000fffe && buffer_fft[22]==0x0001fffe && buffer_fft[23]==0x0000ffff && |
liangzhen | 1:6a820a0ca03b | 128 | buffer_fft[24]==0x0000ffff && buffer_fft[25]==0x0001fffe && buffer_fft[26]==0x0000ffff && buffer_fft[27]==0x00010000 && |
liangzhen | 1:6a820a0ca03b | 129 | buffer_fft[28]==0x0001ffff && buffer_fft[29]==0x00010000 && buffer_fft[30]==0x0000ffff && buffer_fft[31]==0x00010000 && |
liangzhen | 1:6a820a0ca03b | 130 | buffer_fft[32]==0x0000ffff && buffer_fft[33]==0x0000ffff && buffer_fft[34]==0x0000ffff && buffer_fft[35]==0x0000ffff && |
liangzhen | 1:6a820a0ca03b | 131 | buffer_fft[36]==0x0000fffe && buffer_fft[37]==0x0000ffff && buffer_fft[38]==0x0000fffe && buffer_fft[39]==0x00000000 && |
liangzhen | 1:6a820a0ca03b | 132 | buffer_fft[40]==0xffffffff && buffer_fft[41]==0x0000ffff && buffer_fft[42]==0xffffffff && buffer_fft[43]==0x00000000 && |
liangzhen | 1:6a820a0ca03b | 133 | buffer_fft[44]==0x0000ffff && buffer_fft[45]==0x00000000 && buffer_fft[46]==0xffffffff && buffer_fft[47]==0x00000000 && |
liangzhen | 1:6a820a0ca03b | 134 | buffer_fft[48]==0x00000000 && buffer_fft[49]==0x00000000 && buffer_fft[50]==0x00000000 && buffer_fft[51]==0x00000000 && |
liangzhen | 1:6a820a0ca03b | 135 | buffer_fft[52]==0x0000ffff && buffer_fft[53]==0x0000ffff && buffer_fft[54]==0x0000ffff && buffer_fft[55]==0x00000000 && |
liangzhen | 1:6a820a0ca03b | 136 | buffer_fft[56]==0xfffeffff && buffer_fft[57]==0xffffffff && buffer_fft[58]==0xffff0000 && buffer_fft[59]==0x00000000 && |
liangzhen | 1:6a820a0ca03b | 137 | buffer_fft[60]==0x0000ffff && buffer_fft[61]==0x00000000 && buffer_fft[62]==0x003d000c && buffer_fft[63]==0x00000000 ) { |
liangzhen | 1:6a820a0ca03b | 138 | return 1; |
liangzhen | 1:6a820a0ca03b | 139 | } else { |
liangzhen | 1:6a820a0ca03b | 140 | return 0; |
liangzhen | 1:6a820a0ca03b | 141 | } |
liangzhen | 0:84a8bcfbdec9 | 142 | } |
liangzhen | 0:84a8bcfbdec9 | 143 | |
liangzhen | 1:6a820a0ca03b | 144 | void DDRO_Sensor(JTAG &jtag) |
liangzhen | 1:6a820a0ca03b | 145 | { |
liangzhen | 0:84a8bcfbdec9 | 146 | /**********************enable****************************************/ |
liangzhen | 0:84a8bcfbdec9 | 147 | jtag.writeMemory(ddro_syn_en, 0xffffffff); |
liangzhen | 0:84a8bcfbdec9 | 148 | jtag.writeMemory(ddro_inv_en, 0xffffffff); |
liangzhen | 0:84a8bcfbdec9 | 149 | /**********************set ref_clk and samp_clk**********************/ |
liangzhen | 1:6a820a0ca03b | 150 | jtag.writeMemory(ddro_ref_src, 0x00000002); |
liangzhen | 0:84a8bcfbdec9 | 151 | /**********************write threshold*******************************/ |
liangzhen | 1:6a820a0ca03b | 152 | jtag.writeMemory(ddro_threshold, 100000); |
liangzhen | 1:6a820a0ca03b | 153 | //jtag.writeMemory(0xe000e104, 0x000000ff); // enable interrupts |
liangzhen | 0:84a8bcfbdec9 | 154 | |
liangzhen | 2:e94460b2149f | 155 | for (int ro_id=3; ro_id<=15; ro_id++) { |
liangzhen | 2:e94460b2149f | 156 | unsigned int meas1_s, meas1_e, meas2_s, meas2_e; |
liangzhen | 2:e94460b2149f | 157 | int delta1, delta2; |
liangzhen | 2:e94460b2149f | 158 | //pc.printf("RO %d\r\n ", ro_id-2); |
liangzhen | 1:6a820a0ca03b | 159 | jtag.writeMemory(ddro_samp_src, ro_id); |
liangzhen | 1:6a820a0ca03b | 160 | jtag.writeMemory(ddro_start, 0); |
liangzhen | 2:e94460b2149f | 161 | meas1_s = jtag.readMemory(ddro_count); |
liangzhen | 2:e94460b2149f | 162 | //pc.printf("Counter starts at: %d ", meas1); |
liangzhen | 2:e94460b2149f | 163 | jtag.writeMemory(ddro_start, 1); |
liangzhen | 2:e94460b2149f | 164 | wait_us(50000); |
liangzhen | 2:e94460b2149f | 165 | jtag.writeMemory(ddro_start, 0); |
liangzhen | 2:e94460b2149f | 166 | meas1_e = jtag.readMemory(ddro_count); |
liangzhen | 2:e94460b2149f | 167 | //pc.printf("ends at: %d\r\n", meas1); |
liangzhen | 2:e94460b2149f | 168 | delta1 = meas1_e - meas1_s; |
liangzhen | 2:e94460b2149f | 169 | |
liangzhen | 2:e94460b2149f | 170 | jtag.writeMemory(ddro_samp_src, ro_id); |
liangzhen | 2:e94460b2149f | 171 | jtag.writeMemory(ddro_start, 0); |
liangzhen | 2:e94460b2149f | 172 | meas2_s = jtag.readMemory(ddro_count); |
liangzhen | 2:e94460b2149f | 173 | //pc.printf("Counter starts at: %d ", meas1); |
liangzhen | 1:6a820a0ca03b | 174 | jtag.writeMemory(ddro_start, 1); |
liangzhen | 1:6a820a0ca03b | 175 | wait_us(50000); |
liangzhen | 1:6a820a0ca03b | 176 | jtag.writeMemory(ddro_start, 0); |
liangzhen | 2:e94460b2149f | 177 | meas2_e = jtag.readMemory(ddro_count); |
liangzhen | 2:e94460b2149f | 178 | delta2 = meas2_e - meas2_s; |
liangzhen | 2:e94460b2149f | 179 | //printf("ends at: %d\r\n", meas1); |
liangzhen | 2:e94460b2149f | 180 | |
liangzhen | 2:e94460b2149f | 181 | if ( (float)delta2/meas1_e>=0.95 && (float)delta2/meas1_e<=1.05 ) { |
liangzhen | 3:e1a6e12233dd | 182 | pc.printf("RO %d: %d\r\n", ro_id, (delta2+meas1_e)/2); |
liangzhen | 2:e94460b2149f | 183 | #ifdef WRITE_RESULTS |
liangzhen | 3:e1a6e12233dd | 184 | fprintf(results_file,"RO %d: %d\r\n", ro_id, (delta2+meas1_e)/2); |
liangzhen | 2:e94460b2149f | 185 | #endif |
liangzhen | 2:e94460b2149f | 186 | } else if ((float)delta1/meas2_e>=0.95 && (float)delta1/meas2_e<=1.05 ) { |
liangzhen | 3:e1a6e12233dd | 187 | pc.printf("RO %d: %d\r\n", ro_id, (delta1+meas2_e)/2); |
liangzhen | 2:e94460b2149f | 188 | #ifdef WRITE_RESULTS |
liangzhen | 3:e1a6e12233dd | 189 | fprintf(results_file,"RO %d: %d\r\n", ro_id, (delta1+meas2_e)/2); |
liangzhen | 2:e94460b2149f | 190 | #endif |
liangzhen | 2:e94460b2149f | 191 | } else if ( (float)delta2/delta1 >=0.95 && (float)delta2/delta1<=1.05 ) { |
liangzhen | 3:e1a6e12233dd | 192 | pc.printf("RO %d: %d\r\n", ro_id, (delta1+delta2)/2); |
liangzhen | 2:e94460b2149f | 193 | #ifdef WRITE_RESULTS |
liangzhen | 3:e1a6e12233dd | 194 | fprintf(results_file,"RO %d: %d\r\n", ro_id, (delta1+delta2)/2); |
liangzhen | 2:e94460b2149f | 195 | #endif |
liangzhen | 2:e94460b2149f | 196 | } else if ( (float)meas2_e/meas1_e >=0.95 && (float)meas2_e/meas1_e<=1.05 ) { |
liangzhen | 3:e1a6e12233dd | 197 | pc.printf("RO %d: %d\r\n", ro_id, (meas1_e+meas2_e)/2); |
liangzhen | 2:e94460b2149f | 198 | #ifdef WRITE_RESULTS |
liangzhen | 3:e1a6e12233dd | 199 | fprintf(results_file,"RO %d: %d\r\n", ro_id, (meas1_e+meas2_e)/2); |
liangzhen | 2:e94460b2149f | 200 | #endif |
liangzhen | 2:e94460b2149f | 201 | } else { |
liangzhen | 3:e1a6e12233dd | 202 | pc.printf("Error in measuring DDRO %d\r\n", ro_id); |
liangzhen | 2:e94460b2149f | 203 | #ifdef WRITE_RESULTS |
liangzhen | 3:e1a6e12233dd | 204 | fprintf(results_file,"Error in measuring DDRO %d\r\n", ro_id); |
liangzhen | 2:e94460b2149f | 205 | #endif |
liangzhen | 2:e94460b2149f | 206 | } |
liangzhen | 1:6a820a0ca03b | 207 | } |
liangzhen | 1:6a820a0ca03b | 208 | } |