![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Version 1
Dependencies: mbed-os-retarget-segger-rtt SPI_MX25R
source/main.cpp
- Committer:
- d4rth_j0k3r
- Date:
- 2020-09-04
- Revision:
- 3:3e570f67f243
- Parent:
- 1:1fbbef4e4497
File content as of revision 3:3e570f67f243:
/* Pneumoscope Version 1.0 Florian CHAYS */ #include <cctype> #include <events/mbed_events.h> #include "mbed.h" #include "ble/BLE.h" #include "SPI_MX25R.h" #include <main.h> /* ========================== = MAIN = ==========================*/ int main() { MS_State = ST_INIT; int go_out = 1; while(go_out){ switch(MS_State){ case ST_INIT : init(); break; case ST_P1 : test_flash_1(); MS_State = ST_P2; break; case ST_P2 : test_flash_2(); MS_State = ST_P3; break; case ST_P3 : test_flash_3(); MS_State = ST_P4; break; case ST_P4 : test_ADC(); MS_State = ST_END; break; case ST_END : printf("\n\r==== TESTS RESULTS ====\n\n\r"); printf("Test done with %d data\n\r",MAX_DATA); printf("1. Flash 1-by-1 : %d\n\r",nr_error[0]); printf("2. Flash array : %d\n\r",nr_error[1]); printf("3. Flash multiples arrays : %d\n\r",nr_error[1]); printf("\nRestart test session (0/1)?\n\r") ; printf("> ") ; scanf("%d", &go_out) ; printf("Choice %d",go_out); if (go_out) MS_State = ST_INIT; break; } } printf("\n\r==== SESSION ENDED ====\n\n\r"); } /* =========================== = FUNCTIONS = ===========================*/ // ==== INITIALIZATION ==== void init(){ printf("\n\r==== Pneumoscope TestBench ====\n\n\r"); printf("Enter size of array\n\r") ; printf("> ") ; scanf("%d", &MAX_DATA) ; start_add = 0; // Resistance to size of 0 MAX_DATA = (MAX_DATA == 0) ? 16 : MAX_DATA; printf("\n\rTest with %d bytes\n\r",MAX_DATA); for (int i = 0; i < 3; i++){ nr_error[i] = 0; } button.rise(&flip_led); // Button Interrupt // Next State MS_State = ST_P1; } // ==== TEST FLASH 1 ==== void test_flash_1(){ printf("\n\r==== 1. Flash Memory Test 1-by-1 ====\n\n\r"); clear_memory(); uint8_t data_in, data_out; for (int address = start_add; address < MAX_DATA; address++){ // Generating data to be written data_in = rand() % 256; data_out = 0; // Send data spi_mem.writeEnable(); spi_mem.programPage(address, &data_in, 1); while(spi_mem.readStatus() & 0x01){} // Read data written data_out = spi_mem.read8(address); nr_error[0] += error_check(address, data_in, data_out); //if (nr_error[0]) break; } read_range(MAX_DATA); if (!nr_error[0]){ printf("Test passed successfully\n\r"); } } // ==== TEST FLASH 2 ==== void test_flash_2(){ printf("\n\n\r==== 2. Flash Memory Test Array ====\n\n\r"); clear_memory(); uint8_t data_in[MAX_DATA], data_out[MAX_DATA]; int address; // Generating data to be written for (address = start_add; address < MAX_DATA; address++){ data_in[address] = rand() % 256; data_out[address] = 0; } // Send data spi_mem.writeEnable(); spi_mem.programPage(start_add, data_in, MAX_DATA); while(spi_mem.readStatus() & 0x01){} // Check status printf("[INFO] Data sent\n\r"); // Read data written printf("Checking In/Out Data "); for (address = start_add; address < MAX_DATA; address++){ printf("."); data_out[address] = spi_mem.read8(address); nr_error[1] += error_check(address, data_in[address], data_out[address]); //if (nr_error[1]) break; } printf("\n\r"); read_range(MAX_DATA); if (!nr_error[1]){ printf("Test passed successfully\n\r"); } } // ==== TEST FLASH 3 ==== void test_flash_3(){ printf("\n\n\r==== 3. Flash Memory Test Multiple Arrays ====\n\n\r"); clear_memory(); uint8_t data_size = 4; uint8_t data_in[256*data_size], data_out[256*data_size]; uint8_t buffer[256]; int address; // Generating data to be written for (int iter = 0; iter < 256*data_size; iter++){ data_in[iter] = rand() % 256; data_out[iter] = 0; } for (int iter = 0; iter < 256; iter++){ buffer[iter] = 0; } for (int nbr = 0; nbr < data_size; nbr++){ // Send data for (int idx = 0; idx < 256; idx++){ buffer[idx] = data_in[nbr*256+idx]; } spi_mem.writeEnable(); spi_mem.programPage(nbr*256, buffer, 256); while(spi_mem.readStatus() & 0x01){} // Check status } printf("[INFO] Data sent\n\r"); // Read data written printf("Checking In/Out Data "); for (address = 0; address < data_size*256; address++){ printf("."); data_out[address] = spi_mem.read8(address); nr_error[2] += error_check(address, data_in[address], data_out[address]); //if (nr_error[1]) break; } printf("\n\r"); read_range(data_size*256); if (!nr_error[2]){ printf("Test passed successfully\n\r"); } } // ==== TEST ADC ==== void test_ADC(){ printf("\n\n\r==== 4. ADC Test ====\n\n\r"); clear_memory(); // ADC 12 bits framerate 200 ksps during 10 sec : 4 Mo uint8_t data_in[2], data_out[2]; float analog_in, analog_out; int max_adc = 32; // Generating data to be written for (int i = 0; i < max_adc; i++){ analog_in = Mic_Pat.read(); printf("%d : float = %f / hex = %x\n\r",i, analog_in, *(unsigned int*)&analog_in); data_in[0] = ((*(unsigned int*)&analog_in) >> 8) & 0xFF; data_in[1] = (*(unsigned int*)&analog_in) & 0xFF; // Send data spi_mem.writeEnable(); spi_mem.programPage(2*i, data_in, 2); while(spi_mem.readStatus() & 0x01){} // Check status wait_us(5); } read_range(max_adc*2); } // ========================= // ==== OTHER FUNCTIONS ==== void flip_led(){ myled = !myled; } void read_range(int max_data){ printf("[INFO] Memory State :"); uint8_t data[max_data] ; int current_address = 0; for (int i = 0 ; current_address < max_data; i++ ) { printf("\n\r%d : ", current_address ) ; for (int j = 0 ; j < 8 ; j++ ) { data[j] = spi_mem.read8(current_address ) ; printf("%02X ", data[j]) ; current_address++; } } printf("\n\n\r"); } void clear_memory(){ spi_mem.writeEnable(); spi_mem.sectorErase(0); while(spi_mem.readStatus() & 0x01){} // Check status printf("[INFO] Memory Cleared\n\r"); } bool error_check(int index, unsigned char data_in, unsigned char data_out){ if (data_in != data_out){ printf("[ERROR] Address %d : In = %d / Out = %d\n\r",index ,data_in,data_out); return 1; }else{ return 0; } }