你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

高手请进,困扰很久的问题:STM32F7与MMC通讯异常错误

[复制链接]
小小小小强 提问时间:2018-9-5 19:27 /
阅读主题, 点击返回1楼
收藏 评论16 发布时间:2018-9-5 19:27
16个回答
captainliuy 回答时间:2019-5-8 10:45:40
captainliuy 发表于 2019-5-8 10:30
st论坛里有人给出的解释,但是没有给出解决办法,是因为中断的问题。
  1. do
  2.   {
  3.     if (count-- == 0U)
  4.     {
  5.       return SDMMC_ERROR_TIMEOUT;
  6.     }
  7.    
  8.   }while(!__SDIO_GET_FLAG(SDIOx, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT));
复制代码

SDIO_FLAG_CMDREND 已经在其他位置被清掉了
QHCH11 回答时间:2019-6-18 19:17:31
我也遇到了同样的问题,我这边的触发条件是拔掉SD卡重插的时候f_mount,我在f_mount前面加上这两句解决了

memset(&disk, 0, sizeof(disk));
FATFS_LinkDriver(&SD_Driver, SD_Path);
lxybkb 回答时间:2019-6-19 11:22:35
谢谢楼主 分享
linxi6 回答时间:2019-6-26 21:23:29
请教一下,MMC使用时初始化不成功,设置卡相对地址时CRC校验错误。知不知道怎么解决?
小夜时雨 回答时间:2019-9-20 11:49:13
楼主解决了吗?我也是用HAL库一模一样的地方,我是 FREERTOS 跑的USBD  MSC 触发条件是 ,边用FATFS 读,加上电脑去 改写文件。
caowent 回答时间:2020-5-8 16:30:20
正如10#朋友提到,我也参考了st官方论坛用户的解决方案
1.开关中断有效果,但依然有问题。
2.最终还是采用了这位外国用户提出的解决方案。
3.解决方案思路是以自己设置的接收完成标志作为命令响应成功的标志,而不依赖sd外设寄存器标志(SD外设寄存器响应标志会在其他异步线程中意外被清除)。
4.贴一下修改后的代码。

  1. /* stm32f4xx_II_sdmmc.c line:1160*/
  2. /**
  3.   * @brief  Checks for error conditions for R1 response.
  4.   * @param  hsd SD handle
  5.   * @param  SD_CMD The sent command index  
  6.   * @retval SD Card error state
  7.   */
  8. FlagStatus flag_resp = RESET;
  9. static uint32_t SDMMC_GetCmdResp1(SDIO_TypeDef *SDIOx, uint8_t SD_CMD, uint32_t Timeout)
  10. {
  11.   uint32_t response_r1;
  12.   
  13.   /* 8 is the number of required instructions cycles for the below loop statement.
  14.   The Timeout is expressed in ms */
  15.   register uint32_t count = Timeout * (SystemCoreClock / 8U /1000U);
  16.   flag_resp = RESET;
  17.   
  18.   do
  19.   {
  20.     if (count-- == 0U)
  21.     {
  22.       return SDMMC_ERROR_TIMEOUT;
  23.     }

  24.     if(flag_resp == SET)
  25.     {
  26.       break;
  27.     }
  28.    
  29.   }while(!__SDIO_GET_FLAG(SDIOx, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT));
  30.   
  31.   
  32.   
  33. /* sd_diskio.c line:487*/
  34. /**
  35. * @brief Rx Transfer completed callbacks
  36. * @param hsd: SD handle
  37. * @retval None
  38. */
  39. extern FlagStatus flag_resp;
  40. void BSP_SD_ReadCpltCallback(void)
  41. {
  42.   /*
  43.    * No need to add an "osKernelRunning()" check here, as the SD_initialize()
  44.    * is always called before any SD_Read()/SD_Write() call
  45.    */
  46.   flag_resp = SET;
  47.   osMessagePut(SDQueueID, READ_CPLT_MSG, osWaitForever);
  48. }
复制代码
caowent 回答时间:2020-5-11 14:21:25
后来测试以上16#方案还会有问题,现在把sd clk的分频系数从0加大到22,即sdio时钟频率从24MHz降到2MHz,关闭硬件流控。实测后,response1 有响应了,不会再卡死,但速度慢了。目前做U盘读写SD,只有500kB/s。

sdio_cube

sdio_cube
12
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版