first
Dependencies: SDFileSystemDMA mbed
Refer to:
https://developer.mbed.org/users/mimi3/code/SDFileSystemDMA
Caution
If your board has SRAM less than or equal to 8KB, the 'buffer' size must be set to 512 Bytes.
NUCLEO-F411RE
About 2.5MBytes/sec
NUCLEO-L152RE
About 1MBytes/sec
main.cpp@12:dfa39c797789, 2016-02-23 (annotated)
- Committer:
- mimi3
- Date:
- Tue Feb 23 21:25:22 2016 +0900
- Revision:
- 12:dfa39c797789
- Parent:
- 11:d5fc11ac948a
- Child:
- 18:5fb42182d85d
added: Read verify test.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mimi3 | 0:8f297fe0c66a | 1 | #include "mbed.h" |
mimi3 | 0:8f297fe0c66a | 2 | #include "SDFileSystemDMA.h" |
mimi3 | 3:8b77055a68ec | 3 | |
mimi3 | 9:289de1b6d378 | 4 | /* SD card Interface connection |
mimi3 | 9:289de1b6d378 | 5 | * : aitendo : General |
mimi3 | 9:289de1b6d378 | 6 | * MCU sig. : IFB-254-SD : PIN name |
mimi3 | 9:289de1b6d378 | 7 | --- : 1 : 9 dat2 |
mimi3 | 9:289de1b6d378 | 8 | CS : 2 : 1 cs/dat3 |
mimi3 | 9:289de1b6d378 | 9 | MOSI : 3 : 2 di/cmd |
mimi3 | 9:289de1b6d378 | 10 | GND : 4 : 3 vss1 |
mimi3 | 9:289de1b6d378 | 11 | VCC : 5 : 4 vdd |
mimi3 | 9:289de1b6d378 | 12 | CLK : 6 : 5 clk |
mimi3 | 9:289de1b6d378 | 13 | GND : 7 : 6 vss2 |
mimi3 | 9:289de1b6d378 | 14 | MISO : 8 : 7 do/dat0 |
mimi3 | 9:289de1b6d378 | 15 | --- : 9 : 8 dat1 |
mimi3 | 9:289de1b6d378 | 16 | --- : 10 : 11 wp |
mimi3 | 9:289de1b6d378 | 17 | --- : 11 : 10 cd1 |
mimi3 | 9:289de1b6d378 | 18 | --- : 12 : - case GND |
mimi3 | 9:289de1b6d378 | 19 | */ |
mimi3 | 9:289de1b6d378 | 20 | |
mimi3 | 10:5f6fc7dc119b | 21 | /* You should confirm SPI_DEV macro in "spi_device.h" to specify SPI device number. |
mimi3 | 10:5f6fc7dc119b | 22 | * (default is 1 (SPI1)) |
mimi3 | 10:5f6fc7dc119b | 23 | */ |
mimi3 | 9:289de1b6d378 | 24 | #include "spi_device.h" |
mimi3 | 9:289de1b6d378 | 25 | |
mimi3 | 3:8b77055a68ec | 26 | #define UART_KEY_PRESS 1 |
mimi3 | 3:8b77055a68ec | 27 | |
mimi3 | 10:5f6fc7dc119b | 28 | #define SPI_CLOCK_HZ ( 12 * 1000000 ) |
mimi3 | 0:8f297fe0c66a | 29 | Timer timer; |
mimi3 | 12:dfa39c797789 | 30 | //Serial pc(PA_9,PA_10); |
mimi3 | 1:c39cfc31349d | 31 | Serial pc(USBTX,USBRX); |
mimi3 | 0:8f297fe0c66a | 32 | |
mimi3 | 3:8b77055a68ec | 33 | SDFileSystem sd( MOSI, MISO, SCLK, CS, "sd", SPI_CLOCK_HZ); |
mimi3 | 1:c39cfc31349d | 34 | |
mimi3 | 12:dfa39c797789 | 35 | //char buffer[512*1] __attribute__ ((aligned (4))) ; /* 512 byte */ |
mimi3 | 12:dfa39c797789 | 36 | //char buffer[512*2] __attribute__ ((aligned (4))) ; /* 1024 byte */ |
mimi3 | 12:dfa39c797789 | 37 | char buffer[512*4] __attribute__ ((aligned (4))) ; /* 2028 byte */ |
mimi3 | 12:dfa39c797789 | 38 | //char buffer[512*8] __attribute__ ((aligned (4))) ; /* 4096 byte */ |
mimi3 | 12:dfa39c797789 | 39 | //char buffer[512*16] __attribute__ ((aligned (4))) ; /* 8192 byte */ |
mimi3 | 12:dfa39c797789 | 40 | //char buffer[512*32] __attribute__ ((aligned (4))) ; /* 16384 byte */ |
mimi3 | 12:dfa39c797789 | 41 | |
mimi3 | 0:8f297fe0c66a | 42 | #define X_MEGA_BYTE ((1)*1024*1024) /* 1Mbyte */ |
mimi3 | 0:8f297fe0c66a | 43 | #define FILE_NAME "GPATH" |
mimi3 | 2:f8bd763b5584 | 44 | void wait_key_press(){ |
mimi3 | 3:8b77055a68ec | 45 | #if UART_KEY_PRESS |
mimi3 | 12:dfa39c797789 | 46 | pc.printf("\n-- Select 'r' or 'w' --\n"); |
mimi3 | 12:dfa39c797789 | 47 | fflush(stdout); |
mimi3 | 12:dfa39c797789 | 48 | while(!pc.readable()); |
mimi3 | 12:dfa39c797789 | 49 | volatile int res = pc.getc(); |
mimi3 | 3:8b77055a68ec | 50 | #else |
mimi3 | 0:8f297fe0c66a | 51 | |
mimi3 | 3:8b77055a68ec | 52 | #endif |
mimi3 | 0:8f297fe0c66a | 53 | } |
mimi3 | 0:8f297fe0c66a | 54 | |
mimi3 | 0:8f297fe0c66a | 55 | void writeTest() |
mimi3 | 0:8f297fe0c66a | 56 | { |
mimi3 | 12:dfa39c797789 | 57 | //Test write performance by creating a 1MB file |
mimi3 | 12:dfa39c797789 | 58 | pc.printf("[Write]: Testing %d byte buffer: write performance...", sizeof(buffer)); |
mimi3 | 12:dfa39c797789 | 59 | fflush(stdout); |
mimi3 | 12:dfa39c797789 | 60 | for(uint32_t k = 0; k < sizeof(buffer); k++){ |
mimi3 | 12:dfa39c797789 | 61 | buffer[k] = k & 0xff; |
mimi3 | 12:dfa39c797789 | 62 | } |
mimi3 | 12:dfa39c797789 | 63 | |
mimi3 | 12:dfa39c797789 | 64 | FileHandle* file = sd.open(FILE_NAME, O_WRONLY | O_CREAT | O_TRUNC); |
mimi3 | 12:dfa39c797789 | 65 | if (file != NULL) { |
mimi3 | 12:dfa39c797789 | 66 | timer.start(); |
mimi3 | 12:dfa39c797789 | 67 | for (uint32_t i = 0; i < (X_MEGA_BYTE / sizeof(buffer)); i++) { |
mimi3 | 12:dfa39c797789 | 68 | if (file->write(buffer, sizeof(buffer)) != sizeof(buffer)) { |
mimi3 | 12:dfa39c797789 | 69 | timer.stop(); |
mimi3 | 12:dfa39c797789 | 70 | pc.printf("write error!\n"); |
mimi3 | 12:dfa39c797789 | 71 | timer.reset(); |
mimi3 | 12:dfa39c797789 | 72 | return; |
mimi3 | 12:dfa39c797789 | 73 | } |
mimi3 | 12:dfa39c797789 | 74 | } |
mimi3 | 12:dfa39c797789 | 75 | timer.stop(); |
mimi3 | 12:dfa39c797789 | 76 | if (file->close()) |
mimi3 | 12:dfa39c797789 | 77 | pc.printf("failed to close file!\n"); |
mimi3 | 12:dfa39c797789 | 78 | else{ |
mimi3 | 12:dfa39c797789 | 79 | pc.printf("done!\n\tResult: %d KB/s\n", ( 1024 * 1000000 ) / timer.read_us() ); |
mimi3 | 12:dfa39c797789 | 80 | } |
mimi3 | 12:dfa39c797789 | 81 | timer.reset(); |
mimi3 | 12:dfa39c797789 | 82 | } else { |
mimi3 | 12:dfa39c797789 | 83 | pc.printf("failed to create file!\n"); |
mimi3 | 12:dfa39c797789 | 84 | } |
mimi3 | 0:8f297fe0c66a | 85 | } |
mimi3 | 0:8f297fe0c66a | 86 | |
mimi3 | 0:8f297fe0c66a | 87 | void readTest() |
mimi3 | 0:8f297fe0c66a | 88 | { |
mimi3 | 12:dfa39c797789 | 89 | //Test read performance by reading the 1MB file created by writeTest() |
mimi3 | 12:dfa39c797789 | 90 | pc.printf("[Read]: Testing %d byte buffer: read performance...", sizeof(buffer)); |
mimi3 | 12:dfa39c797789 | 91 | fflush(stdout); |
mimi3 | 12:dfa39c797789 | 92 | FileHandle* file = sd.open(FILE_NAME, O_RDONLY); |
mimi3 | 12:dfa39c797789 | 93 | if (file != NULL) { |
mimi3 | 12:dfa39c797789 | 94 | timer.start(); |
mimi3 | 12:dfa39c797789 | 95 | int iterations = 0; |
mimi3 | 12:dfa39c797789 | 96 | while (file->read(buffer, sizeof(buffer)) == sizeof(buffer)){ |
mimi3 | 12:dfa39c797789 | 97 | iterations++; |
mimi3 | 12:dfa39c797789 | 98 | } |
mimi3 | 12:dfa39c797789 | 99 | timer.stop(); |
mimi3 | 12:dfa39c797789 | 100 | if (iterations != (X_MEGA_BYTE / sizeof(buffer))){ |
mimi3 | 12:dfa39c797789 | 101 | pc.printf("read error!\n"); |
mimi3 | 12:dfa39c797789 | 102 | } |
mimi3 | 12:dfa39c797789 | 103 | else if (file->close()){ |
mimi3 | 12:dfa39c797789 | 104 | pc.printf("failed to close file!\n"); |
mimi3 | 12:dfa39c797789 | 105 | } |
mimi3 | 12:dfa39c797789 | 106 | // else if (sd.remove(FILE_NAME)) |
mimi3 | 12:dfa39c797789 | 107 | // pc.printf("failed to delete file!\n"); |
mimi3 | 12:dfa39c797789 | 108 | else{ |
mimi3 | 12:dfa39c797789 | 109 | pc.printf("done!\n\tResult: %d KB/s\n", ( 1024 * 1000000 ) / timer.read_us()); |
mimi3 | 12:dfa39c797789 | 110 | } |
mimi3 | 12:dfa39c797789 | 111 | timer.reset(); |
mimi3 | 12:dfa39c797789 | 112 | } else { |
mimi3 | 12:dfa39c797789 | 113 | pc.printf("failed to open file!\n"); |
mimi3 | 12:dfa39c797789 | 114 | } |
mimi3 | 12:dfa39c797789 | 115 | } |
mimi3 | 12:dfa39c797789 | 116 | |
mimi3 | 12:dfa39c797789 | 117 | void verifyTest() |
mimi3 | 12:dfa39c797789 | 118 | { |
mimi3 | 12:dfa39c797789 | 119 | int errorCount = 0; |
mimi3 | 12:dfa39c797789 | 120 | //Test read performance by reading the 1MB file created by writeTest() |
mimi3 | 12:dfa39c797789 | 121 | pc.printf("[Read]: Verifying %d byte buffer ...", sizeof(buffer)); |
mimi3 | 12:dfa39c797789 | 122 | fflush(stdout); |
mimi3 | 12:dfa39c797789 | 123 | FileHandle* file = sd.open(FILE_NAME, O_RDONLY); |
mimi3 | 12:dfa39c797789 | 124 | if (file != NULL) { |
mimi3 | 12:dfa39c797789 | 125 | timer.start(); |
mimi3 | 12:dfa39c797789 | 126 | int iterations = 0; |
mimi3 | 12:dfa39c797789 | 127 | while (file->read(buffer, sizeof(buffer)) == sizeof(buffer)){ |
mimi3 | 12:dfa39c797789 | 128 | iterations++; |
mimi3 | 12:dfa39c797789 | 129 | for(uint32_t k = 0; k < sizeof(buffer); k++){ |
mimi3 | 12:dfa39c797789 | 130 | if ( buffer[k] != (k & 0xff) ){ |
mimi3 | 12:dfa39c797789 | 131 | errorCount++; |
mimi3 | 12:dfa39c797789 | 132 | } |
mimi3 | 12:dfa39c797789 | 133 | } |
mimi3 | 12:dfa39c797789 | 134 | } |
mimi3 | 12:dfa39c797789 | 135 | timer.stop(); |
mimi3 | 12:dfa39c797789 | 136 | if (iterations != (X_MEGA_BYTE / sizeof(buffer))){ |
mimi3 | 12:dfa39c797789 | 137 | pc.printf("read error!\n"); |
mimi3 | 12:dfa39c797789 | 138 | } |
mimi3 | 12:dfa39c797789 | 139 | else if (file->close()){ |
mimi3 | 12:dfa39c797789 | 140 | pc.printf("failed to close file!\n"); |
mimi3 | 12:dfa39c797789 | 141 | } |
mimi3 | 12:dfa39c797789 | 142 | // else if (sd.remove(FILE_NAME)) |
mimi3 | 12:dfa39c797789 | 143 | // pc.printf("failed to delete file!\n"); |
mimi3 | 12:dfa39c797789 | 144 | else{ |
mimi3 | 12:dfa39c797789 | 145 | // pc.printf("done!\n\tResult: %d KB/s\n", ( 1024 * 1000000 ) / timer.read_us()); |
mimi3 | 12:dfa39c797789 | 146 | |
mimi3 | 12:dfa39c797789 | 147 | } |
mimi3 | 12:dfa39c797789 | 148 | timer.reset(); |
mimi3 | 12:dfa39c797789 | 149 | } else { |
mimi3 | 12:dfa39c797789 | 150 | pc.printf("failed to open file!\n"); |
mimi3 | 12:dfa39c797789 | 151 | } |
mimi3 | 12:dfa39c797789 | 152 | pc.printf("\n Error Count : %d", errorCount); |
mimi3 | 0:8f297fe0c66a | 153 | } |
mimi3 | 0:8f297fe0c66a | 154 | |
mimi3 | 0:8f297fe0c66a | 155 | int main(){ |
mimi3 | 12:dfa39c797789 | 156 | /* UART Baudrate is 9600bps*/ |
mimi3 | 12:dfa39c797789 | 157 | while(1){ |
mimi3 | 11:d5fc11ac948a | 158 | pc.printf("\n---------------------------------------"); |
mimi3 | 11:d5fc11ac948a | 159 | pc.printf("\nSPI(%d), SysClock= %d Hz",SPI_DEV, SystemCoreClock); |
mimi3 | 9:289de1b6d378 | 160 | pc.printf(" mbed rev.%d", MBED_LIBRARY_VERSION); |
mimi3 | 12:dfa39c797789 | 161 | pc.printf("\nStart SD card accsess test!"); |
mimi3 | 9:289de1b6d378 | 162 | pc.printf("\n[r]: Start Read Test. At least execute [w] onece"); |
mimi3 | 9:289de1b6d378 | 163 | pc.printf("\n[w]: Start Write and Read Test"); |
mimi3 | 12:dfa39c797789 | 164 | pc.printf("\n[v]: Start Read Verify Test. At least execute [w] onece"); |
mimi3 | 12:dfa39c797789 | 165 | pc.printf("\nWriting is very slow, wait tens of seconds."); |
mimi3 | 9:289de1b6d378 | 166 | pc.printf("\n-- Select [r] or [w] --\n"); |
mimi3 | 9:289de1b6d378 | 167 | fflush(stdout); |
mimi3 | 9:289de1b6d378 | 168 | while(!pc.readable()); |
mimi3 | 9:289de1b6d378 | 169 | char ch = pc.getc(); |
mimi3 | 9:289de1b6d378 | 170 | if( ch =='r' ){ |
mimi3 | 9:289de1b6d378 | 171 | readTest(); |
mimi3 | 9:289de1b6d378 | 172 | } else if( ch =='w' ){ |
mimi3 | 12:dfa39c797789 | 173 | writeTest(); |
mimi3 | 12:dfa39c797789 | 174 | readTest(); |
mimi3 | 12:dfa39c797789 | 175 | } else if( ch =='v' ){ |
mimi3 | 12:dfa39c797789 | 176 | verifyTest(); |
mimi3 | 9:289de1b6d378 | 177 | } |
mimi3 | 12:dfa39c797789 | 178 | } |
mimi3 | 0:8f297fe0c66a | 179 | } |
mimi3 | 5:fef1667b832e | 180 |