zoukankan      html  css  js  c++  java
  • 以 SPI 方式获取 SD 卡容量(V2.0)

    下面是 SD 卡 V2.0 协议的 CSD 寄存器内容,来自官方手册:

    单片机如何确定当前的 SD 卡遵循 V2.0 协议

    CSD 寄存器为 128 个位,即 16 个字节。通过检测 CSD 寄存器的 bit126 是 0 还是 1 来判断。如果是 1,即是 V2.0 版本的。

    相关代码如下:

    u8 SD_GetCSD(u8 *csd_data)
    {
        u8 r1;	 
        
        /* 发送读取 CSD 指令 */
        r1=SD_SendCmd(CMD9,0,0x01);、
        if(r1==0)
    	{
        	r1=SD_RecvData(csd_data, 16);
        }
        
        /* 取消片选 */
    	SD_DisSelect();
    	
    	if(r1)return 1;
    	else return 0;
    } 
        /* 访问出错返回 */
        if(SD_GetCSD(csd) != 0) return 0;	  
        
        /* 确保为 V2.0 的卡 */
        if((csd[0]&0xC0)==0x40)
    

    V2.0 的 CSD 寄存器中,关于描述容量的位如下图所示:

    V2.0 的 C_SIZE 和容量相关,共 22 个位,从 bit48~69,位于 csd[7]、csd[8]、csd[9]。

    手册上提供计算的公式和方法如下图所示:

    总结起来即:

    csize = csd[9] + ((uint32_t)csd[8] << 8) + ((uint32_t)(csd[7] & 63) << 16) + 1;
    Capacity = csize << 9;
    

    注意:Capacity 算出来的容量单位是 bytes,实际应用中,注意单位的转换。

    程序附录

    u8 SD_GetResponse(u8 Response)
    {
    	u16 Count  =0xFFFF;
    	
    	/* 等待响应 */
    	while ((SD_SPI_ReadWriteByte(0XFF) != Response)&&Count)Count--;
    	
    	if (Count==0)
    	    return MSD_RESPONSE_FAILURE;
    	else
    	    return MSD_RESPONSE_NO_ERROR;
    }
    
    u8 SD_RecvData(u8*buf,u16 len)
    {			  	  
        /* 等待响应 */
    	if(SD_GetResponse(0xFE))return 1;
    	
        while(len--)
        {
            *buf = SPI1_ReadWriteByte(0xFF);
            buf++;
        }
    
        /* 发送 2 个伪 CRC */
        SD_SPI_ReadWriteByte(0xFF);
        SD_SPI_ReadWriteByte(0xFF);									  					    
        return 0;
    }
    
    u32 SD_GetSectorCount(void)
    {
        u8 csd[16];
        u32 Capacity;  
    	u32 csize;  
    	
        if(SD_GetCSD(csd)!=0) return 0;	  
      
        if((csd[0]&0xC0)==0x40)
        {	
            csize = csd[9] + ((uint32_t)csd[8] << 8) + ((uint32_t)(csd[7] & 63) << 16) + 1;
            Capacity = csize << 9;
        }
        
        return Capacity;
    
  • 相关阅读:
    [杂七杂八][高效程序员应该养成的七个习惯][转载]
    链表反转,只用两次头插法就实现了 hello
    清除空格 hello
    单词计数 hello
    单词查找程序 hello
    sdut 超级玛丽
    ural Episode Nth: The Jedi Tournament(缩点+建树)
    sudt 括号东东(模拟题)
    ural Pilot Work Experience(dfs + bfs )
    ural Team building(强连通分支)
  • 原文地址:https://www.cnblogs.com/GyForever1004/p/8858385.html
Copyright © 2011-2022 走看看