Version 1

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

Committer:
d4rth_j0k3r
Date:
Fri Sep 04 13:36:18 2020 +0000
Revision:
3:3e570f67f243
Parent:
1:1fbbef4e4497
Fnish

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 1:1fbbef4e4497 5 #include <cctype>
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 3:3e570f67f243 35
d4rth_j0k3r 3:3e570f67f243 36 case ST_P3 :
d4rth_j0k3r 3:3e570f67f243 37 test_flash_3();
d4rth_j0k3r 3:3e570f67f243 38 MS_State = ST_P4;
d4rth_j0k3r 3:3e570f67f243 39 break;
d4rth_j0k3r 0:11abb8d64f62 40
d4rth_j0k3r 3:3e570f67f243 41 case ST_P4 :
d4rth_j0k3r 0:11abb8d64f62 42 test_ADC();
d4rth_j0k3r 0:11abb8d64f62 43 MS_State = ST_END;
d4rth_j0k3r 0:11abb8d64f62 44 break;
d4rth_j0k3r 0:11abb8d64f62 45
d4rth_j0k3r 0:11abb8d64f62 46 case ST_END :
d4rth_j0k3r 0:11abb8d64f62 47 printf("\n\r==== TESTS RESULTS ====\n\n\r");
d4rth_j0k3r 0:11abb8d64f62 48 printf("Test done with %d data\n\r",MAX_DATA);
d4rth_j0k3r 3:3e570f67f243 49 printf("1. Flash 1-by-1 : %d\n\r",nr_error[0]);
d4rth_j0k3r 3:3e570f67f243 50 printf("2. Flash array : %d\n\r",nr_error[1]);
d4rth_j0k3r 3:3e570f67f243 51 printf("3. Flash multiples arrays : %d\n\r",nr_error[1]);
d4rth_j0k3r 0:11abb8d64f62 52 printf("\nRestart test session (0/1)?\n\r") ;
d4rth_j0k3r 0:11abb8d64f62 53 printf("> ") ;
d4rth_j0k3r 0:11abb8d64f62 54 scanf("%d", &go_out) ;
d4rth_j0k3r 0:11abb8d64f62 55 printf("Choice %d",go_out);
d4rth_j0k3r 0:11abb8d64f62 56 if (go_out) MS_State = ST_INIT;
d4rth_j0k3r 0:11abb8d64f62 57 break;
d4rth_j0k3r 0:11abb8d64f62 58 }
d4rth_j0k3r 0:11abb8d64f62 59 }
d4rth_j0k3r 0:11abb8d64f62 60 printf("\n\r==== SESSION ENDED ====\n\n\r");
d4rth_j0k3r 0:11abb8d64f62 61 }
d4rth_j0k3r 0:11abb8d64f62 62
d4rth_j0k3r 0:11abb8d64f62 63 /* ===========================
d4rth_j0k3r 0:11abb8d64f62 64 = FUNCTIONS =
d4rth_j0k3r 0:11abb8d64f62 65 ===========================*/
d4rth_j0k3r 0:11abb8d64f62 66
d4rth_j0k3r 0:11abb8d64f62 67 // ==== INITIALIZATION ====
d4rth_j0k3r 0:11abb8d64f62 68 void init(){
d4rth_j0k3r 0:11abb8d64f62 69 printf("\n\r==== Pneumoscope TestBench ====\n\n\r");
d4rth_j0k3r 0:11abb8d64f62 70 printf("Enter size of array\n\r") ;
d4rth_j0k3r 0:11abb8d64f62 71 printf("> ") ;
d4rth_j0k3r 0:11abb8d64f62 72 scanf("%d", &MAX_DATA) ;
d4rth_j0k3r 0:11abb8d64f62 73
d4rth_j0k3r 3:3e570f67f243 74 start_add = 0;
d4rth_j0k3r 3:3e570f67f243 75
d4rth_j0k3r 0:11abb8d64f62 76 // Resistance to size of 0
d4rth_j0k3r 0:11abb8d64f62 77 MAX_DATA = (MAX_DATA == 0) ? 16 : MAX_DATA;
d4rth_j0k3r 0:11abb8d64f62 78 printf("\n\rTest with %d bytes\n\r",MAX_DATA);
d4rth_j0k3r 0:11abb8d64f62 79
d4rth_j0k3r 0:11abb8d64f62 80 for (int i = 0; i < 3; i++){
d4rth_j0k3r 0:11abb8d64f62 81 nr_error[i] = 0;
d4rth_j0k3r 0:11abb8d64f62 82 }
d4rth_j0k3r 0:11abb8d64f62 83
d4rth_j0k3r 3:3e570f67f243 84 button.rise(&flip_led); // Button Interrupt
d4rth_j0k3r 3:3e570f67f243 85
d4rth_j0k3r 0:11abb8d64f62 86 // Next State
d4rth_j0k3r 0:11abb8d64f62 87 MS_State = ST_P1;
d4rth_j0k3r 0:11abb8d64f62 88 }
d4rth_j0k3r 0:11abb8d64f62 89
d4rth_j0k3r 0:11abb8d64f62 90 // ==== TEST FLASH 1 ====
d4rth_j0k3r 0:11abb8d64f62 91 void test_flash_1(){
d4rth_j0k3r 0:11abb8d64f62 92 printf("\n\r==== 1. Flash Memory Test 1-by-1 ====\n\n\r");
d4rth_j0k3r 0:11abb8d64f62 93 clear_memory();
d4rth_j0k3r 0:11abb8d64f62 94
d4rth_j0k3r 0:11abb8d64f62 95 uint8_t data_in, data_out;
d4rth_j0k3r 0:11abb8d64f62 96
d4rth_j0k3r 3:3e570f67f243 97 for (int address = start_add; address < MAX_DATA; address++){
d4rth_j0k3r 0:11abb8d64f62 98 // Generating data to be written
d4rth_j0k3r 0:11abb8d64f62 99 data_in = rand() % 256;
d4rth_j0k3r 0:11abb8d64f62 100 data_out = 0;
d4rth_j0k3r 0:11abb8d64f62 101
d4rth_j0k3r 0:11abb8d64f62 102 // Send data
d4rth_j0k3r 0:11abb8d64f62 103 spi_mem.writeEnable();
d4rth_j0k3r 0:11abb8d64f62 104 spi_mem.programPage(address, &data_in, 1);
d4rth_j0k3r 0:11abb8d64f62 105 while(spi_mem.readStatus() & 0x01){}
d4rth_j0k3r 0:11abb8d64f62 106
d4rth_j0k3r 0:11abb8d64f62 107 // Read data written
d4rth_j0k3r 0:11abb8d64f62 108 data_out = spi_mem.read8(address);
d4rth_j0k3r 3:3e570f67f243 109 nr_error[0] += error_check(address, data_in, data_out);
d4rth_j0k3r 3:3e570f67f243 110 //if (nr_error[0]) break;
d4rth_j0k3r 0:11abb8d64f62 111 }
d4rth_j0k3r 0:11abb8d64f62 112
d4rth_j0k3r 0:11abb8d64f62 113 read_range(MAX_DATA);
d4rth_j0k3r 0:11abb8d64f62 114 if (!nr_error[0]){
d4rth_j0k3r 0:11abb8d64f62 115 printf("Test passed successfully\n\r");
d4rth_j0k3r 0:11abb8d64f62 116 }
d4rth_j0k3r 0:11abb8d64f62 117 }
d4rth_j0k3r 0:11abb8d64f62 118
d4rth_j0k3r 0:11abb8d64f62 119 // ==== TEST FLASH 2 ====
d4rth_j0k3r 0:11abb8d64f62 120 void test_flash_2(){
d4rth_j0k3r 0:11abb8d64f62 121 printf("\n\n\r==== 2. Flash Memory Test Array ====\n\n\r");
d4rth_j0k3r 0:11abb8d64f62 122 clear_memory();
d4rth_j0k3r 0:11abb8d64f62 123
d4rth_j0k3r 0:11abb8d64f62 124 uint8_t data_in[MAX_DATA], data_out[MAX_DATA];
d4rth_j0k3r 0:11abb8d64f62 125 int address;
d4rth_j0k3r 0:11abb8d64f62 126
d4rth_j0k3r 0:11abb8d64f62 127 // Generating data to be written
d4rth_j0k3r 3:3e570f67f243 128 for (address = start_add; address < MAX_DATA; address++){
d4rth_j0k3r 0:11abb8d64f62 129 data_in[address] = rand() % 256;
d4rth_j0k3r 0:11abb8d64f62 130 data_out[address] = 0;
d4rth_j0k3r 0:11abb8d64f62 131 }
d4rth_j0k3r 0:11abb8d64f62 132
d4rth_j0k3r 0:11abb8d64f62 133 // Send data
d4rth_j0k3r 0:11abb8d64f62 134 spi_mem.writeEnable();
d4rth_j0k3r 3:3e570f67f243 135 spi_mem.programPage(start_add, data_in, MAX_DATA);
d4rth_j0k3r 0:11abb8d64f62 136 while(spi_mem.readStatus() & 0x01){} // Check status
d4rth_j0k3r 0:11abb8d64f62 137 printf("[INFO] Data sent\n\r");
d4rth_j0k3r 0:11abb8d64f62 138
d4rth_j0k3r 0:11abb8d64f62 139 // Read data written
d4rth_j0k3r 3:3e570f67f243 140 printf("Checking In/Out Data ");
d4rth_j0k3r 3:3e570f67f243 141 for (address = start_add; address < MAX_DATA; address++){
d4rth_j0k3r 0:11abb8d64f62 142 printf(".");
d4rth_j0k3r 0:11abb8d64f62 143 data_out[address] = spi_mem.read8(address);
d4rth_j0k3r 3:3e570f67f243 144 nr_error[1] += error_check(address, data_in[address], data_out[address]);
d4rth_j0k3r 3:3e570f67f243 145 //if (nr_error[1]) break;
d4rth_j0k3r 0:11abb8d64f62 146 }
d4rth_j0k3r 0:11abb8d64f62 147 printf("\n\r");
d4rth_j0k3r 0:11abb8d64f62 148
d4rth_j0k3r 0:11abb8d64f62 149 read_range(MAX_DATA);
d4rth_j0k3r 0:11abb8d64f62 150 if (!nr_error[1]){
d4rth_j0k3r 0:11abb8d64f62 151 printf("Test passed successfully\n\r");
d4rth_j0k3r 0:11abb8d64f62 152 }
d4rth_j0k3r 0:11abb8d64f62 153 }
d4rth_j0k3r 0:11abb8d64f62 154
d4rth_j0k3r 3:3e570f67f243 155 // ==== TEST FLASH 3 ====
d4rth_j0k3r 3:3e570f67f243 156 void test_flash_3(){
d4rth_j0k3r 3:3e570f67f243 157 printf("\n\n\r==== 3. Flash Memory Test Multiple Arrays ====\n\n\r");
d4rth_j0k3r 3:3e570f67f243 158 clear_memory();
d4rth_j0k3r 3:3e570f67f243 159
d4rth_j0k3r 3:3e570f67f243 160 uint8_t data_size = 4;
d4rth_j0k3r 3:3e570f67f243 161 uint8_t data_in[256*data_size], data_out[256*data_size];
d4rth_j0k3r 3:3e570f67f243 162 uint8_t buffer[256];
d4rth_j0k3r 3:3e570f67f243 163 int address;
d4rth_j0k3r 3:3e570f67f243 164
d4rth_j0k3r 3:3e570f67f243 165 // Generating data to be written
d4rth_j0k3r 3:3e570f67f243 166 for (int iter = 0; iter < 256*data_size; iter++){
d4rth_j0k3r 3:3e570f67f243 167 data_in[iter] = rand() % 256;
d4rth_j0k3r 3:3e570f67f243 168 data_out[iter] = 0;
d4rth_j0k3r 3:3e570f67f243 169 }
d4rth_j0k3r 3:3e570f67f243 170 for (int iter = 0; iter < 256; iter++){
d4rth_j0k3r 3:3e570f67f243 171 buffer[iter] = 0;
d4rth_j0k3r 3:3e570f67f243 172 }
d4rth_j0k3r 3:3e570f67f243 173
d4rth_j0k3r 3:3e570f67f243 174 for (int nbr = 0; nbr < data_size; nbr++){
d4rth_j0k3r 3:3e570f67f243 175 // Send data
d4rth_j0k3r 3:3e570f67f243 176 for (int idx = 0; idx < 256; idx++){
d4rth_j0k3r 3:3e570f67f243 177 buffer[idx] = data_in[nbr*256+idx];
d4rth_j0k3r 3:3e570f67f243 178 }
d4rth_j0k3r 3:3e570f67f243 179 spi_mem.writeEnable();
d4rth_j0k3r 3:3e570f67f243 180 spi_mem.programPage(nbr*256, buffer, 256);
d4rth_j0k3r 3:3e570f67f243 181 while(spi_mem.readStatus() & 0x01){} // Check status
d4rth_j0k3r 3:3e570f67f243 182 }
d4rth_j0k3r 3:3e570f67f243 183 printf("[INFO] Data sent\n\r");
d4rth_j0k3r 3:3e570f67f243 184
d4rth_j0k3r 3:3e570f67f243 185 // Read data written
d4rth_j0k3r 3:3e570f67f243 186 printf("Checking In/Out Data ");
d4rth_j0k3r 3:3e570f67f243 187 for (address = 0; address < data_size*256; address++){
d4rth_j0k3r 3:3e570f67f243 188 printf(".");
d4rth_j0k3r 3:3e570f67f243 189 data_out[address] = spi_mem.read8(address);
d4rth_j0k3r 3:3e570f67f243 190 nr_error[2] += error_check(address, data_in[address], data_out[address]);
d4rth_j0k3r 3:3e570f67f243 191 //if (nr_error[1]) break;
d4rth_j0k3r 3:3e570f67f243 192 }
d4rth_j0k3r 3:3e570f67f243 193 printf("\n\r");
d4rth_j0k3r 3:3e570f67f243 194
d4rth_j0k3r 3:3e570f67f243 195 read_range(data_size*256);
d4rth_j0k3r 3:3e570f67f243 196 if (!nr_error[2]){
d4rth_j0k3r 3:3e570f67f243 197 printf("Test passed successfully\n\r");
d4rth_j0k3r 3:3e570f67f243 198 }
d4rth_j0k3r 3:3e570f67f243 199 }
d4rth_j0k3r 3:3e570f67f243 200
d4rth_j0k3r 0:11abb8d64f62 201 // ==== TEST ADC ====
d4rth_j0k3r 0:11abb8d64f62 202 void test_ADC(){
d4rth_j0k3r 3:3e570f67f243 203 printf("\n\n\r==== 4. ADC Test ====\n\n\r");
d4rth_j0k3r 0:11abb8d64f62 204 clear_memory();
d4rth_j0k3r 0:11abb8d64f62 205
d4rth_j0k3r 0:11abb8d64f62 206 // ADC 12 bits framerate 200 ksps during 10 sec : 4 Mo
d4rth_j0k3r 0:11abb8d64f62 207
d4rth_j0k3r 0:11abb8d64f62 208 uint8_t data_in[2], data_out[2];
d4rth_j0k3r 0:11abb8d64f62 209 float analog_in, analog_out;
d4rth_j0k3r 3:3e570f67f243 210 int max_adc = 32;
d4rth_j0k3r 0:11abb8d64f62 211
d4rth_j0k3r 0:11abb8d64f62 212 // Generating data to be written
d4rth_j0k3r 0:11abb8d64f62 213 for (int i = 0; i < max_adc; i++){
d4rth_j0k3r 0:11abb8d64f62 214 analog_in = Mic_Pat.read();
d4rth_j0k3r 0:11abb8d64f62 215 printf("%d : float = %f / hex = %x\n\r",i, analog_in, *(unsigned int*)&analog_in);
d4rth_j0k3r 0:11abb8d64f62 216 data_in[0] = ((*(unsigned int*)&analog_in) >> 8) & 0xFF;
d4rth_j0k3r 0:11abb8d64f62 217 data_in[1] = (*(unsigned int*)&analog_in) & 0xFF;
d4rth_j0k3r 0:11abb8d64f62 218
d4rth_j0k3r 0:11abb8d64f62 219 // Send data
d4rth_j0k3r 0:11abb8d64f62 220 spi_mem.writeEnable();
d4rth_j0k3r 0:11abb8d64f62 221 spi_mem.programPage(2*i, data_in, 2);
d4rth_j0k3r 0:11abb8d64f62 222 while(spi_mem.readStatus() & 0x01){} // Check status
d4rth_j0k3r 0:11abb8d64f62 223 wait_us(5);
d4rth_j0k3r 0:11abb8d64f62 224 }
d4rth_j0k3r 0:11abb8d64f62 225 read_range(max_adc*2);
d4rth_j0k3r 0:11abb8d64f62 226 }
d4rth_j0k3r 0:11abb8d64f62 227
d4rth_j0k3r 0:11abb8d64f62 228 // =========================
d4rth_j0k3r 0:11abb8d64f62 229 // ==== OTHER FUNCTIONS ====
d4rth_j0k3r 3:3e570f67f243 230 void flip_led(){
d4rth_j0k3r 3:3e570f67f243 231 myled = !myled;
d4rth_j0k3r 3:3e570f67f243 232 }
d4rth_j0k3r 0:11abb8d64f62 233
d4rth_j0k3r 0:11abb8d64f62 234 void read_range(int max_data){
d4rth_j0k3r 0:11abb8d64f62 235 printf("[INFO] Memory State :");
d4rth_j0k3r 0:11abb8d64f62 236 uint8_t data[max_data] ;
d4rth_j0k3r 0:11abb8d64f62 237 int current_address = 0;
d4rth_j0k3r 0:11abb8d64f62 238 for (int i = 0 ; current_address < max_data; i++ ) {
d4rth_j0k3r 0:11abb8d64f62 239 printf("\n\r%d : ", current_address ) ;
d4rth_j0k3r 0:11abb8d64f62 240 for (int j = 0 ; j < 8 ; j++ ) {
d4rth_j0k3r 0:11abb8d64f62 241 data[j] = spi_mem.read8(current_address ) ;
d4rth_j0k3r 0:11abb8d64f62 242 printf("%02X ", data[j]) ;
d4rth_j0k3r 0:11abb8d64f62 243 current_address++;
d4rth_j0k3r 0:11abb8d64f62 244 }
d4rth_j0k3r 0:11abb8d64f62 245 }
d4rth_j0k3r 0:11abb8d64f62 246 printf("\n\n\r");
d4rth_j0k3r 0:11abb8d64f62 247 }
d4rth_j0k3r 0:11abb8d64f62 248
d4rth_j0k3r 0:11abb8d64f62 249 void clear_memory(){
d4rth_j0k3r 0:11abb8d64f62 250 spi_mem.writeEnable();
d4rth_j0k3r 0:11abb8d64f62 251 spi_mem.sectorErase(0);
d4rth_j0k3r 3:3e570f67f243 252 while(spi_mem.readStatus() & 0x01){} // Check status
d4rth_j0k3r 0:11abb8d64f62 253 printf("[INFO] Memory Cleared\n\r");
d4rth_j0k3r 0:11abb8d64f62 254 }
d4rth_j0k3r 0:11abb8d64f62 255
d4rth_j0k3r 0:11abb8d64f62 256 bool error_check(int index, unsigned char data_in, unsigned char data_out){
d4rth_j0k3r 0:11abb8d64f62 257 if (data_in != data_out){
d4rth_j0k3r 0:11abb8d64f62 258 printf("[ERROR] Address %d : In = %d / Out = %d\n\r",index ,data_in,data_out);
d4rth_j0k3r 0:11abb8d64f62 259 return 1;
d4rth_j0k3r 0:11abb8d64f62 260 }else{
d4rth_j0k3r 0:11abb8d64f62 261 return 0;
d4rth_j0k3r 0:11abb8d64f62 262 }
d4rth_j0k3r 0:11abb8d64f62 263 }