完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
各位,大家好,小弟最近在做文件系统存储相关的工作,就是用Cubemx生成文件系统和SDIO,那么我的问题来了
在向文件写内容的时候 result= f_write(&File_Element.fil,File_Element.Fatfs_Buf,sizeof(File_Element.Fatfs_Buf), &File_Element.bwee); printf("f_write1=%drn",result); 循环多次向文件写内容,那么就可能会出现f_write返回值为1的情况,而且是没有规律的 我看了这个错误的解释是:FR_DISK_ERR, /* (1) A hard error occurred in the low level disk I/O layer */ 说是底层硬件错误, 有没有人做过这方面的工作,大神给点指点 在线等 |
|
相关推荐
18个回答
|
|
CubeMX生成的SD+FATFS程序确实很方便。
我用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小时那么长。
最佳答案
|
|
|
|
中间加个小延时试试
|
|
|
|
|
|
|
|
单次的传输是不是太大?看看频率最多支持多少,从底往上都要看 |
|
|
|
情况是这样的 传输字节几百的话是没有问题的,现在传输的每次是4000多字节 就会出现这种错误的情况,你说的频率指的是哪个的频率 |
|
|
|
SDIO有频率,CPU有主频,速度过快也不行啊,你最好折中速度,比如试试2000,再试试1000,或者3000等等。
|
|
|
|
是的,就是速度问题,但是现在又有问题了,就是连续写4个小时之后,可能write函数就会出现错误,这是啥原因 |
|
|
|
我觉得堆内存大小不够的可能性还是有的,你可以调一下堆内存的大小试试。
|
|
|
|
都改成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 */就是底层硬 |
|
|
|
maobs20 发表于 2018-10-25 07:50 如果是很有规律的4个小时,那么还是程序上哪有问题,没有好的办法,只有自己再看看程序、调试下 |
|
|
|
从速度、缓冲区上做处理。当产生错误以后,重新初始化一下是否可以解决?
|
|
|
|
|
|
|
|
接收数据放的缓冲区。
|
|
|
|
表示关注!
|
|
|
|
吕少大大 发表于 2018-10-25 08:55 就是我是一直调用自己写的一个函数,这个函数里有f_open f_wtire f_close, 可能写了几百次或者上千次会出现一个f_write 的错误,你的这个修改就是当SD卡挂了的时候你就让他重新初始化对吧,感谢万分 ,我也试试去 |
|
|
|
吕少大大 发表于 2018-10-25 08:55 不好意思,在问下,BSP_SD_WriteBlocks如果一直不返回OK,也就是说不为0的话,那岂不是一直死在while里 |
|
|
|
确实会有这样的可能性。我测试了一下,比如录音的过程中突然把卡拔出来,如果正好在执行这个底层函数,就会在里面死循环。 除了人为把卡拔出来的情况,正常情况下我没有遇到卡死的情况。 如果担心这个问题,最合理的做法是:增加一个变量,控制初始化的次数,如果尝试了N次之后,仍不能写成功,就退出。 |
|
|
|
哥们,你的问题解决没?我最近遇到了这个问题?长时间循环写入一个文件的时候,就会返回硬件错误这个问题。尝试了很多方法,目前还没解决....复位之后又好了,工作七八个小时的话,就会出现问题
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1967 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1823 浏览 3 评论
4403 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1970 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
2477 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-19 01:46 , Processed in 0.872578 second(s), Total 76, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号