各位,大家好,小弟最近在做文件系统存储相关的工作,就是用Cubemx生成文件系统和SDIO,那么我的问题来了 在向文件写内容的时候 result= f_write(&File_Element.fil,File_Element.Fatfs_Buf,sizeof(File_Element.Fatfs_Buf), &File_Element.bwee); printf("f_write1=%d\r\n",result); 循环多次向文件写内容,那么就可能会出现f_write返回值为1的情况,而且是没有规律的 我看了这个错误的解释是:FR_DISK_ERR, /* (1) A hard error occurred in the low level disk I/O layer */ 说是底层硬件错误, 有没有人做过这方面的工作,大神给点指点 在线等 |
我用F4做录音器,也遇到类似的问题,就是连续写SD卡的时候,很容易出现FR_DISK_ERR错位。
后来把写扇区函数改了。
原函数为:
DRESULT SD_write(BYTE lun, const BYTE *buff, DWORD sector, UINT count)
{
DRESULT res = RES_OK;
if(BSP_SD_WriteBlocks((uint32_t*)buff,
(uint64_t)(sector * BLOCK_SIZE),
BLOCK_SIZE, count) != MSD_OK)
{
res = RES_ERROR;
}
return res;
}
修改后为:
DRESULT SD_write(BYTE lun, const BYTE *buff, DWORD sector, UINT count)
{
DRESULT res = RES_OK;
uint8_t sd_res = MSD_OK;
sd_res = BSP_SD_WriteBlocks((uint32_t*)buff,
(uint64_t)(sector * BLOCK_SIZE),
BLOCK_SIZE, count);
while (sd_res) {
BSP_SD_Init();
sd_res = BSP_SD_WriteBlocks((uint32_t*)buff,
(uint64_t)(sector * BLOCK_SIZE),
BLOCK_SIZE, count);
}
if (sd_res) {
res = RES_ERROR;
}
return res;
}
也就是写出错的时候,重新初始化SD卡。
目前程序运行稳定,但是没有像LZ这样测试4小时那么长。
确实会有这样的可能性。我测试了一下,比如录音的过程中突然把卡拔出来,如果正好在执行这个底层函数,就会在里面死循环。
除了人为把卡拔出来的情况,正常情况下我没有遇到卡死的情况。
如果担心这个问题,最合理的做法是:增加一个变量,控制初始化的次数,如果尝试了N次之后,仍不能写成功,就退出。
都改成0x1000,现在又来问题来:用文件系统操作sdio,cubemx里配置的生成的工程,现在的问题就是,每秒写2500字节左右,连续写4个小时的时候,f_mount或者f_open或者f_write就会返回错误说是错误信息:FR_DISK_ERR,这个错误的意思说是(1) A hard error occurred in the low level disk I/O layer */就是底层硬
加了,每次写了之后都加了HAL_Delay(30),还是不起作用
单次的传输是不是太大?看看频率最多支持多少,从底往上都要看
情况是这样的 传输字节几百的话是没有问题的,现在传输的每次是4000多字节 就会出现这种错误的情况,你说的频率指的是哪个的频率
是的,就是速度问题,但是现在又有问题了,就是连续写4个小时之后,可能write函数就会出现错误,这是啥原因
如果是很有规律的4个小时,那么还是程序上哪有问题,没有好的办法,只有自己再看看程序、调试下
速度已经降下去了,你说的缓冲区是指哪个