本帖最后由 q909832336 于 2012-11-3 15:29 编辑
1.求一份好的技术手册~~
2.求一个可以交流的群~
3.我一张1G的卡~发送CMD8~~无论格式化是FAT16还是FAT32~得到的版本号都是0x01 ~4G的卡,版本号也为0x01~~发送CMD58,均返回0xff~
以下是相关代码:
//================================================================================================
//实现功能:读取SD卡的响应
//返回参数:response 响应标志
//================================================================================================
unsigned char SdResponse()
{
unsigned char response,time=0;;
do
{
response=SdRead();
time++;
}
while((response==0xff)&&(time<100));//100次以内尝试读取响应
return response; //返回读取的数据
}
//================================================================================================
//实现功能:发命令到SD卡
//================================================================================================
void SdCommand(unsigned char command, unsigned long argument, unsigned char CRC)
{
unsigned char i,a[6];
SD_CS=1;
SdWrite(0xff); //提高兼容性,如果没有这里,有些SD卡可能不支持
SD_CS=0;
a[0]=command|0x40;
a[1]=((argument&0xff000000)>>24);
a[2]=((argument&0x00ff0000)>>16);
a[3]=((argument&0x0000ff00)>>8);
a[4]= argument&0x000000ff;
a[5]= CRC;
for(i=0;i<6;i++)
{
SdWrite(a);
}
}
/******************************************************************
- 功能描述:检测SD卡版本,SD卡分为SD与SDHC,通过CMD8进行判断,SD与
SDHC的初始化以及寻址方法都不尽相同
- 隶属模块:SD/SDHC模块
- 函数属性:内部
- 参数说明:无
- 返回说明:SD卡的版本号,0x05为SD1.0 0x01为SD2.0
******************************************************************/
unsigned char SD_Check_Version()
{
do
{
SD_CS=0;
delay(500);
SdCommand(8,0x1aa,0x87);
sd_ver=SdResponse();
SD_CS=1; //关闭片选
SdWrite(0xff); //按照SD卡的操作时序在这里补8个时钟
}
while(sd_ver == 0x04);
return sd_ver; //返回版本值
}
/******************************************************************
- 功能描述:获取SD卡的寻址方式
- 隶属模块:SD/SDHC模块
- 函数属性:内部
- 参数说明:无
- 返回说明:调用成功,返回0x00,否则返回INIT_CMD1_ERROR (sd.h中有定义)
******************************************************************/
unsigned char SD_Get_Addr_Mode() //获取SD卡的寻址方式,是字节寻址,还是块寻址
{
SD_CS=0;
SdCommand(0x7a,0,0x00); //写入CMD58
addr_mode=SdRead();SdRead();SdRead();SdRead(); //后三次读取空读
SD_CS=1;
SdWrite(0xff); //按照SD卡的操作时序在这里补8个时钟
return addr_mode&0x40; //返回版本值
} |