Version 1

Dependencies:   mbed-os-retarget-segger-rtt SPI_MX25R

Committer:
d4rth_j0k3r
Date:
Thu Aug 06 12:32:40 2020 +0000
Revision:
0:11abb8d64f62
Child:
1:1fbbef4e4497
Test 1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
d4rth_j0k3r 0:11abb8d64f62 1 /* Pneumoscope Version 1.0
d4rth_j0k3r 0:11abb8d64f62 2 Florian CHAYS
d4rth_j0k3r 0:11abb8d64f62 3 */
d4rth_j0k3r 0:11abb8d64f62 4
d4rth_j0k3r 0:11abb8d64f62 5 #include <ctype.h>
d4rth_j0k3r 0:11abb8d64f62 6 #include <events/mbed_events.h>
d4rth_j0k3r 0:11abb8d64f62 7 #include "mbed.h"
d4rth_j0k3r 0:11abb8d64f62 8 #include "ble/BLE.h"
d4rth_j0k3r 0:11abb8d64f62 9 #include "SPI_MX25R.h"
d4rth_j0k3r 0:11abb8d64f62 10 #include <main.h>
d4rth_j0k3r 0:11abb8d64f62 11
d4rth_j0k3r 0:11abb8d64f62 12 /* ==========================
d4rth_j0k3r 0:11abb8d64f62 13 = MAIN =
d4rth_j0k3r 0:11abb8d64f62 14 ==========================*/
d4rth_j0k3r 0:11abb8d64f62 15 int main()
d4rth_j0k3r 0:11abb8d64f62 16 {
d4rth_j0k3r 0:11abb8d64f62 17 MS_State = ST_INIT;
d4rth_j0k3r 0:11abb8d64f62 18 int go_out = 1;
d4rth_j0k3r 0:11abb8d64f62 19
d4rth_j0k3r 0:11abb8d64f62 20 while(go_out){
d4rth_j0k3r 0:11abb8d64f62 21 switch(MS_State){
d4rth_j0k3r 0:11abb8d64f62 22 case ST_INIT :
d4rth_j0k3r 0:11abb8d64f62 23 init();
d4rth_j0k3r 0:11abb8d64f62 24 break;
d4rth_j0k3r 0:11abb8d64f62 25
d4rth_j0k3r 0:11abb8d64f62 26 case ST_P1 :
d4rth_j0k3r 0:11abb8d64f62 27 test_flash_1();
d4rth_j0k3r 0:11abb8d64f62 28 MS_State = ST_P2;
d4rth_j0k3r 0:11abb8d64f62 29 break;
d4rth_j0k3r 0:11abb8d64f62 30
d4rth_j0k3r 0:11abb8d64f62 31 case ST_P2 :
d4rth_j0k3r 0:11abb8d64f62 32 test_flash_2();
d4rth_j0k3r 0:11abb8d64f62 33 MS_State = ST_P3;
d4rth_j0k3r 0:11abb8d64f62 34 break;
d4rth_j0k3r 0:11abb8d64f62 35
d4rth_j0k3r 0:11abb8d64f62 36 case ST_P3 :
d4rth_j0k3r 0:11abb8d64f62 37 test_ADC();
d4rth_j0k3r 0:11abb8d64f62 38 MS_State = ST_END;
d4rth_j0k3r 0:11abb8d64f62 39 break;
d4rth_j0k3r 0:11abb8d64f62 40
d4rth_j0k3r 0:11abb8d64f62 41 case ST_END :
d4rth_j0k3r 0:11abb8d64f62 42 printf("\n\r==== TESTS RESULTS ====\n\n\r");
d4rth_j0k3r 0:11abb8d64f62 43 printf("Test done with %d data\n\r",MAX_DATA);
d4rth_j0k3r 0:11abb8d64f62 44 printf("1. Flash 1-by-1 : %d\n\r",nr_error[0]);
d4rth_j0k3r 0:11abb8d64f62 45 printf("2. Flash array : %d\n\r",nr_error[1]);
d4rth_j0k3r 0:11abb8d64f62 46 printf("3. ADC : %d\n\r",nr_error[2]);
d4rth_j0k3r 0:11abb8d64f62 47 printf("\nRestart test session (0/1)?\n\r") ;
d4rth_j0k3r 0:11abb8d64f62 48 printf("> ") ;
d4rth_j0k3r 0:11abb8d64f62 49 scanf("%d", &go_out) ;
d4rth_j0k3r 0:11abb8d64f62 50 printf("Choice %d",go_out);
d4rth_j0k3r 0:11abb8d64f62 51 if (go_out) MS_State = ST_INIT;
d4rth_j0k3r 0:11abb8d64f62 52 break;
d4rth_j0k3r 0:11abb8d64f62 53 }
d4rth_j0k3r 0:11abb8d64f62 54 }
d4rth_j0k3r 0:11abb8d64f62 55 printf("\n\r==== SESSION ENDED ====\n\n\r");
d4rth_j0k3r 0:11abb8d64f62 56 }
d4rth_j0k3r 0:11abb8d64f62 57
d4rth_j0k3r 0:11abb8d64f62 58 /* ===========================
d4rth_j0k3r 0:11abb8d64f62 59 = FUNCTIONS =
d4rth_j0k3r 0:11abb8d64f62 60 ===========================*/
d4rth_j0k3r 0:11abb8d64f62 61
d4rth_j0k3r 0:11abb8d64f62 62 // ==== INITIALIZATION ====
d4rth_j0k3r 0:11abb8d64f62 63 void init(){
d4rth_j0k3r 0:11abb8d64f62 64 printf("\n\r==== Pneumoscope TestBench ====\n\n\r");
d4rth_j0k3r 0:11abb8d64f62 65 printf("Enter size of array\n\r") ;
d4rth_j0k3r 0:11abb8d64f62 66 printf("> ") ;
d4rth_j0k3r 0:11abb8d64f62 67 scanf("%d", &MAX_DATA) ;
d4rth_j0k3r 0:11abb8d64f62 68
d4rth_j0k3r 0:11abb8d64f62 69 // Resistance to size of 0
d4rth_j0k3r 0:11abb8d64f62 70 MAX_DATA = (MAX_DATA == 0) ? 16 : MAX_DATA;
d4rth_j0k3r 0:11abb8d64f62 71 printf("\n\rTest with %d bytes\n\r",MAX_DATA);
d4rth_j0k3r 0:11abb8d64f62 72
d4rth_j0k3r 0:11abb8d64f62 73 for (int i = 0; i < 3; i++){
d4rth_j0k3r 0:11abb8d64f62 74 nr_error[i] = 0;
d4rth_j0k3r 0:11abb8d64f62 75 }
d4rth_j0k3r 0:11abb8d64f62 76
d4rth_j0k3r 0:11abb8d64f62 77 // Next State
d4rth_j0k3r 0:11abb8d64f62 78
d4rth_j0k3r 0:11abb8d64f62 79 MS_State = ST_P1;
d4rth_j0k3r 0:11abb8d64f62 80 }
d4rth_j0k3r 0:11abb8d64f62 81
d4rth_j0k3r 0:11abb8d64f62 82 // ==== TEST FLASH 1 ====
d4rth_j0k3r 0:11abb8d64f62 83 void test_flash_1(){
d4rth_j0k3r 0:11abb8d64f62 84 printf("\n\r==== 1. Flash Memory Test 1-by-1 ====\n\n\r");
d4rth_j0k3r 0:11abb8d64f62 85 clear_memory();
d4rth_j0k3r 0:11abb8d64f62 86 reset_leds();
d4rth_j0k3r 0:11abb8d64f62 87 myled_2.write(0);
d4rth_j0k3r 0:11abb8d64f62 88
d4rth_j0k3r 0:11abb8d64f62 89 uint8_t data_in, data_out;
d4rth_j0k3r 0:11abb8d64f62 90
d4rth_j0k3r 0:11abb8d64f62 91 for (int address = 0; address < MAX_DATA; address++){
d4rth_j0k3r 0:11abb8d64f62 92 // Generating data to be written
d4rth_j0k3r 0:11abb8d64f62 93 data_in = rand() % 256;
d4rth_j0k3r 0:11abb8d64f62 94 data_out = 0;
d4rth_j0k3r 0:11abb8d64f62 95
d4rth_j0k3r 0:11abb8d64f62 96 // Send data
d4rth_j0k3r 0:11abb8d64f62 97 spi_mem.writeEnable();
d4rth_j0k3r 0:11abb8d64f62 98 spi_mem.programPage(address, &data_in, 1);
d4rth_j0k3r 0:11abb8d64f62 99 while(spi_mem.readStatus() & 0x01){}
d4rth_j0k3r 0:11abb8d64f62 100
d4rth_j0k3r 0:11abb8d64f62 101 // Read data written
d4rth_j0k3r 0:11abb8d64f62 102 data_out = spi_mem.read8(address);
d4rth_j0k3r 0:11abb8d64f62 103 nr_error[0] = error_check(address, data_in, data_out);
d4rth_j0k3r 0:11abb8d64f62 104 if (nr_error[0]) break;
d4rth_j0k3r 0:11abb8d64f62 105 }
d4rth_j0k3r 0:11abb8d64f62 106
d4rth_j0k3r 0:11abb8d64f62 107 read_range(MAX_DATA);
d4rth_j0k3r 0:11abb8d64f62 108 if (!nr_error[0]){
d4rth_j0k3r 0:11abb8d64f62 109 printf("Test passed successfully\n\r");
d4rth_j0k3r 0:11abb8d64f62 110 }
d4rth_j0k3r 0:11abb8d64f62 111 }
d4rth_j0k3r 0:11abb8d64f62 112
d4rth_j0k3r 0:11abb8d64f62 113 // ==== TEST FLASH 2 ====
d4rth_j0k3r 0:11abb8d64f62 114 void test_flash_2(){
d4rth_j0k3r 0:11abb8d64f62 115 printf("\n\n\r==== 2. Flash Memory Test Array ====\n\n\r");
d4rth_j0k3r 0:11abb8d64f62 116 clear_memory();
d4rth_j0k3r 0:11abb8d64f62 117 reset_leds();
d4rth_j0k3r 0:11abb8d64f62 118 myled_3.write(0);
d4rth_j0k3r 0:11abb8d64f62 119
d4rth_j0k3r 0:11abb8d64f62 120 uint8_t data_in[MAX_DATA], data_out[MAX_DATA];
d4rth_j0k3r 0:11abb8d64f62 121 int address;
d4rth_j0k3r 0:11abb8d64f62 122
d4rth_j0k3r 0:11abb8d64f62 123 // Generating data to be written
d4rth_j0k3r 0:11abb8d64f62 124 for (address = 0; address < MAX_DATA; address++){
d4rth_j0k3r 0:11abb8d64f62 125 data_in[address] = rand() % 256;
d4rth_j0k3r 0:11abb8d64f62 126 data_out[address] = 0;
d4rth_j0k3r 0:11abb8d64f62 127 }
d4rth_j0k3r 0:11abb8d64f62 128
d4rth_j0k3r 0:11abb8d64f62 129 // Send data
d4rth_j0k3r 0:11abb8d64f62 130 spi_mem.writeEnable();
d4rth_j0k3r 0:11abb8d64f62 131 spi_mem.programPage(0, data_in, MAX_DATA);
d4rth_j0k3r 0:11abb8d64f62 132 while(spi_mem.readStatus() & 0x01){} // Check status
d4rth_j0k3r 0:11abb8d64f62 133 printf("[INFO] Data sent\n\r");
d4rth_j0k3r 0:11abb8d64f62 134
d4rth_j0k3r 0:11abb8d64f62 135 // Read data written
d4rth_j0k3r 0:11abb8d64f62 136 printf("Checking in/Out Data ");
d4rth_j0k3r 0:11abb8d64f62 137 for (address = 0; address < MAX_DATA; address++){
d4rth_j0k3r 0:11abb8d64f62 138 printf(".");
d4rth_j0k3r 0:11abb8d64f62 139 data_out[address] = spi_mem.read8(address);
d4rth_j0k3r 0:11abb8d64f62 140 nr_error[1] = error_check(address, data_in[address], data_out[address]);
d4rth_j0k3r 0:11abb8d64f62 141 if (nr_error[1]) break;
d4rth_j0k3r 0:11abb8d64f62 142 }
d4rth_j0k3r 0:11abb8d64f62 143 printf("\n\r");
d4rth_j0k3r 0:11abb8d64f62 144
d4rth_j0k3r 0:11abb8d64f62 145 read_range(MAX_DATA);
d4rth_j0k3r 0:11abb8d64f62 146 if (!nr_error[1]){
d4rth_j0k3r 0:11abb8d64f62 147 printf("Test passed successfully\n\r");
d4rth_j0k3r 0:11abb8d64f62 148 }
d4rth_j0k3r 0:11abb8d64f62 149 }
d4rth_j0k3r 0:11abb8d64f62 150
d4rth_j0k3r 0:11abb8d64f62 151 // ==== TEST ADC ====
d4rth_j0k3r 0:11abb8d64f62 152 void test_ADC(){
d4rth_j0k3r 0:11abb8d64f62 153 printf("\n\n\r==== 3. ADC Test ====\n\n\r");
d4rth_j0k3r 0:11abb8d64f62 154 clear_memory();
d4rth_j0k3r 0:11abb8d64f62 155 reset_leds();
d4rth_j0k3r 0:11abb8d64f62 156 myled_4.write(0);
d4rth_j0k3r 0:11abb8d64f62 157
d4rth_j0k3r 0:11abb8d64f62 158 // ADC 12 bits framerate 200 ksps during 10 sec : 4 Mo
d4rth_j0k3r 0:11abb8d64f62 159
d4rth_j0k3r 0:11abb8d64f62 160 uint8_t data_in[2], data_out[2];
d4rth_j0k3r 0:11abb8d64f62 161 float analog_in, analog_out;
d4rth_j0k3r 0:11abb8d64f62 162 int max_adc = 64;
d4rth_j0k3r 0:11abb8d64f62 163
d4rth_j0k3r 0:11abb8d64f62 164 // Generating data to be written
d4rth_j0k3r 0:11abb8d64f62 165 for (int i = 0; i < max_adc; i++){
d4rth_j0k3r 0:11abb8d64f62 166 analog_in = Mic_Pat.read();
d4rth_j0k3r 0:11abb8d64f62 167 printf("%d : float = %f / hex = %x\n\r",i, analog_in, *(unsigned int*)&analog_in);
d4rth_j0k3r 0:11abb8d64f62 168 data_in[0] = ((*(unsigned int*)&analog_in) >> 8) & 0xFF;
d4rth_j0k3r 0:11abb8d64f62 169 data_in[1] = (*(unsigned int*)&analog_in) & 0xFF;
d4rth_j0k3r 0:11abb8d64f62 170
d4rth_j0k3r 0:11abb8d64f62 171 // Send data
d4rth_j0k3r 0:11abb8d64f62 172 spi_mem.writeEnable();
d4rth_j0k3r 0:11abb8d64f62 173 spi_mem.programPage(2*i, data_in, 2);
d4rth_j0k3r 0:11abb8d64f62 174 while(spi_mem.readStatus() & 0x01){} // Check status
d4rth_j0k3r 0:11abb8d64f62 175 wait_us(5);
d4rth_j0k3r 0:11abb8d64f62 176 }
d4rth_j0k3r 0:11abb8d64f62 177 read_range(max_adc*2);
d4rth_j0k3r 0:11abb8d64f62 178 }
d4rth_j0k3r 0:11abb8d64f62 179
d4rth_j0k3r 0:11abb8d64f62 180 // =========================
d4rth_j0k3r 0:11abb8d64f62 181 // ==== OTHER FUNCTIONS ====
d4rth_j0k3r 0:11abb8d64f62 182
d4rth_j0k3r 0:11abb8d64f62 183 void read_range(int max_data){
d4rth_j0k3r 0:11abb8d64f62 184 printf("[INFO] Memory State :");
d4rth_j0k3r 0:11abb8d64f62 185 uint8_t data[max_data] ;
d4rth_j0k3r 0:11abb8d64f62 186 int current_address = 0;
d4rth_j0k3r 0:11abb8d64f62 187 for (int i = 0 ; current_address < max_data; i++ ) {
d4rth_j0k3r 0:11abb8d64f62 188 printf("\n\r%d : ", current_address ) ;
d4rth_j0k3r 0:11abb8d64f62 189 for (int j = 0 ; j < 8 ; j++ ) {
d4rth_j0k3r 0:11abb8d64f62 190 data[j] = spi_mem.read8(current_address ) ;
d4rth_j0k3r 0:11abb8d64f62 191 printf("%02X ", data[j]) ;
d4rth_j0k3r 0:11abb8d64f62 192 current_address++;
d4rth_j0k3r 0:11abb8d64f62 193 }
d4rth_j0k3r 0:11abb8d64f62 194 }
d4rth_j0k3r 0:11abb8d64f62 195 printf("\n\n\r");
d4rth_j0k3r 0:11abb8d64f62 196 }
d4rth_j0k3r 0:11abb8d64f62 197
d4rth_j0k3r 0:11abb8d64f62 198 void reset_leds(){
d4rth_j0k3r 0:11abb8d64f62 199 myled_1.write(1);
d4rth_j0k3r 0:11abb8d64f62 200 myled_2.write(1);
d4rth_j0k3r 0:11abb8d64f62 201 myled_3.write(1);
d4rth_j0k3r 0:11abb8d64f62 202 myled_4.write(1);
d4rth_j0k3r 0:11abb8d64f62 203 }
d4rth_j0k3r 0:11abb8d64f62 204
d4rth_j0k3r 0:11abb8d64f62 205 void clear_memory(){
d4rth_j0k3r 0:11abb8d64f62 206 spi_mem.writeEnable();
d4rth_j0k3r 0:11abb8d64f62 207 spi_mem.sectorErase(0);
d4rth_j0k3r 0:11abb8d64f62 208 read_range(MAX_DATA);
d4rth_j0k3r 0:11abb8d64f62 209 printf("[INFO] Memory Cleared\n\r");
d4rth_j0k3r 0:11abb8d64f62 210 }
d4rth_j0k3r 0:11abb8d64f62 211
d4rth_j0k3r 0:11abb8d64f62 212 bool error_check(int index, unsigned char data_in, unsigned char data_out){
d4rth_j0k3r 0:11abb8d64f62 213 if (data_in != data_out){
d4rth_j0k3r 0:11abb8d64f62 214 printf("[ERROR] Address %d : In = %d / Out = %d\n\r",index ,data_in,data_out);
d4rth_j0k3r 0:11abb8d64f62 215 return 1;
d4rth_j0k3r 0:11abb8d64f62 216 }else{
d4rth_j0k3r 0:11abb8d64f62 217 return 0;
d4rth_j0k3r 0:11abb8d64f62 218 }
d4rth_j0k3r 0:11abb8d64f62 219 }