Liangzhen Lai / Mbed 2 deprecated Orange_Ferrari_board_functional

Dependencies:   DDRO_Farrari mbed

Fork of DDRO_Farrari by Liangzhen Lai

Revision:
2:e94460b2149f
Parent:
1:6a820a0ca03b
Child:
3:e1a6e12233dd
diff -r 6a820a0ca03b -r e94460b2149f main.cpp
--- a/main.cpp	Mon Oct 21 22:36:51 2013 +0000
+++ b/main.cpp	Thu Feb 20 03:40:20 2014 +0000
@@ -13,9 +13,21 @@
 #include "EasyBMP.h"
 #include "main.h"
 
+//#define WRITE_RESULTS
+FILE *results_file;
+
+DigitalOut myled(LED4);
+#ifdef WRITE_RESULTS
+//LocalFileSystem local("local");               // Create the local filesystem under the name "local"
+#endif
+
 int main()
 {
     float core_volt = 1;
+#ifdef WRITE_RESULTS
+    results_file=fopen("/local/results.txt", "a");  // Open "out.txt" on the local file system for writing
+#endif
+
 
     //wdt.kick(20.0);
     pc.printf("Begin FFT\r\n");
@@ -26,9 +38,10 @@
     PORESETn = 0;
     CORERESETn = 0;
     wait_us(100);
+    pc.getc();
     PORESETn = 1;
     CORERESETn = 1;
-
+    pc.getc();
     JTAG jtag;
     int idcode = jtag.readID();
     if(idcode != 0x4ba00477) {
@@ -46,52 +59,84 @@
     jtag.writeMemory(intclk_source, 2);
     jtag.writeMemory(extclk_source, 1);
     jtag.writeMemory(ext_div_by, 10);
-    power_core(1);
+    for(int iter=0; iter<3; iter++) {
+#ifdef WRITE_RESULTS
+        fprintf(results_file,"Iteration: %d\n", iter);
+#endif
+        float voltage=1;
+        for(int i=0; i<=5; i++) {
+            voltage = 1 - 0.04*i;
+            power_core(voltage);
+#ifdef WRITE_RESULTS
+            fprintf(results_file,"V: %f\n", voltage);
+#endif
+            int upper = 120;
+            int lower = 22;
+            while (upper-lower > 1) {
+                int middle = (upper+lower)/2;
+                middle = middle * 5;
+                bool if_pass = true;
+                for (int j=1; j<10; j++) {
+                    if(!check_FFT_Freq(jtag,middle)) {
+                        if_pass = false;
+                        j=10;
+                    }
+                }
+                if(if_pass) {
+                    lower = middle/5;
+                } else {
+                    upper = middle/5;
+                }
+            }
+            pc.printf("fft working frequency: %d MHz\r\n", lower*5);
+#ifdef WRITE_RESULTS
+            fprintf(results_file,"FFT: %d\n", lower*5);
+#endif
+            set_pll_frequency (200, jtag);
+            DDRO_Sensor(jtag);
+            wait(1);
+            gain_ctrl=1;
+#ifdef WRITE_RESULTS
+            fprintf(results_file,"GAIN_CTRL = 1\r\n");
+            fprintf(results_file,"SEN: %f\r\n",meas_sen.read());
+            fprintf(results_file,"MEM1: %f\r\n",meas_mem1.read());
+            fprintf(results_file,"MEM2: %f\r\n",meas_mem2.read());
+            fprintf(results_file,"CORE: %f\r\n",meas_core.read());
+#endif
+            wait(1);
+            gain_ctrl=0;
+#ifdef WRITE_RESULTS
+
+            fprintf(results_file,"GAIN_CTRL = 0\r\n");
+            fprintf(results_file,"SEN: %f\r\n",meas_sen.read());
+            fprintf(results_file,"MEM1: %f\r\n",meas_mem1.read());
+            fprintf(results_file,"MEM2: %f\r\n",meas_mem2.read());
+            fprintf(results_file,"CORE: %f\r\n",meas_core.read());
+#endif
+        }
+    }
     /*
-    for (int i=0; i<2; i++) {
-        int upper = 120;
-        int lower = 22;
-        while (upper-lower > 1) {
-            int middle = (upper+lower)/2;
-            middle = middle * 5;
-            if(check_FFT_Freq(jtag, middle)) {
-                lower = middle/5;
-            } else {
-                upper = middle/5;
-            }
-        }
-        pc.printf("fft working frequency: %d MHz\r\n", lower*5);
-    }
-    */
-    set_pll_frequency (200, jtag);
-    DDRO_Sensor(jtag);
-    /*
-    
+
     jtag.writeMemory(ddro_pad_out, 0xffffffff);
     printf("Reading ddro pad out %x\r\n", jtag.readMemory(ddro_pad_out));
     jtag.writeMemory(ddro_div_by, 0xffffffff);
     printf("Reading ddro div by %x\r\n", jtag.readMemory(ddro_div_by));
-
-    wait(1);
-    gain_ctrl=1;
-    pc.printf("GAIN_CTRL = 1\r\n");
-    pc.printf("SEN: %f\r\n",meas_sen.read());
-    pc.printf("MEM1: %f\r\n",meas_mem1.read());
-    pc.printf("MEM2: %f\r\n",meas_mem2.read());
-    pc.printf("CORE: %f\r\n",meas_core.read());
+    */
 
-    wait(1);
-    gain_ctrl=0;
-    pc.printf("GAIN_CTRL = 0\r\n");
-    pc.printf("SEN: %f\r\n",meas_sen.read());
-    pc.printf("MEM1: %f\r\n",meas_mem1.read());
-    pc.printf("MEM2: %f\r\n",meas_mem2.read());
-    pc.printf("CORE: %f\r\n",meas_core.read());
-    */
+
 
     pc.printf("Powering Down\r\n");
     power_down();
+#ifdef WRITE_RESULTS
+    fclose(results_file);
+#endif
     pc.printf("Done\r\n");
+    while(1) {
+        myled = 1;
+        wait(0.2);
+        myled = 0;
+        wait(0.2);
+    }
 }
 
 int check_FFT_Freq(JTAG &jtag, int fMHz)
@@ -147,26 +192,57 @@
     jtag.writeMemory(ddro_threshold, 100000);
     //jtag.writeMemory(0xe000e104, 0x000000ff); // enable interrupts
 
-    for (int ro_id=3;ro_id<=15;ro_id++) {
-        pc.printf("RO %d\r\n ", ro_id-2);
+    for (int ro_id=3; ro_id<=15; ro_id++) {
+        unsigned int meas1_s, meas1_e, meas2_s, meas2_e;
+        int delta1, delta2;
+        //pc.printf("RO %d\r\n ", ro_id-2);
         jtag.writeMemory(ddro_samp_src, ro_id);
         jtag.writeMemory(ddro_start, 0);
-        int meas1 = jtag.readMemory(ddro_count);
-        pc.printf("Counter starts at: %d  ", meas1);
+        meas1_s = jtag.readMemory(ddro_count);
+        //pc.printf("Counter starts at: %d  ", meas1);
+        jtag.writeMemory(ddro_start, 1);
+        wait_us(50000);
+        jtag.writeMemory(ddro_start, 0);
+        meas1_e = jtag.readMemory(ddro_count);
+        //pc.printf("ends at: %d\r\n", meas1);
+        delta1 = meas1_e - meas1_s;
+
+        jtag.writeMemory(ddro_samp_src, ro_id);
+        jtag.writeMemory(ddro_start, 0);
+        meas2_s = jtag.readMemory(ddro_count);
+        //pc.printf("Counter starts at: %d  ", meas1);
         jtag.writeMemory(ddro_start, 1);
         wait_us(50000);
         jtag.writeMemory(ddro_start, 0);
-        meas1 = jtag.readMemory(ddro_count);
-        pc.printf("ends at: %d\r\n", meas1);
-        
-        jtag.writeMemory(ddro_samp_src, ro_id);
-        jtag.writeMemory(ddro_start, 0);
-        meas1 = jtag.readMemory(ddro_count);
-        pc.printf("Counter starts at: %d  ", meas1);
-        jtag.writeMemory(ddro_start, 1);
-        wait_us(50000);
-        jtag.writeMemory(ddro_start, 0);
-        meas1 = jtag.readMemory(ddro_count);
-        printf("ends at: %d\r\n", meas1);
+        meas2_e = jtag.readMemory(ddro_count);
+        delta2 = meas2_e - meas2_s;
+        //printf("ends at: %d\r\n", meas1);
+
+        if ( (float)delta2/meas1_e>=0.95 && (float)delta2/meas1_e<=1.05 ) {
+            pc.printf("RO %d:  %d\n\r", ro_id, (delta2+meas1_e)/2);
+#ifdef WRITE_RESULTS
+            fprintf(results_file,"RO %d:  %d\n\r", ro_id, (delta2+meas1_e)/2);
+#endif
+        } else if ((float)delta1/meas2_e>=0.95 && (float)delta1/meas2_e<=1.05 ) {
+            pc.printf("RO %d:  %d\n\r", ro_id, (delta1+meas2_e)/2);
+#ifdef WRITE_RESULTS
+            fprintf(results_file,"RO %d:  %d\n\r", ro_id, (delta1+meas2_e)/2);
+#endif
+        } else if ( (float)delta2/delta1 >=0.95 && (float)delta2/delta1<=1.05 ) {
+            pc.printf("RO %d:  %d\n\r", ro_id, (delta1+delta2)/2);
+#ifdef WRITE_RESULTS
+            fprintf(results_file,"RO %d:  %d\n\r", ro_id, (delta1+delta2)/2);
+#endif
+        } else if ( (float)meas2_e/meas1_e >=0.95 && (float)meas2_e/meas1_e<=1.05 ) {
+            pc.printf("RO %d:  %d\n\r", ro_id, (meas1_e+meas2_e)/2);
+#ifdef WRITE_RESULTS
+            fprintf(results_file,"RO %d:  %d\n\r", ro_id, (meas1_e+meas2_e)/2);
+#endif
+        } else {
+            pc.printf("Error in measuring DDRO %d\n\r", ro_id);
+#ifdef WRITE_RESULTS
+            fprintf(results_file,"Error in measuring DDRO %d\n\r", ro_id);
+#endif
+        }
     }
 }