1 month, 2 weeks ago.

How to get the Fat filesystem working again after removal and re-insertion of the SD card in OS5

In my project I like to log on the SD card. This works nice till the card is removed. After re-inserting the card I can't get access to the card anymore. I made a small sample program to show the problem:

SD Remove-Insert test program

// Tested boards:   Nucleo-F411RE,  Nucleo-L152RE

//  Include --------------------------------------------------------------------
#include    "mbed.h"
#include    "SDBlockDevice.h"
#include    "FATFileSystem.h"
#include    <stdlib.h>

//  Definition -----------------------------------------------------------------
#define     USER_SW_ON      0

//  Constructor ----------------------------------------------------------------
Serial          pc(USBTX, USBRX, 115200);
DigitalIn       user_sw(USER_BUTTON);
SDBlockDevice   sd(PB_5, PB_4, PB_3, PC_5, 8000000); // SD card over SPI PB 4/5/3 and PC5
FATFileSystem   fs("fs");


//------------------------------------------------------------------------------
//  Control Program
//------------------------------------------------------------------------------
int main()
{
    int linecount = 0;
    FILE* fp;

    while(1){
    
        pc.printf("\n Program start \n");
    
        pc.printf("Init: %d\n",sd.init());
        pc.printf("mount: %d\n",fs.mount(&sd));
        
        fp = fopen("fs/TestFile", "a");
        pc.printf("filepointer: %d\n",fp);
        
        if (fp != 0) {
            fprintf(fp, "Line %d\n", linecount);
            pc.printf("Line %d added\n", linecount);
            fclose(fp);
        }
    
        pc.printf("unmount: %d\n",fs.unmount());
        pc.printf("deinit: %d\n",sd.deinit());
    
        linecount++;
    
        while (user_sw == USER_SW_ON){wait(0.05);};
        while (user_sw != USER_SW_ON){wait(0.05);};
    }
}    

As long as the SD card is inserted the program works nice and inserts a line after every press on the user button. When I remove and insert the SD card, the next time I press the button, fs.mount(&sd) returns -5 and the file can not be opened anymore.

I tried several variations wit mount/unmount and init/deinit but without success

I guess I'm overlooking something, but can't figure out wat it is. I'am new to C++ so it'may be something simple.

Comment on this question

1 Answer

1 month, 1 week ago.

Hello Gerrit,

I haven't tested it but the following might work:

// Tested boards:   Nucleo-F411RE,  Nucleo-L152RE
 
//  Include --------------------------------------------------------------------
#include    "mbed.h"
#include    "SDBlockDevice.h"
#include    "FATFileSystem.h"
#include    <stdlib.h>
 
//  Definition -----------------------------------------------------------------
#define     USER_SW_ON      0
 
//  Constructor ----------------------------------------------------------------
Serial          pc(USBTX, USBRX, 115200);
DigitalIn       user_sw(USER_BUTTON);
SDBlockDevice*  sd;
FATFileSystem   fs("fs");
 
 
//------------------------------------------------------------------------------
//  Control Program
//------------------------------------------------------------------------------
int main()
{
    int linecount = 0;
    FILE* fp;
 
    while(1){
    
        pc.printf("\n Program start \n");

        pc.printf("constuct:\n");
        sd = new SDBlockDevice(PB_5, PB_4, PB_3, PC_5, 8000000); // SD card over SPI PB 4/5/3 and PC5;
    
        pc.printf("init: %d\n",sd->init());
        pc.printf("mount: %d\n",fs.mount(sd));
        
        fp = fopen("fs/TestFile", "a");
        pc.printf("filepointer: %d\n",fp);
        
        if (fp != 0) {
            fprintf(fp, "Line %d\n", linecount);
            pc.printf("Line %d added\n", linecount);
            fclose(fp);
        }
    
        pc.printf("unmount: %d\n",fs.unmount());
        pc.printf("deinit: %d\n",sd->deinit());
        pc.printf("destruct:\n);
        delete sd;
    
        linecount++;
    

        while (user_sw == USER_SW_ON){wait(0.05);};
        while (user_sw != USER_SW_ON){wait(0.05);};
    }
}  

Thanks Zoltan, The solution works nice, even better than I expected. When I press the button without a card inserted, the construct waits till the card is inserted and writes the additional line.

posted by Gerrit Wolters 30 Oct 2019