野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13709|回复: 0

stm32F103 SDIO的SDIO_FLAG_DCRCFAIL以及SDIO_Wait_Pend导致的程序重启

[复制链接]
发表于 2020-5-3 00:06:37 | 显示全部楼层 |阅读模式
我用野火的SDIO 示例程序,可以往SD卡上写入数据(无文件系统)。blocksize=512,但约有1/3的block没有写到SD卡上,没写成功的位置也不一定,有时A地址写成了,下一次A地址可能写入不成功。我将时钟SDIO_CE调整为1MHZ还是存在写不成功的问题。

我尝试了一些解决办法,但都不成功。百思不得其解,向大佬求教:

1、开启SDIO的DCRCFAIL中断,到中断中进行失败数据库的重新发送。但开启该中断后,发送几个block之后(个数不定),程序会莫名其妙重启。
uint32_t status;
  if (StopCondition == 1)  
  {
    SDIO->ARG = 0x0;   
    SDIO->CMD = 0x44C;                                         
    TransferError = CmdResp1Error(SD_CMD_STOP_TRANSMISSION);
  }
  else
  {
    TransferError = SD_OK;
  }
       
        //query SDIO_STA
        status = SDIO->STA;       
       
        if( status & (SDIO_FLAG_DATAEND | SDIO_FLAG_DBCKEND) )
        {
                SDIO_ClearITPendingBit(SDIO_IT_DATAEND | SDIO_IT_DBCKEND);
                SDIO_ITConfig(SDIO_IT_DATAEND | SDIO_IT_DBCKEND, DISABLE);
                TransferEnd = 1;
                WriteTfBufFlg = 0;        //have written the sd CARD, so clear the flag, and the next writting can do
        }
       
        if( status & SDIO_FLAG_DCRCFAIL )
        {
                SDIO_ClearITPendingBit(SDIO_IT_DCRCFAIL); //ÇåÖжÏ
                SDIO_ITConfig(SDIO_IT_DCRCFAIL, DISABLE); //¹Ø±ÕsdioÖжÏʹÄÜ
                ReWriteTfBufFlg = 1;
                //SD_SingleBlockTest();
        }       
}








2、将SD_WriteBlock()函数的SDIO_Wait_No改为SDIO_Wait_Pend。意图使CPSM在开始发送一个命令之前等待数据传输结束。 但修改后只要调用SD_WriteBlock()函数,程序就会重启。
SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) BlockSize;
  SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SET_BLOCKLEN;
  SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;   //r1
  //SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_Pend;
  SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  SDIO_SendCommand(&SDIO_CmdInitStructure);

  errorstatus = CmdResp1Error(SD_CMD_SET_BLOCKLEN);

  if (SD_OK != errorstatus)
  {
    return(errorstatus);
  }
/*********************************************************************************/

  /*!< Send CMD24 WRITE_SINGLE_BLOCK */
  SDIO_CmdInitStructure.SDIO_Argument = WriteAddr;          //дÈëµØÖ·
  SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_WRITE_SINGLE_BLOCK;
  SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;         //r1
  //SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_Pend;
  SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  SDIO_SendCommand(&SDIO_CmdInitStructure);

  errorstatus = CmdResp1Error(SD_CMD_WRITE_SINGLE_BLOCK);

回复

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-25 23:33 , Processed in 0.028351 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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