Estoy leyendo un archivo del sistema de archivos SPI Flash con FATFS, en la plataforma STM32F103 que ejecuta FreeRTOS. Puedo leer exitosamente el archivo de tamaño menor al 2048, pero si leo un archivo de tamaño mayor al 2048 (ya que estoy leyendo en trozos de 128 bytes) solo lee hasta 2048 bytes y f_read devuelve el error 'FR_INT_ERR' cuando el archivo el puntero se mueve a una ubicación por encima de 2048 bytes.
Abajo en mi código para la prueba de lectura y escritura. f_size es mostrar el tamaño correcto del archivo. Pero cuando leo, da error. Si ejecuto el bucle hasta el final del archivo para leer datos, siempre devuelve el último fragmento antes de 2048 bytes una y otra vez.
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!!!");