小学生
最后登录1970-1-1
在线时间 小时
注册时间2020-5-2
|
我用野火的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);
|
|