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

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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版