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

STM32+SDIO+DMA 4bits 出现卡死问题求助!!!

[复制链接]
chengdf83 提问时间:2011-11-26 21:46 /
阅读主题, 点击返回1楼
收藏 评论28 发布时间:2011-11-26 21:46
28个回答
chengdf83 回答时间:2011-11-28 11:31:32

RE:STM32+SDIO+DMA 4bits 出现卡死问题求助!!!

出现错误标志后,是按照例程中的处理方式处理的,处理函数是SD_ProcessIRQSrc():
---------------------------------------------------
/*******************************************************************************
* Function Name  : SD_ProcessIRQSrc
* Description    : Allows to process all the interrupts that are high.
* Input          : None
* Output         : None
* Return         : SD_Error: SD Card Error code.
*******************************************************************************/
SD_Error SD_ProcessIRQSrc(void)
{
  uint32_t count = 0, restwords = 0;
  if (DeviceMode == SD_INTERRUPT_MODE)
  {
#ifdef DISPSDINFO
    printf("\t\tSD_INTERRUPT_MODE\n");
#endif
    if (SDIO_GetITStatus(SDIO_IT_RXFIFOHF) != RESET)
    {
      for (count = 0; count < SD_HALFFIFO; count++)
      {
        *(DestBuffer + count) = SDIO_ReadData();
      }
      DestBuffer += SD_HALFFIFO;
      NumberOfBytes += SD_HALFFIFOBYTES;
    }
    else if (SDIO_GetITStatus(SDIO_IT_TXFIFOHE) != RESET)
    {
      if ((TotalNumberOfBytes - NumberOfBytes) < SD_HALFFIFOBYTES)
      {
        restwords = ((TotalNumberOfBytes - NumberOfBytes) %  4 == 0) ?
                    ((TotalNumberOfBytes - NumberOfBytes) / 4) :
                    ((TotalNumberOfBytes - NumberOfBytes) / 4 + 1);
        for (count = 0; count < restwords;  count++, SrcBuffer++, NumberOfBytes += 4)
        {
          SDIO_WriteData(*SrcBuffer);
        }
      }
      else
      {
        for (count = 0; count < SD_HALFFIFO; count++)
        {
          SDIO_WriteData(*(SrcBuffer + count));
        }
        SrcBuffer += SD_HALFFIFO;
        NumberOfBytes += SD_HALFFIFOBYTES;
      }
    }
  }
  if (SDIO_GetITStatus(SDIO_IT_DATAEND) != RESET)
  {
#ifdef DISPSDINFO
    printf("\t\tSDIO_IT_DATAEND\n");
#endif
    if (DeviceMode != SD_DMA_MODE)
    {
      while ((SDIO_GetFlagStatus(SDIO_FLAG_RXDAVL) != RESET)  &&  (NumberOfBytes < TotalNumberOfBytes))
      {
        *DestBuffer = SDIO_ReadData();
        DestBuffer++;
        NumberOfBytes += 4;
      }
    }
    if (StopCondition == 1)
    {
      TransferError = SD_StopTransfer();
    }
    else
    {
      TransferError = SD_OK;
    }
    SDIO_ClearITPendingBit(SDIO_IT_DATAEND);
    SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |
                  SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR |
                  SDIO_IT_RXOVERR | SDIO_IT_STBITERR, DISABLE);
    TransferEnd = 1;
    NumberOfBytes = 0;
    return(TransferError);
  }
  if (SDIO_GetITStatus(SDIO_IT_DCRCFAIL) != RESET)
  {
#ifdef DISPSDINFO
    printf("\t\tSDIO_IT_DCRCFAIL\n");
#endif
    SDIO_ClearITPendingBit(SDIO_IT_DCRCFAIL);
    SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |
                  SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR |
                  SDIO_IT_RXOVERR | SDIO_IT_STBITERR, DISABLE);
    NumberOfBytes = 0;
    TransferError = SD_DATA_CRC_FAIL;
    return(SD_DATA_CRC_FAIL);
  }
  if (SDIO_GetITStatus(SDIO_IT_DTIMEOUT) != RESET)
  {
#ifdef DISPSDINFO
    printf("\t\tSDIO_IT_DTIMEOUT\n");
#endif
    SDIO_ClearITPendingBit(SDIO_IT_DTIMEOUT);
    SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |
                  SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR |
                  SDIO_IT_RXOVERR | SDIO_IT_STBITERR, DISABLE);
    NumberOfBytes = 0;
    TransferError = SD_DATA_TIMEOUT;
    return(SD_DATA_TIMEOUT);
  }
  if (SDIO_GetITStatus(SDIO_IT_RXOVERR) != RESET)
  {
#ifdef DISPSDINFO
    printf("\t\tSDIO_IT_RXOVERR\n");
#endif
    SDIO_ClearITPendingBit(SDIO_IT_RXOVERR);
    SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |
                  SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR |
                  SDIO_IT_RXOVERR | SDIO_IT_STBITERR, DISABLE);
    NumberOfBytes = 0;
    TransferError = SD_RX_OVERRUN;
    return(SD_RX_OVERRUN);
  }
  if (SDIO_GetITStatus(SDIO_IT_TXUNDERR) != RESET)
  {
#ifdef DISPSDINFO
    printf("\t\tSDIO_IT_TXUNDERR\n");
#endif
    SDIO_ClearITPendingBit(SDIO_IT_TXUNDERR);
    SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |
                  SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR |
                  SDIO_IT_RXOVERR | SDIO_IT_STBITERR, DISABLE);
    NumberOfBytes = 0;
    TransferError = SD_TX_UNDERRUN;
    return(SD_TX_UNDERRUN);
  }
  if (SDIO_GetITStatus(SDIO_IT_STBITERR) != RESET)
  {
#ifdef DISPSDINFO
    printf("\t\tSDIO_IT_STBITERR\n");
#endif
    SDIO_ClearITPendingBit(SDIO_IT_STBITERR);
    SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |
                  SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR |
                  SDIO_IT_RXOVERR | SDIO_IT_STBITERR, DISABLE);
    NumberOfBytes = 0;
    TransferError = SD_START_BIT_ERR;
    return(SD_START_BIT_ERR);
  }
  return(SD_OK);
}
---------------------------------------------------
chengdf83 回答时间:2011-11-28 11:54:58

RE:STM32+SDIO+DMA 4bits 出现卡死问题求助!!!

加了硬件流控之后,出现SDIO_IT_DCRCFAIL错误了,晕死,搞到最后,和网上别人遇到的问题差不多了。但是没见到一位给出了解决方案的。
去掉流控,今天测试又没有出现SDIO_IT_RXOVERR错误了,程序就一直在while (DMA_GetFlagStatus(DMA2_FLAG_TC4) == RESET)卡起,期间没有进过SDIO中断,DMA2->ISR寄存器一直是0,也就是说SDIO没有出现传输错误,也没有传输完成,甚至都没有超时,DMA的寄存器也没有反应,就是DMA也没有操作完成,好像所有一套硬件机制都冻结了一样。
chengdf83 回答时间:2011-11-28 11:56:32

RE:STM32+SDIO+DMA 4bits 出现卡死问题求助!!!

不加流控的话,会不会导致硬件冻结呢?  呵呵   好像也不合常理。哎  我都快疯了。
chengdf83 回答时间:2011-11-28 13:13:07

RE:STM32+SDIO+DMA 4bits 出现卡死问题求助!!!

非常感谢火雷达,我遇到的那个问题貌似解决了,呵呵。把流控加上后问题就搞定了,之前别人移植的代码,最近天天看资料才发现流控制没有开启。
弄了这么多天,唉,还好,解决了。呵呵
火雷达 回答时间:2011-11-28 20:56:06

回复:STM32+SDIO+DMA 4bits 出现卡死问题求助!!!

问题解决了,就好了,这个MCU功能太复杂,很多东西忘记配置。
chengdf83 回答时间:2011-11-29 12:42:42

RE:STM32+SDIO+DMA 4bits 出现卡死问题求助!!!

呵呵  很感谢你的关注。 问题解决了,心情真爽,呵呵   看来不是STM32的硬件有问题,还是代码库本身不够完善。
jiejiahua1207 回答时间:2011-12-17 23:51:47

RE:STM32+SDIO+DMA 4bits 出现卡死问题求助!!!

楼上的问题是怎么解决的?读卡的错误搞定了?求真相……
chengdf83 回答时间:2011-12-20 10:46:51

RE:STM32+SDIO+DMA 4bits 出现卡死问题求助!!!

使用DMA需要加硬件流控,希望大家少走弯路了,完全按照官方例程会出问题的。
flyleaf91 回答时间:2012-2-22 23:13:28

回复:STM32+SDIO+DMA 4bits 出现卡死问题求助!!!

回复第 18 楼 于2011-12-20 02:46:51发表:
使用DMA需要加硬件流控,希望大家少走弯路了,完全按照官方例程会出问题的。 

我也遇到这个问题,你说的硬件控是指SDIO初始化的时候要加硬件流?我开启了还是会出错。。
qqatscau-366093 回答时间:2012-9-5 17:52:35

RE:STM32+SDIO+DMA 4bits 出现卡死问题求助!!!

MARK。。。。。。。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版