OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5869|回复: 8

SD卡初始化不成功,卡死在初始化里 求助

[复制链接]

13

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2017-7-14
在线时间
56 小时
发表于 2017-8-6 15:21:21 | 显示全部楼层 |阅读模式
10金钱
卡死在这个函数里,主要卡在红色标注的地方出不来。后面附有我用的SD卡
SD_Error FindSCR(u16 rca,u32 *pscr)
{
        u32 index = 0;
        SD_Error errorstatus = SD_OK;
        u32 tempscr[2]={0,0};  
       
       
        SDIO_CmdInitStructure.SDIO_Argument = (uint32_t)8;         //发送CMD16,短响应,设置Block Size为8字节       
        SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SET_BLOCKLEN; //         cmd16
        SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;  //r1
        SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
        SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
        SDIO_SendCommand(&SDIO_CmdInitStructure);

        errorstatus=CmdResp1Error(SD_CMD_SET_BLOCKLEN);

        if(errorstatus!=SD_OK)return errorstatus;            

        SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) RCA << 16;
        SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_APP_CMD;//发送CMD55,短响应        
        SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
        SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
        SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
        SDIO_SendCommand(&SDIO_CmdInitStructure);
       
        errorstatus=CmdResp1Error(SD_CMD_APP_CMD);
       
        if(errorstatus!=SD_OK)return errorstatus;

        SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT;
        SDIO_DataInitStructure.SDIO_DataLength = 8;  //8个字节长度,block为8字节,SD卡到SDIO.
        SDIO_DataInitStructure.SDIO_DataBlockSize = SDIO_DataBlockSize_8b  ;  //块大小8byte
        SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToSDIO;
        SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block;
        SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Enable;
        SDIO_DataConfig(&SDIO_DataInitStructure);               

        SDIO_CmdInitStructure.SDIO_Argument = 0x0;
        SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SD_APP_SEND_SCR;        //发送ACMD51,短响应,参数为0       
        SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;  //r1
        SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
        SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
        SDIO_SendCommand(&SDIO_CmdInitStructure);
       
        errorstatus=CmdResp1Error(SD_CMD_SD_APP_SEND_SCR);
       
        if(errorstatus!=SD_OK)return errorstatus;                       
       
        while(!(SDIO->STA&(SDIO_FLAG_RXOVERR|SDIO_FLAG_DCRCFAIL|SDIO_FLAG_DTIMEOUT|SDIO_FLAG_DBCKEND|SDIO_FLAG_STBITERR)))
        {
                if(SDIO_GetFlagStatus(SDIO_FLAG_RXDAVL) != RESET)//接收FIFO数据可用
                {
                        *(tempscr+index)=SDIO_ReadData();        //读取FIFO内容
                        index++;
                        if(index>=2)break;
                }
        }

        if(SDIO_GetFlagStatus(SDIO_FLAG_DTIMEOUT) != RESET)                //数据超时错误
                {                                                                                  
                         SDIO_ClearFlag(SDIO_FLAG_DTIMEOUT);         //清错误标志
                        return SD_DATA_TIMEOUT;
                 }else if(SDIO_GetFlagStatus(SDIO_FLAG_DCRCFAIL) != RESET)        //数据块CRC错误
                {
                         SDIO_ClearFlag(SDIO_FLAG_DCRCFAIL);                  //清错误标志
                        return SD_DATA_CRC_FAIL;                  
                }else if(SDIO_GetFlagStatus(SDIO_FLAG_RXOVERR) != RESET)         //接收fifo上溢错误
                {
                         SDIO_ClearFlag(SDIO_FLAG_RXOVERR);                //清错误标志
                        return SD_RX_OVERRUN;                 
                }else if(SDIO_GetFlagStatus(SDIO_FLAG_STBITERR) != RESET)         //接收起始位错误
                {
                         SDIO_ClearFlag(SDIO_FLAG_STBITERR);//清错误标志
                        return SD_START_BIT_ERR;                 
                }  
        SDIO_ClearFlag(SDIO_STATIC_FLAGS);//清除所有标记
        //把数据顺序按8位为单位倒过来.          
        *(pscr+1)=((tempscr[0]&SD_0TO7BITS)<<24)|((tempscr[0]&SD_8TO15BITS)<<8)|((tempscr[0]&SD_16TO23BITS)>>8)|((tempscr[0]&SD_24TO31BITS)>>24);
        *(pscr)=((tempscr[1]&SD_0TO7BITS)<<24)|((tempscr[1]&SD_8TO15BITS)<<8)|((tempscr[1]&SD_16TO23BITS)>>8)|((tempscr[1]&SD_24TO31BITS)>>24);
        return errorstatus;
}

这是我用的SD卡,带卡套

这是我用的SD卡,带卡套

最佳答案

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-8-6 15:21:22 | 显示全部楼层
回复

使用道具 举报

13

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2017-7-14
在线时间
56 小时
 楼主| 发表于 2017-8-6 21:25:38 | 显示全部楼层

因为这句 if(SDIO_GetFlagStatus(SDIO_FLAG_RXDAVL) != RESET)所以没能跳出循环,表示接收的FIFO数据不可用,这是为什么,难道是前面设置的字节长度和块大小不对吗?我用的是东芝的16G卡。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-8-7 00:34:46 | 显示全部楼层
muzi2017 发表于 2017-8-6 21:25
因为这句 if(SDIO_GetFlagStatus(SDIO_FLAG_RXDAVL) != RESET)所以没能跳出循环,表示接收的FIFO数据不可 ...

请参考我们例程
2-128G,都测试过可以
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2017-8-29
在线时间
8 小时
发表于 2017-9-1 10:31:59 | 显示全部楼层
楼主解决了吗?我遇到了和你一样的问题
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2017-8-29
在线时间
8 小时
发表于 2017-9-1 10:41:06 | 显示全部楼层
正点原子 发表于 2017-8-7 00:34
请参考我们例程
2-128G,都测试过可以

原子哥,我也遇到了SD卡初始化的问题,和楼主的一样。换了张卡还是挂载SD卡失败,错误代码0x03,是什么意思?
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10580
金钱
10580
注册时间
2017-2-18
在线时间
1916 小时
发表于 2017-9-2 00:41:19 | 显示全部楼层
如果是在数据传输模式下 ,0x03可能代表SD卡出在待机模式
回复

使用道具 举报

21

主题

108

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
355
金钱
355
注册时间
2017-11-25
在线时间
80 小时
发表于 2018-12-11 17:00:06 | 显示全部楼层
openedvsld 发表于 2017-9-1 10:41
原子哥,我也遇到了SD卡初始化的问题,和楼主的一样。换了张卡还是挂载SD卡失败,错误代码0x03,是什么意 ...

我遇到了和你一样的问题,请问你解决了吗
回复

使用道具 举报

21

主题

108

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
355
金钱
355
注册时间
2017-11-25
在线时间
80 小时
发表于 2018-12-11 17:01:35 | 显示全部楼层
muzi2017 发表于 2017-8-6 21:25
因为这句 if(SDIO_GetFlagStatus(SDIO_FLAG_RXDAVL) != RESET)所以没能跳出循环,表示接收的FIFO数据不可 ...

请问楼主解决问题了嘛  我遇到了同样的问题
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-26 14:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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