test for sd card

Dependencies:   SDFileSystem mbed

Fork of SDFileSystem_HelloWorld by Neil Thiessen

Committer:
pes3
Date:
Thu Mar 29 14:49:49 2018 +0000
Revision:
26:280dfa8b03ac
Parent:
20:ec1c4f02d50e
Storage;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
neilt6 0:8f2b6eed2a9d 1 #include "mbed.h"
neilt6 0:8f2b6eed2a9d 2 #include "SDFileSystem.h"
neilt6 0:8f2b6eed2a9d 3
neilt6 10:ae649a596123 4 Timer timer;
pes3 26:280dfa8b03ac 5
pes3 26:280dfa8b03ac 6 DigitalIn button(PC_13, PullUp);
pes3 26:280dfa8b03ac 7
pes3 26:280dfa8b03ac 8 SDFileSystem sd(PA_7, PA_6, PA_5, PB_6, "sd", PA_8, SDFileSystem::SWITCH_NONE, 25000000);
neilt6 10:ae649a596123 9 char buffer[4096];
neilt6 10:ae649a596123 10
neilt6 10:ae649a596123 11 void writeTest()
neilt6 10:ae649a596123 12 {
neilt6 10:ae649a596123 13 //Test write performance by creating a 1MB file
neilt6 10:ae649a596123 14 printf("Testing %iB write performance...", sizeof(buffer));
neilt6 10:ae649a596123 15 FileHandle* file = sd.open("Test File.bin", O_WRONLY | O_CREAT | O_TRUNC);
neilt6 10:ae649a596123 16 if (file != NULL) {
neilt6 10:ae649a596123 17 timer.start();
neilt6 10:ae649a596123 18 for (int i = 0; i < (1048576 / sizeof(buffer)); i++) {
neilt6 10:ae649a596123 19 if (file->write(buffer, sizeof(buffer)) != sizeof(buffer)) {
neilt6 10:ae649a596123 20 timer.stop();
neilt6 10:ae649a596123 21 printf("write error!\n");
neilt6 10:ae649a596123 22 timer.reset();
neilt6 10:ae649a596123 23 return;
neilt6 10:ae649a596123 24 }
neilt6 10:ae649a596123 25 }
neilt6 10:ae649a596123 26 timer.stop();
neilt6 10:ae649a596123 27 if (file->close())
neilt6 10:ae649a596123 28 printf("failed to close file!\n");
neilt6 10:ae649a596123 29 else
neilt6 10:ae649a596123 30 printf("done!\n\tResult: %.2fKB/s\n", 1024 / (timer.read_us() / 1000000.0));
neilt6 10:ae649a596123 31 timer.reset();
neilt6 10:ae649a596123 32 } else {
neilt6 10:ae649a596123 33 printf("failed to create file!\n");
neilt6 10:ae649a596123 34 }
neilt6 10:ae649a596123 35 }
neilt6 10:ae649a596123 36
neilt6 10:ae649a596123 37 void readTest()
neilt6 10:ae649a596123 38 {
neilt6 10:ae649a596123 39 //Test read performance by reading the 1MB file created by writeTest()
neilt6 10:ae649a596123 40 printf("Testing %iB read performance...", sizeof(buffer));
neilt6 10:ae649a596123 41 FileHandle* file = sd.open("Test File.bin", O_RDONLY);
neilt6 10:ae649a596123 42 if (file != NULL) {
neilt6 10:ae649a596123 43 timer.start();
neilt6 12:bd8b17cd6a7b 44 int iterations = 0;
neilt6 12:bd8b17cd6a7b 45 while (file->read(buffer, sizeof(buffer)) == sizeof(buffer))
neilt6 12:bd8b17cd6a7b 46 iterations++;
neilt6 10:ae649a596123 47 timer.stop();
neilt6 12:bd8b17cd6a7b 48 if (iterations != (1048576 / sizeof(buffer)))
neilt6 12:bd8b17cd6a7b 49 printf("read error!\n");
neilt6 12:bd8b17cd6a7b 50 else if (file->close())
neilt6 10:ae649a596123 51 printf("failed to close file!\n");
neilt6 12:bd8b17cd6a7b 52 else if (sd.remove("Test File.bin"))
neilt6 12:bd8b17cd6a7b 53 printf("failed to delete file!\n");
neilt6 12:bd8b17cd6a7b 54 else
neilt6 12:bd8b17cd6a7b 55 printf("done!\n\tResult: %.2fKB/s\n", 1024 / (timer.read_us() / 1000000.0));
neilt6 10:ae649a596123 56 timer.reset();
neilt6 10:ae649a596123 57 } else {
neilt6 10:ae649a596123 58 printf("failed to open file!\n");
neilt6 10:ae649a596123 59 }
neilt6 10:ae649a596123 60 }
neilt6 0:8f2b6eed2a9d 61
neilt6 0:8f2b6eed2a9d 62 int main()
neilt6 0:8f2b6eed2a9d 63 {
neilt6 12:bd8b17cd6a7b 64 //Configure CRC, large frames, and write validation
neilt6 10:ae649a596123 65 sd.crc(true);
neilt6 7:17ca3091939f 66 sd.large_frames(true);
neilt6 12:bd8b17cd6a7b 67 sd.write_validation(true);
neilt6 7:17ca3091939f 68
neilt6 10:ae649a596123 69 //Fill the buffer with random data for the write test
neilt6 10:ae649a596123 70 srand(time(NULL));
neilt6 10:ae649a596123 71 for (int i = 0; i < sizeof(buffer); i++)
neilt6 10:ae649a596123 72 buffer[i] = rand();
neilt6 10:ae649a596123 73
neilt6 0:8f2b6eed2a9d 74 while(1) {
neilt6 17:e5b7469082c8 75 //Simple button debouncing
neilt6 17:e5b7469082c8 76 wait(0.5);
neilt6 17:e5b7469082c8 77
neilt6 0:8f2b6eed2a9d 78 //Print the start message
neilt6 0:8f2b6eed2a9d 79 printf("\nPress the button to perform tests: ");
neilt6 0:8f2b6eed2a9d 80
neilt6 0:8f2b6eed2a9d 81 //Wait for the button to be pressed
neilt6 0:8f2b6eed2a9d 82 while(button);
neilt6 0:8f2b6eed2a9d 83
neilt6 19:ae979143c796 84 //Make sure a card is present
neilt6 19:ae979143c796 85 if (!sd.card_present()) {
neilt6 19:ae979143c796 86 printf("\nNo card present!\n");
neilt6 19:ae979143c796 87 continue;
neilt6 19:ae979143c796 88 }
neilt6 19:ae979143c796 89
neilt6 19:ae979143c796 90 //Try to mount the SD card
neilt6 19:ae979143c796 91 printf("\nMounting SD card...");
neilt6 19:ae979143c796 92 if (sd.mount() != 0) {
neilt6 19:ae979143c796 93 printf("failed!\n");
neilt6 19:ae979143c796 94 continue;
neilt6 19:ae979143c796 95 }
neilt6 19:ae979143c796 96 printf("success!\n");
neilt6 19:ae979143c796 97
neilt6 17:e5b7469082c8 98 //Display the card type
neilt6 19:ae979143c796 99 printf("\tCard type: ");
neilt6 17:e5b7469082c8 100 SDFileSystem::CardType cardType = sd.card_type();
neilt6 17:e5b7469082c8 101 if (cardType == SDFileSystem::CARD_NONE)
neilt6 0:8f2b6eed2a9d 102 printf("None\n");
neilt6 17:e5b7469082c8 103 else if (cardType == SDFileSystem::CARD_MMC)
neilt6 0:8f2b6eed2a9d 104 printf("MMC\n");
neilt6 17:e5b7469082c8 105 else if (cardType == SDFileSystem::CARD_SD)
neilt6 0:8f2b6eed2a9d 106 printf("SD\n");
neilt6 17:e5b7469082c8 107 else if (cardType == SDFileSystem::CARD_SDHC)
neilt6 0:8f2b6eed2a9d 108 printf("SDHC\n");
neilt6 0:8f2b6eed2a9d 109 else
neilt6 0:8f2b6eed2a9d 110 printf("Unknown\n");
neilt6 17:e5b7469082c8 111
neilt6 17:e5b7469082c8 112 //Display the card capacity
neilt6 20:ec1c4f02d50e 113 printf("\tSectors: %u\n", sd.disk_sectors());
neilt6 19:ae979143c796 114 printf("\tCapacity: %.1fMB\n", sd.disk_sectors() / 2048.0);
neilt6 0:8f2b6eed2a9d 115
neilt6 17:e5b7469082c8 116 /*//Format the card
neilt6 17:e5b7469082c8 117 printf("Formatting SD card...");
neilt6 17:e5b7469082c8 118 if (sd.format() != 0) {
neilt6 17:e5b7469082c8 119 printf("failed!\n");
neilt6 17:e5b7469082c8 120 continue;
neilt6 17:e5b7469082c8 121 }
neilt6 17:e5b7469082c8 122 printf("success!\n");*/
neilt6 10:ae649a596123 123
neilt6 17:e5b7469082c8 124 //Perform a read/write test
neilt6 10:ae649a596123 125 writeTest();
neilt6 10:ae649a596123 126 readTest();
neilt6 0:8f2b6eed2a9d 127
neilt6 17:e5b7469082c8 128 //Unmount the SD card
neilt6 10:ae649a596123 129 sd.unmount();
pes3 26:280dfa8b03ac 130
pes3 26:280dfa8b03ac 131 printf("Hello World!\n");
pes3 26:280dfa8b03ac 132
pes3 26:280dfa8b03ac 133 mkdir("/sd/mydir", 0777);
pes3 26:280dfa8b03ac 134
pes3 26:280dfa8b03ac 135 FILE *fp = fopen("/sd/mydir/sdtest.txt", "w");
pes3 26:280dfa8b03ac 136 if(fp == NULL) {
pes3 26:280dfa8b03ac 137 error("Could not open file for write\n");
pes3 26:280dfa8b03ac 138 }
pes3 26:280dfa8b03ac 139 fprintf(fp, "Hello fun SD Card World!");
pes3 26:280dfa8b03ac 140 fclose(fp);
pes3 26:280dfa8b03ac 141
pes3 26:280dfa8b03ac 142 printf("Goodbye World!\n");
pes3 26:280dfa8b03ac 143
neilt6 0:8f2b6eed2a9d 144 }
neilt6 0:8f2b6eed2a9d 145 }