captainliuy 发表于 2019-5-8 10:45:40

captainliuy 发表于 2019-5-8 10:30
st论坛里有人给出的解释,但是没有给出解决办法,是因为中断的问题。

do
{
    if (count-- == 0U)
    {
      return SDMMC_ERROR_TIMEOUT;
    }
   
}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 跑的USBDMSC 触发条件是 ,边用FATFS 读,加上电脑去 改写文件。

caowent 发表于 2020-5-8 16:30:20

正如10#朋友提到,我也参考了st官方论坛用户的解决方案
1.开关中断有效果,但依然有问题。
2.最终还是采用了这位外国用户提出的解决方案。
3.解决方案思路是以自己设置的接收完成标志作为命令响应成功的标志,而不依赖sd外设寄存器标志(SD外设寄存器响应标志会在其他异步线程中意外被清除)。
4.贴一下修改后的代码。

/* stm32f4xx_II_sdmmc.c line:1160*/
/**
* @briefChecks for error conditions for R1 response.
* @paramhsd SD handle
* @paramSD_CMD The sent command index
* @retval SD Card error state
*/
FlagStatus flag_resp = RESET;
static uint32_t SDMMC_GetCmdResp1(SDIO_TypeDef *SDIOx, uint8_t SD_CMD, uint32_t Timeout)
{
uint32_t response_r1;

/* 8 is the number of required instructions cycles for the below loop statement.
The Timeout is expressed in ms */
register uint32_t count = Timeout * (SystemCoreClock / 8U /1000U);
flag_resp = RESET;

do
{
    if (count-- == 0U)
    {
      return SDMMC_ERROR_TIMEOUT;
    }

    if(flag_resp == SET)
    {
      break;
    }
   
}while(!__SDIO_GET_FLAG(SDIOx, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT));



/* sd_diskio.c line:487*/
/**
* @brief Rx Transfer completed callbacks
* @param hsd: SD handle
* @retval None
*/
extern FlagStatus flag_resp;
void BSP_SD_ReadCpltCallback(void)
{
/*
   * No need to add an "osKernelRunning()" check here, as the SD_initialize()
   * is always called before any SD_Read()/SD_Write() call
   */
flag_resp = SET;
osMessagePut(SDQueueID, READ_CPLT_MSG, osWaitForever);
}

caowent 发表于 2020-5-11 14:21:25

后来测试以上16#方案还会有问题,现在把sd clk的分频系数从0加大到22,即sdio时钟频率从24MHz降到2MHz,关闭硬件流控。实测后,response1 有响应了,不会再卡死,但速度慢了。目前做U盘读写SD,只有500kB/s。
页: 1 [2]
查看完整版本: 高手请进,困扰很久的问题:STM32F7与MMC通讯异常错误