SD card library
Dependencies: SDFileSystem mbed
Fork of 2545_SD_Card by
main.cpp@0:5448330e1a33, 2016-03-11 (annotated)
- Committer:
- eencae
- Date:
- Fri Mar 11 16:07:41 2016 +0000
- Revision:
- 0:5448330e1a33
- Child:
- 1:ca1280a9d929
Initial commit.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
eencae | 0:5448330e1a33 | 1 | /* 2545_SD_Card Example |
eencae | 0:5448330e1a33 | 2 | |
eencae | 0:5448330e1a33 | 3 | Example of writing data to SD card. |
eencae | 0:5448330e1a33 | 4 | |
eencae | 0:5448330e1a33 | 5 | Based on FTF2014_lab4 Example |
eencae | 0:5448330e1a33 | 6 | |
eencae | 0:5448330e1a33 | 7 | https://developer.mbed.org/teams/Freescale/wiki/FTF2014_workshop |
eencae | 0:5448330e1a33 | 8 | |
eencae | 0:5448330e1a33 | 9 | Craig A. Evans, University of Leeds, Mar 2016 |
eencae | 0:5448330e1a33 | 10 | |
eencae | 0:5448330e1a33 | 11 | */ |
eencae | 0:5448330e1a33 | 12 | |
eencae | 0:5448330e1a33 | 13 | #include "mbed.h" |
eencae | 0:5448330e1a33 | 14 | #include "SDFileSystem.h" |
eencae | 0:5448330e1a33 | 15 | |
eencae | 0:5448330e1a33 | 16 | // Connections to SD card holder on K64F (SPI interface) |
eencae | 0:5448330e1a33 | 17 | SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // MOSI, MISO, SCK, CS |
eencae | 0:5448330e1a33 | 18 | Serial serial(USBTX, USBRX); // for PC debug |
eencae | 0:5448330e1a33 | 19 | |
eencae | 0:5448330e1a33 | 20 | void delete_file(char filename[]); |
eencae | 0:5448330e1a33 | 21 | |
eencae | 0:5448330e1a33 | 22 | int main() |
eencae | 0:5448330e1a33 | 23 | { |
eencae | 0:5448330e1a33 | 24 | serial.baud(115200); // full-speed! |
eencae | 0:5448330e1a33 | 25 | serial.printf("#### SD Card Example #####\n"); |
eencae | 0:5448330e1a33 | 26 | FILE *fp; // this is our file pointer |
eencae | 0:5448330e1a33 | 27 | wait(1); |
eencae | 0:5448330e1a33 | 28 | |
eencae | 0:5448330e1a33 | 29 | // Various examples below - can comment out ones you don't need |
eencae | 0:5448330e1a33 | 30 | |
eencae | 0:5448330e1a33 | 31 | /////////////////////// Deleting file example //////////////////////// |
eencae | 0:5448330e1a33 | 32 | |
eencae | 0:5448330e1a33 | 33 | // comment this line out if you don't want to delete the file! |
eencae | 0:5448330e1a33 | 34 | delete_file("/sd/test.txt"); |
eencae | 0:5448330e1a33 | 35 | |
eencae | 0:5448330e1a33 | 36 | ////////////////////// Simple writing example ////////////////////////// |
eencae | 0:5448330e1a33 | 37 | |
eencae | 0:5448330e1a33 | 38 | // open file for writing ('w') - creates file if it doesn't exist and overwrites |
eencae | 0:5448330e1a33 | 39 | // if it does. If you wish to add a score onto a list, then you can |
eencae | 0:5448330e1a33 | 40 | // append instead 'a'. This will open the file if it exists and start |
eencae | 0:5448330e1a33 | 41 | // writing at the end. It will create the file if it doesn't exist. |
eencae | 0:5448330e1a33 | 42 | fp = fopen("/sd/topscore.txt", "w"); |
eencae | 0:5448330e1a33 | 43 | int top_score = 56; // random example |
eencae | 0:5448330e1a33 | 44 | |
eencae | 0:5448330e1a33 | 45 | if (fp == NULL) { // if it can't open the file then print error message |
eencae | 0:5448330e1a33 | 46 | serial.printf("Error! Unable to open file!\n"); |
eencae | 0:5448330e1a33 | 47 | } else { // opened file so can write |
eencae | 0:5448330e1a33 | 48 | serial.printf("Writing to file...."); |
eencae | 0:5448330e1a33 | 49 | fprintf(fp, "%d",top_score); // ensure data type matches |
eencae | 0:5448330e1a33 | 50 | serial.printf("Done.\n"); |
eencae | 0:5448330e1a33 | 51 | fclose(fp); // ensure you close the file after writing |
eencae | 0:5448330e1a33 | 52 | } |
eencae | 0:5448330e1a33 | 53 | |
eencae | 0:5448330e1a33 | 54 | ////////////////////// Simple reading example ////////////////////////// |
eencae | 0:5448330e1a33 | 55 | |
eencae | 0:5448330e1a33 | 56 | // now open file for reading |
eencae | 0:5448330e1a33 | 57 | fp = fopen("/sd/topscore.txt", "r"); |
eencae | 0:5448330e1a33 | 58 | int stored_top_score = -1; // -1 to demonstrate it has changed after reading |
eencae | 0:5448330e1a33 | 59 | |
eencae | 0:5448330e1a33 | 60 | if (fp == NULL) { // if it can't open the file then print error message |
eencae | 0:5448330e1a33 | 61 | serial.printf("Error! Unable to open file!\n"); |
eencae | 0:5448330e1a33 | 62 | } else { // opened file so can write |
eencae | 0:5448330e1a33 | 63 | fscanf(fp, "%d",&stored_top_score); // ensure data type matches - note address operator (&) |
eencae | 0:5448330e1a33 | 64 | serial.printf("Read %d from file.\n",stored_top_score); |
eencae | 0:5448330e1a33 | 65 | fclose(fp); // ensure you close the file after reading |
eencae | 0:5448330e1a33 | 66 | } |
eencae | 0:5448330e1a33 | 67 | |
eencae | 0:5448330e1a33 | 68 | ///////////////////// Writing list to file example ////////////////////// |
eencae | 0:5448330e1a33 | 69 | |
eencae | 0:5448330e1a33 | 70 | // for this example, I'll create some numbers to write to file in a big list |
eencae | 0:5448330e1a33 | 71 | // a data logger for example will usually append to a file - at a reading |
eencae | 0:5448330e1a33 | 72 | // at the end rather than creating a new file |
eencae | 0:5448330e1a33 | 73 | fp = fopen("/sd/test.txt", "a"); |
eencae | 0:5448330e1a33 | 74 | |
eencae | 0:5448330e1a33 | 75 | if (fp == NULL) { // if it can't open the file then print error message |
eencae | 0:5448330e1a33 | 76 | serial.printf("Error! Unable to open file!\n"); |
eencae | 0:5448330e1a33 | 77 | } else { // opened file so can write |
eencae | 0:5448330e1a33 | 78 | serial.printf("Writing to file...."); |
eencae | 0:5448330e1a33 | 79 | for(int i = 1; i <= 50; i++) { |
eencae | 0:5448330e1a33 | 80 | float dummy = 1000.0F/i; // dummy variable |
eencae | 0:5448330e1a33 | 81 | fprintf(fp, "%d,%f\n",i,dummy); // print formatted string to file (CSV) |
eencae | 0:5448330e1a33 | 82 | } |
eencae | 0:5448330e1a33 | 83 | serial.printf("Done.\n"); |
eencae | 0:5448330e1a33 | 84 | fclose(fp); // ensure you close the file after writing |
eencae | 0:5448330e1a33 | 85 | } |
eencae | 0:5448330e1a33 | 86 | |
eencae | 0:5448330e1a33 | 87 | // you can comment out the writing example to check that the writing has |
eencae | 0:5448330e1a33 | 88 | // worked - when you run it after commenting, it should still open the |
eencae | 0:5448330e1a33 | 89 | // file that exists on the SD card - assuming you didn't delete it! |
eencae | 0:5448330e1a33 | 90 | |
eencae | 0:5448330e1a33 | 91 | /////////////////////// Reading from file example //////////////////////// |
eencae | 0:5448330e1a33 | 92 | |
eencae | 0:5448330e1a33 | 93 | // now open file for reading...note the 'r' |
eencae | 0:5448330e1a33 | 94 | fp = fopen("/sd/test.txt", "r"); |
eencae | 0:5448330e1a33 | 95 | if (fp == NULL) { // if it can't open the file then print error message |
eencae | 0:5448330e1a33 | 96 | serial.printf("Error! Unable to open file!\n"); |
eencae | 0:5448330e1a33 | 97 | } else { |
eencae | 0:5448330e1a33 | 98 | serial.printf("Reading file....\n"); |
eencae | 0:5448330e1a33 | 99 | int i; // create suitable variables to store the data in the file |
eencae | 0:5448330e1a33 | 100 | float value; |
eencae | 0:5448330e1a33 | 101 | |
eencae | 0:5448330e1a33 | 102 | // in this example, we keep reading (using fscanf) until we reach |
eencae | 0:5448330e1a33 | 103 | // the 'end of file'. Note we use the address operator & to write |
eencae | 0:5448330e1a33 | 104 | // to the variables. Also the format of the string must match what |
eencae | 0:5448330e1a33 | 105 | // is in the file |
eencae | 0:5448330e1a33 | 106 | while (fscanf(fp, "%d,%f", &i, &value) != EOF) { |
eencae | 0:5448330e1a33 | 107 | serial.printf("%d,%f\n",i,value); |
eencae | 0:5448330e1a33 | 108 | } |
eencae | 0:5448330e1a33 | 109 | serial.printf("Done.\n"); |
eencae | 0:5448330e1a33 | 110 | fclose(fp); // ensure you close the file after reading |
eencae | 0:5448330e1a33 | 111 | } |
eencae | 0:5448330e1a33 | 112 | |
eencae | 0:5448330e1a33 | 113 | ///////////////// Advanced Reading from file example /////////////////// |
eencae | 0:5448330e1a33 | 114 | |
eencae | 0:5448330e1a33 | 115 | // the previous example just read the values into variables and printed to |
eencae | 0:5448330e1a33 | 116 | // serial, we'll now read files into an array. |
eencae | 0:5448330e1a33 | 117 | |
eencae | 0:5448330e1a33 | 118 | // now open file for reading...note the 'r' |
eencae | 0:5448330e1a33 | 119 | fp = fopen("/sd/test.txt", "r"); |
eencae | 0:5448330e1a33 | 120 | |
eencae | 0:5448330e1a33 | 121 | int n=0; // going to store the number of lines in the file |
eencae | 0:5448330e1a33 | 122 | int *index_array; // pointers to create dynamic arrays later |
eencae | 0:5448330e1a33 | 123 | float *value_array; // note memory will be in heap rather than on the stack |
eencae | 0:5448330e1a33 | 124 | |
eencae | 0:5448330e1a33 | 125 | if (fp == NULL) { // if it can't open the file then print error message |
eencae | 0:5448330e1a33 | 126 | serial.printf("Error! Unable to open file!\n"); |
eencae | 0:5448330e1a33 | 127 | } else { |
eencae | 0:5448330e1a33 | 128 | serial.printf("Counting lines in file....\n"); |
eencae | 0:5448330e1a33 | 129 | //Since we may not know the |
eencae | 0:5448330e1a33 | 130 | // number of lines in the files ahead of time, we'll first count them |
eencae | 0:5448330e1a33 | 131 | // * means scan but don't save |
eencae | 0:5448330e1a33 | 132 | while (fscanf(fp, "%*d,%*f") != EOF) { |
eencae | 0:5448330e1a33 | 133 | n++; // increment counter when read a line |
eencae | 0:5448330e1a33 | 134 | } |
eencae | 0:5448330e1a33 | 135 | |
eencae | 0:5448330e1a33 | 136 | |
eencae | 0:5448330e1a33 | 137 | serial.printf("Read %d lines\n",n); |
eencae | 0:5448330e1a33 | 138 | serial.printf("Creating dynamic arrays...\n"); |
eencae | 0:5448330e1a33 | 139 | // calloc creates an array and initilises to 0 |
eencae | 0:5448330e1a33 | 140 | // malloc returns unitialised array - diffrent syntax |
eencae | 0:5448330e1a33 | 141 | index_array = (int *)calloc(n, sizeof (int)); |
eencae | 0:5448330e1a33 | 142 | value_array = (float *)calloc(n, sizeof (float)); |
eencae | 0:5448330e1a33 | 143 | |
eencae | 0:5448330e1a33 | 144 | int i=0; |
eencae | 0:5448330e1a33 | 145 | rewind(fp); // 'scrolled' to end of file, so go back to beginning |
eencae | 0:5448330e1a33 | 146 | serial.printf("Reading into arrays...\n"); |
eencae | 0:5448330e1a33 | 147 | while (fscanf(fp, "%d,%f",&index_array[i],&value_array[i]) != EOF) { |
eencae | 0:5448330e1a33 | 148 | i++; // read data into array and increment index |
eencae | 0:5448330e1a33 | 149 | } |
eencae | 0:5448330e1a33 | 150 | serial.printf("Done.\n"); |
eencae | 0:5448330e1a33 | 151 | fclose(fp); // ensure you close the file after reading |
eencae | 0:5448330e1a33 | 152 | } |
eencae | 0:5448330e1a33 | 153 | |
eencae | 0:5448330e1a33 | 154 | // we should now have the data in the arrays, will print to serial to check |
eencae | 0:5448330e1a33 | 155 | for(int i=0; i<n ; i++) { |
eencae | 0:5448330e1a33 | 156 | serial.printf("[%d] %d,%f\n",i,index_array[i],value_array[i]); |
eencae | 0:5448330e1a33 | 157 | } |
eencae | 0:5448330e1a33 | 158 | |
eencae | 0:5448330e1a33 | 159 | /////////////////////////////////////////////////// |
eencae | 0:5448330e1a33 | 160 | serial.printf("End of SD card example\n"); |
eencae | 0:5448330e1a33 | 161 | } |
eencae | 0:5448330e1a33 | 162 | |
eencae | 0:5448330e1a33 | 163 | void delete_file(char filename[]) |
eencae | 0:5448330e1a33 | 164 | { |
eencae | 0:5448330e1a33 | 165 | serial.printf("Deleting file '%s'...",filename); |
eencae | 0:5448330e1a33 | 166 | FILE *fp = fopen(filename, "r"); // try and open file |
eencae | 0:5448330e1a33 | 167 | if (fp != NULL) { // if it does open... |
eencae | 0:5448330e1a33 | 168 | fclose(fp); // close it |
eencae | 0:5448330e1a33 | 169 | remove(filename); // and then delete |
eencae | 0:5448330e1a33 | 170 | serial.printf("Done!\n"); |
eencae | 0:5448330e1a33 | 171 | } |
eencae | 0:5448330e1a33 | 172 | // if we can't open it, it doesn't exist and so we can't delete it |
eencae | 0:5448330e1a33 | 173 | } |