Ich lese eine Datei aus dem SPI Flash mit FATFS-Dateisystem auf der STM32F103-Plattform, auf der FreeRTOS ausgeführt wird. Ich kann erfolgreich Dateien mit einer Größe von weniger als 2048 lesen, aber wenn ich eine Datei mit einer Größe von mehr als 2048 lese (da ich in Blöcken von 128 Bytes lese), liest sie nur bis zu 2048 Bytes und f_read gibt bei Datei den Fehler 'FR_INT_ERR' zurück Zeiger auf Position über 2048 Bytes verschieben.
Unten in meinem Code für Read Write Test. f_size zeigt die richtige Dateigröße an. Aber wenn ich lese, gibt es einen Fehler. Wenn ich die Schleife bis zum Ende der Datei zum Lesen von Daten schleichend ausführe, gibt sie immer wieder den letzten Block vor 2048 Bytes zurück.
FRESULT xRes;
FIL xFile;
const char cWBuffer[] = "Hello FAT World! 0123456789abcdef";
char cRBuffer[128]
xRes = f_mount(0, &s_xVolume);
printf("\r\n mount result %d successful!",xRes);
#ifdef FAT_MAKEFS_TEST
// this delay is to prevent the FAT corruption after a systenm reset.
Delay_us( 200 );
printf("\r\n MAKE FS Test");
printf("\r\n format the ext FLASH");
printf("\r\n please wait...");
xRes = f_mkfs(0, SFD_FORMAT, 4096 *10 );
printf("\r\n Format result : %d ",xRes);
assert(xRes == FR_OK);
#endif
#ifdef FAT_WRITE_TEST
Delay_us( 1000 );
printf("\r\n WRITE Test");
printf("\r\n open file: W+CA");
xRes = f_open(&xFile, filename, FA_WRITE|FA_CREATE_ALWAYS);
printf("\r\n Open result : %d ",xRes);
assert(xRes == FR_OK);
printf("\r\n write file");
for(i=0;i<1024;i++)
{
xRes = f_write(&xFile, cWBuffer, strlen(cWBuffer), &n);
//printf("\r\n Write result : %d, bytes = %d ",xRes,n);
assert(xRes == FR_OK);
//assert(n == strlen(cWBuffer));
}
printf("\r\n close file");
xRes = f_close(&xFile);
assert(xRes == FR_OK);
#endif
#ifdef FAT_READ_TEST
Delay_us( 100 );
printf("\r\n READ Test");
printf("\r\n open file: R+OE");
xRes = f_open(&xFile, filename, FA_READ|FA_OPEN_EXISTING);
printf("\r\n Open result : %d ",xRes);
assert(xRes == FR_OK);
fs = f_size(&xFile);
printf("\r\n read file size = %d",fs);
i=0;
fs = f_size(&xFile);
while(i<fs)
{
xRes = f_read(&xFile, cRBuffer, sizeof(cRBuffer), &m);
printf("\r\n Read result : %d, bytes read = %d, i =%d ",xRes,m,tread);
tread += m;
assert(xRes == FR_OK);
//assert(m == strlen(cWBuffer));
}
printf("\r\n Total bytes read = %d",tread);
printf("\r\n close file");
printf("\r\n file content:");
printf("%s :\n",cRBuffer);
xRes = f_close(&xFile);
assert(xRes == FR_OK);
#endif
printf("\r\n test success!!!");