FATFS报错Debug
错误情景:
f_mount等等函数均报错,如:
f_mount(&fs," ", 0); 此时不报错, 但如果使用f_open等函数,则马上报错not_readyf_mount(&fs," ", 1); 立刻报错fr_disk_err或者fr_not_ready
尝试过的方法:
1. 4bits改为1bits, 无效
2. 调节时钟频率, 无效
3. 设置上拉电阻, 无效
4. 修改栈区堆区大小, 无效(使用了RTOS)(但需要注意的是RTOS任务内存分配也不要太小, 我分配了4096, 不确定最小可以有多小)
5. 更换SD卡(没试过, 本人使用了32GB的SD卡)
解决方案:
虽然FATFS始终不能工作
但是! SD卡可以正常配置, 初始化, 以及读取信息.
所以基本排除了SD卡以及SDMMC配置时出问题的可能性. 问题定位在FATFS的配置与RTOS的配置上.
但新的问题又来了, FATFS只是一个抽象层,它不应该出现自身的配置上的问题
继续定位问题, 定位在RTOS与FATFS的兼容上面.
仔细查阅CubeMX中的配置项, 发现问题:
FATFS中选项栏 "Advanced Setting"中有一个选项:“Use DMA Template”
这里被强制选择为"Enable", 但是我在配置的时候并没有设置相关的DMA选项, 这里设为ENABLE, 与实际配置不符
更新DMA配置(MDMA部分), 问题解决.
运行效果:
勘误:
-
网络上有尝试通过降低时钟频率的方法,实测不需要,100M时钟频率正常工作.
-
4bits改为1bits, 理由是CubeMX初始化时有bug, 实测不需要(cube版本6.8.1, FW_H7版本1.11)
可以正常满速工作, 但是没有测试最高速率是多少, 以及100M时钟会不会数据出错.
补录:
便于各位自行定位问题所在, 这里给出我的SD卡读取代码, 如果这部分可以正常工作, 就不要在SD卡上面浪费时间了, 不是SD卡的问题
uint64_t CardCap; //SD卡容量
HAL_SD_CardCIDTypeDef SDCard_CID;
HAL_SD_CardInfoTypeDef SDCardInfo;
SD_Driver.disk_initialize(0);
HAL_SD_GetCardCID(&hsd1,&SDCard_CID); //获取CID
HAL_SD_GetCardInfo(&hsd1,&SDCardInfo); //获取SD卡信息
CardCap=(uint64_t)(SDCardInfo.LogBlockNbr)*(uint64_t)(SDCardInfo.LogBlockSize); //计算SD卡容量
uart_printf("Card ManufacturerID: %d \r\n",SDCard_CID.ManufacturerID); //制造商ID
uart_printf("CardVersion: %d \r\n",(uint32_t)(SDCardInfo.CardVersion)); //卡版本号
uart_printf("Class: %d \r\n",(uint32_t)(SDCardInfo.Class)); //
uart_printf("Card RCA(RelCardAdd):%d \r\n",SDCardInfo.RelCardAdd); //卡相对地址
uart_printf("Card BlockNbr: %d \r\n",SDCardInfo.BlockNbr); //块数量
uart_printf("Card BlockSize: %d \r\n",SDCardInfo.BlockSize); //块大小
uart_printf("LogBlockNbr: %d \r\n",(uint32_t)(SDCardInfo.LogBlockNbr)); //逻辑块数量
uart_printf("LogBlockSize: %d \r\n",(uint32_t)(SDCardInfo.LogBlockSize)); //逻辑块大小
uart_printf("Card Capacity: %d MB\r\n",(uint32_t)(CardCap>>20)); //卡容量
工程代码git链接:
在master分支
Github仓库链接
维护开源环境, 减少积分下载.
有问题可以在评论区问, 不定时回复