Version 1
Dependencies: mbed-os-retarget-segger-rtt SPI_MX25R
source/main.cpp@0:11abb8d64f62, 2020-08-06 (annotated)
- 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?
User | Revision | Line number | New 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 | } |