1.关于sd卡容量计算的问题
u32 SD_GetSectorCount(void)
{
u8 csd[16];
u32 Capacity;
u8 n;
u16 csize;
//取CSD信息,如果期间出错,返回0
if(SD_GetCSD(csd)!=0) return 0;
//如果为SDHC卡,按照下面方式计算
if((csd[0]&0xC0)==0x40) //V2.00的卡
{
csize = csd[9] + ((u16)csd[8] << 8) + 1;
Capacity = (u32)csize << 10;//得到扇区数
}else//V1.XX的卡
{
n = (csd[5] & 15) + ((csd[10] & 128) >> 7) + ((csd[9] & 3) << 1) + 2;
csize = (csd[8] >> 6) + ((u16)csd[7] << 2) + ((u16)(csd[6] & 3) << 10) + 1;
Capacity= (u32)csize << (n - 9);//得到扇区数
}
return Capacity;
}
memory capacity = (C_SIZE+1) * 512 K byte (sdhc卡 2.0协议上的)
本人理解是不是扇区数=容量/512Bytes= (C_SIZE+1) * 1024,所以求出C-size就可以求出扇区数,但是我不明白为什么程序中是 csd[9] + ((u16)csd[8],查看协议应该是寄存器
如图所示C_SIZE(69:48),应该是csd[9] ,csd[8],csd[7],而且最大支持32G,所以最后6位为0,本人疑惑的是程序中按照那种原理写出来的,希望大神们帮帮忙?
2.if(SD_Type!=SD_TYPE_V2HC)sector <<= 9;//转换为字节地址
这句话是什么意思,本人在协议书上找了好久都没有找到这句话的依据,本人英语比较烂,可能漏过了,本人菜鸟大家别嫌问的太幼稚,希望不吝赐教。
3. r1=SD_SendCmd(CMD17,sector,0X01);//读命令
看来程序)0x01是crc校验码,本人不明白的是这个不是spi自己完成的吗?为什么自己写crc校验码发送?
|