We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
I have a PCB board with stm32 F411 as the MCU.
MCU communicates with a microSD card through SPI(5). I used SPI instead of SDIO because of not enough pins.
I use some open source library to read/write SD card.
Now my problem is if the file size is larger than allocation unit size (AUS), f_gets throws error once file pointer walks past the AUS size boundary.
For example, if AUS is 16k/16384, and there is a text file larger than 16k. I use f_gets to read line by line, once it reaches the line, which runs across 16384 bytes, f_gets returns error.
I tested a few AUS numbers, the error happens consistently at the same file location or line, where the total bytes read runs across AUS boundary.
However, there no such problem when I do writing. I have tried writing files of different sizes below AUS, more than AUS, and a few times of AUS: f_write does not throw any error, and I can see the file content in when I open the file on SD card in Windows as exactly what I intend to write.
Any one has any idea what causes the error in f_gets?
I have found where and why I got the error.
This is my code to read a text file line by line:
fres = f_open(&fil, volt_file_name, FA_READ); if(fres == FR_OK) { char line[32]; /* Line buffer */ int i1 = 1; int total_size = 0; i1 = 0; while(f_gets(line, sizeof line, &fil) != 0) { ... } //close your file f_close(&fil); }
For file handler, fil, after f_open, the value of fil->obj->fs->fs_type is 3, i.e.FAT32; however after calling f_gets(), that value becomes a random number. So when f_read is called by f_gets and the file pointer is on the cluster boundary, get_fat is called, which checks the file type. Since the file type values is not expected, an internal error is thrown out.
Next I need to check how and why fs_type is unintentionally changed in f_gets(). Any one has good suggestion?
BTW, I use STMCubeIDE instead of Keil IDE.