[其他ST产品] STM32H7+SD卡+RTOS+FATFS FATFS报错Debug

[复制链接]
2129|22
 楼主| wang6623 发表于 2023-6-29 16:48 | 显示全部楼层 |阅读模式
FATFS报错Debug
错误情景:
f_mount等等函数均报错,如:
f_mount(&fs," ", 0); 此时不报错, 但如果使用f_open等函数,则马上报错not_ready

f_mount(&fs," ", 1); 立刻报错fr_disk_err或者fr_not_ready

尝试过的方法:

1. 4bits改为1bits, 无效
2. 调节时钟频率, 无效
3. 设置上拉电阻, 无效
4. 修改栈区堆区大小, 无效(使用了RTOS)(但需要注意的是RTOS任务内存分配也不要太小, 我分配了4096, 不确定最小可以有多小)
5. 更换SD卡(没试过, 本人使用了32GB的SD卡)

 楼主| wang6623 发表于 2023-6-29 16:48 | 显示全部楼层
解决方案:

虽然FATFS始终不能工作

但是! SD卡可以正常配置, 初始化, 以及读取信息.

50924649d4569c8401.png
 楼主| wang6623 发表于 2023-6-29 16:49 | 显示全部楼层
所以基本排除了SD卡以及SDMMC配置时出问题的可能性. 问题定位在FATFS的配置与RTOS的配置上.

但新的问题又来了, FATFS只是一个抽象层,它不应该出现自身的配置上的问题

继续定位问题, 定位在RTOS与FATFS的兼容上面.

仔细查阅CubeMX中的配置项, 发现问题:

FATFS中选项栏 "Advanced Setting"中有一个选项:“Use DMA Template”

92836649d45803b1c8.png
 楼主| wang6623 发表于 2023-6-29 16:49 | 显示全部楼层
这里被强制选择为"Enable", 但是我在配置的时候并没有设置相关的DMA选项, 这里设为ENABLE, 与实际配置不符
更新DMA配置(MDMA部分), 问题解决.
72877649d459d20f88.png
 楼主| wang6623 发表于 2023-6-29 16:49 | 显示全部楼层
运行效果: 98366649d45ac5eb11.png
 楼主| wang6623 发表于 2023-6-29 16:50 | 显示全部楼层
勘误:

网络上有尝试通过降低时钟频率的方法,实测不需要,100M时钟频率正常工作.

4bits改为1bits, 理由是CubeMX初始化时有bug, 实测不需要(cube版本6.8.1, FW_H7版本1.11)
可以正常满速工作, 但是没有测试最高速率是多少, 以及100M时钟会不会数据出错. 18739649d45e502505.png
 楼主| wang6623 发表于 2023-6-29 16:51 | 显示全部楼层
补录:

便于各位自行定位问题所在, 这里给出我的SD卡读取代码, 如果这部分可以正常工作, 就不要在SD卡上面浪费时间了, 不是SD卡的问题
  1.     uint64_t CardCap;              //SD卡容量
  2.     HAL_SD_CardCIDTypeDef SDCard_CID;
  3.     HAL_SD_CardInfoTypeDef  SDCardInfo;

  4.     SD_Driver.disk_initialize(0);

  5.     HAL_SD_GetCardCID(&hsd1,&SDCard_CID);        //获取CID
  6.     HAL_SD_GetCardInfo(&hsd1,&SDCardInfo);                    //获取SD卡信息
  7.     CardCap=(uint64_t)(SDCardInfo.LogBlockNbr)*(uint64_t)(SDCardInfo.LogBlockSize);        //计算SD卡容量

  8.     uart_printf("Card ManufacturerID: %d \r\n",SDCard_CID.ManufacturerID);                                //制造商ID
  9.     uart_printf("CardVersion:         %d \r\n",(uint32_t)(SDCardInfo.CardVersion));                //卡版本号
  10.     uart_printf("Class:               %d \r\n",(uint32_t)(SDCardInfo.Class));                    //
  11.     uart_printf("Card RCA(RelCardAdd):%d \r\n",SDCardInfo.RelCardAdd);                                        //卡相对地址
  12.     uart_printf("Card BlockNbr:       %d \r\n",SDCardInfo.BlockNbr);                                                //块数量
  13.     uart_printf("Card BlockSize:      %d \r\n",SDCardInfo.BlockSize);                                        //块大小
  14.     uart_printf("LogBlockNbr:         %d \r\n",(uint32_t)(SDCardInfo.LogBlockNbr));                //逻辑块数量
  15.     uart_printf("LogBlockSize:        %d \r\n",(uint32_t)(SDCardInfo.LogBlockSize));                //逻辑块大小
  16.     uart_printf("Card Capacity:       %d MB\r\n",(uint32_t)(CardCap>>20));                                //卡容量
 楼主| wang6623 发表于 2023-6-29 16:51 | 显示全部楼层
工程代码git链接:
在master分支
Undshing 发表于 2023-7-1 23:21 | 显示全部楼层
FATFS不工作?
Wordsworth 发表于 2023-12-30 07:13 | 显示全部楼层

输入电源和负载电流环路并没有什么问题
Clyde011 发表于 2023-12-30 08:16 | 显示全部楼层

控制地与其他地要通过一些特定的点连接
公羊子丹 发表于 2023-12-30 09:09 | 显示全部楼层

事实上很多做项目的工程师本身自己也会在用
万图 发表于 2023-12-30 10:12 | 显示全部楼层

引线的长度直接与它的电感量和电阻量成比例
Uriah 发表于 2023-12-30 11:15 | 显示全部楼层

变换器效率就显得比较低
帛灿灿 发表于 2023-12-30 13:11 | 显示全部楼层

设计者的作用就是在理解电路工作过程的基础上,保证PCB设计合理。
Bblythe 发表于 2023-12-30 14:14 | 显示全部楼层

两个环路最有可能产生电磁干扰(EMI)
周半梅 发表于 2023-12-30 16:10 | 显示全部楼层

没有发现有哪本是介绍设计思想的
Pulitzer 发表于 2023-12-30 17:13 | 显示全部楼层

滤波电容接线端的放置很重要
童雨竹 发表于 2023-12-30 19:09 | 显示全部楼层

但是如果不懂程序设计的思想的话,会给你做项目的过程中带来很多很多的困惑。
普莱兴科技 发表于 2024-8-8 18:51 | 显示全部楼层
wang6623 发表于 2023-6-29 16:51
工程代码git链接:
在master分支

连接没看到
您需要登录后才可以回帖 登录 | 注册

本版积分规则

71

主题

617

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部