下麵是 SD 卡 V2.0 協議的 CSD 寄存器內容,來自官方手冊: 單片機如何確定當前的 SD 卡遵循 V2.0 協議 CSD 寄存器為 128 個位,即 16 個位元組。通過檢測 CSD 寄存器的 bit126 是 0 還是 1 來判斷。如果是 1,即是 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;