硬汉嵌入式论坛

 找回密码
 立即注册
查看: 6523|回复: 14
收起左侧

[FatFs] FatFs + eMMC 返回 FR_DISK_ERROR

[复制链接]

8

主题

46

回帖

70

积分

初级会员

积分
70
发表于 2019-11-12 15:11:00 | 显示全部楼层 |阅读模式
本帖最后由 Hans 于 2019-11-12 15:17 编辑

Hi 各位高手们,

我在尝试以STM32CubeMX 建置一专案,用FatFs 方式去操作 eMMC的部分,由于CubeMX仅只有SDCard 可以选择,所以必须以SDCard 设置为eMMC的方式。
在网上查询到在使用全新的eMMC需要格式化,则使用f_mkfs 并用 f_opendir 读取,但是却都返回 FR_DISK_ERROR,尝试几次都相同,还请各位高手协助。


附图及附档都在其中

再麻烦各位了!

感谢!


1112145.png

eMMC_NRTOS.7z

17.59 MB, 下载次数: 25

回复

使用道具 举报

8

主题

46

回帖

70

积分

初级会员

积分
70
 楼主| 发表于 2019-11-14 10:05:42 | 显示全部楼层
本帖最后由 Hans 于 2019-11-14 10:18 编辑

更新
昨日测出 CLK & CMD 都有信号产生

目前有侦错 CSD的部分如图
可以抓出其中与 Datasheet 相关的资讯,但好像不是完全一样


eMMC : Micron 8G
有人能提点一下,有什么需要注意的吗?目前状况仍然是 DISK_ERROR ,但是已经可以确定IC可以连上
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2019-11-12 20:10:55 | 显示全部楼层
返回这个错误,是表示你的diskio.c文件里面驱动实现有问题。
回复

使用道具 举报

8

主题

46

回帖

70

积分

初级会员

积分
70
 楼主| 发表于 2019-11-13 08:20:03 | 显示全部楼层
eric2013 发表于 2019-11-12 20:10
返回这个错误,是表示你的diskio.c文件里面驱动实现有问题。

感谢 Eric 大的回覆

diskio.c 驱动指的是这个部分吗? 仅撷取一小部分您的demo

  1. /*
  2. * when using cachable memory region, it may be needed to maintain the cache
  3. * validity. Enable the define below to activate a cache maintenance at each
  4. * read and write operation.
  5. * Notice: This is applicable only for cortex M7 based platform.
  6. */

  7. #define ENABLE_SD_DMA_CACHE_MAINTENANCE  1

  8. /* Private variables ---------------------------------------------------------*/
  9. /* Disk status */
  10. static volatile DSTATUS Stat = STA_NOINIT;
  11. static volatile  UINT  WriteStatus = 0, ReadStatus = 0;
  12. /* Private function prototypes -----------------------------------------------*/
  13. static DSTATUS SD_CheckStatus(BYTE lun);
  14. DSTATUS SD_initialize (BYTE);
  15. DSTATUS SD_status (BYTE);
  16. DRESULT SD_read (BYTE, BYTE*, DWORD, UINT);
  17. #if _USE_WRITE == 1
  18.   DRESULT SD_write (BYTE, const BYTE*, DWORD, UINT);
  19. #endif /* _USE_WRITE == 1 */
  20. #if _USE_IOCTL == 1
  21.   DRESULT SD_ioctl (BYTE, BYTE, void*);
  22. #endif  /* _USE_IOCTL == 1 */

  23. const Diskio_drvTypeDef  SD_Driver =
  24. {
  25.   SD_initialize,
  26.   SD_status,
  27.   SD_read,
  28. #if  _USE_WRITE == 1
  29.   SD_write,
  30. #endif /* _USE_WRITE == 1 */

  31. #if  _USE_IOCTL == 1
  32.   SD_ioctl,
  33. #endif /* _USE_IOCTL == 1 */
  34. };

  35. /* Private functions ---------------------------------------------------------*/
  36. static DSTATUS SD_CheckStatus(BYTE lun)
  37. {
  38.   Stat = STA_NOINIT;

  39.   if(BSP_MMC_GetCardState() == MMC_TRANSFER_OK)
  40.   {
  41.     Stat &= ~STA_NOINIT;
  42.   }

  43.   return Stat;
  44. }
复制代码

---------------------------------------------------------------------------------------------------------
另外我在侦错时,会在下面这个部分的HAL_GetTick返回ERROR,再麻烦您,谢谢!
---------------------------------------------------------------------------------------------------------
  1. #if _USE_WRITE == 1
  2. DRESULT SD_write(BYTE lun, const BYTE *buff, DWORD sector, UINT count)
  3. {
  4.   DRESULT res = RES_ERROR;
  5.   WriteStatus = 0;
  6.   uint32_t timeout;

  7. #if (ENABLE_SD_DMA_CACHE_MAINTENANCE == 1)
  8.   uint32_t alignedAddr;
  9.   /*
  10.    the SCB_CleanDCache_by_Addr() requires a 32-Byte aligned address
  11.    adjust the address and the D-Cache size to clean accordingly.
  12.    */
  13.   alignedAddr = (uint32_t)buff &  ~0x1F;
  14.   SCB_CleanDCache_by_Addr((uint32_t*)alignedAddr, count*BLOCKSIZE + ((uint32_t)buff - alignedAddr));
  15. #endif


  16.   if(BSP_MMC_WriteBlocks_DMA((uint32_t*)buff,
  17.                             (uint32_t)(sector),
  18.                             count) == MMC_OK)
  19.   {
  20.     /* Wait that writing process is completed or a timeout occurs */

  21.     timeout = HAL_GetTick();
  22.     while((WriteStatus == 0) && ((HAL_GetTick() - timeout) < SD_TIMEOUT))
  23.     {
  24.     }
  25.     /* incase of a timeout return error */
  26.     if (WriteStatus == 0)
  27.     {
  28.       res = RES_ERROR;
  29.     }
  30.     else
  31.     {
  32.       WriteStatus = 0;
  33.       timeout = HAL_GetTick();

  34.       while((HAL_GetTick() - timeout) < SD_TIMEOUT)
  35.       {
  36.         if (BSP_MMC_GetCardState() == MMC_TRANSFER_OK)
  37.         {
  38.           res = RES_OK;
  39.           break;
  40.         }
  41.       }
  42.     }
  43.   }
  44.   return res;
  45. }
复制代码
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2019-11-13 08:35:48 | 显示全部楼层
你的硬件制作没问题吧,这点要优先保证
回复

使用道具 举报

8

主题

46

回帖

70

积分

初级会员

积分
70
 楼主| 发表于 2019-11-13 08:48:33 | 显示全部楼层
eric2013 发表于 2019-11-13 08:35
你的硬件制作没问题吧,这点要优先保证

HAL_GetTick 会产生错误 与硬件相关性较大吗?

硬件部分测量过大致上没啥问题
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2019-11-13 08:55:51 | 显示全部楼层
Hans 发表于 2019-11-13 08:48
HAL_GetTick 会产生错误 与硬件相关性较大吗?

硬件部分测量过大致上没啥问题

这个是滴答定时器的获取api,你要配置好使用的滴答定时器还是其它定时器做的时间基准
回复

使用道具 举报

8

主题

46

回帖

70

积分

初级会员

积分
70
 楼主| 发表于 2019-11-13 09:30:40 | 显示全部楼层
本帖最后由 Hans 于 2019-11-13 10:34 编辑
eric2013 发表于 2019-11-13 08:55
这个是滴答定时器的获取api,你要配置好使用的滴答定时器还是其它定时器做的时间基准

我用的是预设的定时器 Systick,主频设480MHz,SDMMC设70MHz 除频 = 2 大约35MHz,其余的就没特别设置,不知您在移植的时候有针对这个部分做特别的设置吗?


另外我有参考先前版上帖子,皆有测试过其中方式,但仍然是一样的状况

http://www.armbbs.cn/forum.php?mod=viewthread&tid=94962&highlight=fatfs




再麻烦您!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2019-11-13 11:23:53 | 显示全部楼层
Hans 发表于 2019-11-13 09:30
我用的是预设的定时器 Systick,主频设480MHz,SDMMC设70MHz 除频 = 2 大约35MHz,其余的就没特别设置, ...

我们的程序没有特别设置。
回复

使用道具 举报

8

主题

46

回帖

70

积分

初级会员

积分
70
 楼主| 发表于 2019-11-13 13:33:57 | 显示全部楼层
本帖最后由 Hans 于 2019-11-13 13:55 编辑
eric2013 发表于 2019-11-13 11:23
我们的程序没有特别设置。


回复

使用道具 举报

8

主题

46

回帖

70

积分

初级会员

积分
70
 楼主| 发表于 2019-11-13 13:37:41 | 显示全部楼层
eric2013 发表于 2019-11-13 11:23
我们的程序没有特别设置。

好的 感谢老大
我稍早有对 【V7-025_FatFS文件系统例子(SD卡)】,进行修改
发现结果仍然是一样的状态,这让我开始怀疑硬体的问题。

还是十分感谢 您的协助!
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2019-12-9 13:57:28 | 显示全部楼层
楼主你好,请问下你之前研究的FatFs+eMMC,现在成功了吗?
我最近在弄eMMc,我用的eMMC是16G的,USB连接电脑后U盘容量显示只有1G。对比了下H7-TOOL的github源码,发现在github源码中,MMC的hal库函数中,MMC_PowerON()函数内有判断MMC卡类型的语句,可供选择的选项是MMC_HIGH_CAPACITY_CARD、MMC_LOW_CAPACITY_CARD。
然而在stm32f4的Hal库函数中并没有以上两个选项,而是MMC_HIGH_VOLTAGE_CARD、MMC_DUAL_VOLTAGE_CARD这两个选项,不知这是否对eMMC卡的容量识别有影响?
在我的程序初始化过程中,得知初始化的时候CardType = MMC_DUAL_VOLTAGE_CARD。

另外,执行f_write()函数,运行没有返回值,卡在里面的函数了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2019-12-9 14:00:25 | 显示全部楼层
dsLearner 发表于 2019-12-9 13:57
楼主你好,请问下你之前研究的FatFs+eMMC,现在成功了吗?
我最近在弄eMMc,我用的eMMC是16G的,USB连接电 ...

F4不是原生支持eMMC的,不过也可以搞搞,我记得amobbs上有坛友分享过,你找找看。
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2019-12-9 15:18:47 | 显示全部楼层
eric2013 发表于 2019-12-9 14:00
F4不是原生支持eMMC的,不过也可以搞搞,我记得amobbs上有坛友分享过,你找找看。

请问下,你之前研究过F4 的eMMC驱动吗?

amobbs上有坛友分享的源码在github找到了 amobbs论坛上的源码
经查看,该源码是修改SD卡的驱动来驱动eMMC的,暂未尝试。请问,你试过直接套用他的函数来实现驱动eMMC吗?

目前我的工程是使用STM32CubeMX V5.4.0 配置了MMC 8bit + FatFs  + USBD HS ,然后结合 STM32F4 eMMC支持 这个帖子下的[ATT]12244.rar文件内的eMMC驱动,来驱动eMMC,通过初步查看,[ATT]12244.rar文件内的eMMC驱动是通过调用MMC 的hal库的来的。将驱动函数加入到我的工程后,发现识别的容量不正确,16G的eMMC只识别出1G,使用FatFs R0.12c  版本,BYTE workBuf[512];f_mkfs(USERPath, FM_FAT32, 512, workBuf, sizeof workBuf);格式化语句如上。
STM32F4 + eMMC 之 EXT_CSD寄存器读取和写入]使用了该文章的函数,直接获取容量值,可以获得正确的容量值,但是不清楚如何该容量值是否能与USB识别的容量值挂钩。



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2019-12-10 08:57:14 | 显示全部楼层
dsLearner 发表于 2019-12-9 15:18
请问下,你之前研究过F4 的eMMC驱动吗?

amobbs上有坛友分享的源码在github找到了 amobbs论坛上的源码 ...

这个不清楚哦,我没有用过F4驱动eMMC,只是之前偶尔看到过。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 22:21 , Processed in 0.369118 second(s), 30 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表