OpenEdv-开源电子网

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

为什么SD卡中读取SCR寄存器的值是反的?

[复制链接]

18

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
420
金钱
420
注册时间
2016-9-2
在线时间
78 小时
发表于 2017-11-16 16:51:32 | 显示全部楼层 |阅读模式
1金钱
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->FIFO;    //读取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;
}

从哪里的资料能看到 SCR寄存器都出来的数据 是反的??

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2017-11-16 21:19:28 | 显示全部楼层
慢慢看手册,看能否看出什么眉目吧,呵呵。
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2021-3-15
在线时间
5 小时
发表于 2021-12-10 16:03:57 | 显示全部楼层
正点原子 发表于 2017-11-16 21:19
慢慢看手册,看能否看出什么眉目吧,呵呵。

原子哥,为啥有时候发送ACMD51后,应答正常,这时候再读取scr里的值tempscr[0] = SDMMC_ReadFIFO(hsd->Instance); 都是0x0呢,有时候是这样。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2021-12-10 23:03:09 | 显示全部楼层
lijay910 发表于 2021-12-10 16:03
原子哥,为啥有时候发送ACMD51后,应答正常,这时候再读取scr里的值tempscr[0] = SDMMC_ReadFIFO(hsd->In ...

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

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 10:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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