单片机读写SD卡教程

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

郑重声明:本实验并不是对所有SD卡都能成功运行

第一步:打开winhex软件,用读卡器读SD卡,在winhex中查看SD卡

点这

点击查找(ctrl+F)

输入FAT(找到DBR处)

发现DBR起始于0x11200扇区地址,它必是512整数倍,因为一个扇区含512BYTE,所以在程序中读一个扇区时一定要是512整数倍,否则会出错。11200地址对应的值是0xEB,本程序读一下这个地址的值看看是否正确。注意有的winhex编址是十进制

看看程序吧

#include

#define uchar unsigned char

#define uint unsigned int

//=============================================================

//定义SD卡需要的4根信号线

sbit SD_CLK = P1^1;

sbit SD_DI = P1^2;

sbit SD_DO = P1^0;

sbit SD_CS = P1^3;

sbit Beep=P2^0;//用来调程序标志

//===========================================================

//===========================================================

//定义512字节缓冲区,,89C52直接定义成unsigned char DATA[80];,太大了RAM不够unsigned char xdata DATA[512];

void delay(unsigned int z)

{

unsigned int x,y;

for(x=z;x>0;x--);

for(y=110;y>0;y--);

}

//=========================================================== //写一字节到SD卡,模拟SPI总线方式

void SdWrite(unsigned char n)

{

unsigned char i;

for(i=8;i;i--)

{

SD_CLK=0;

SD_DI=(n&0x80);

n<<=1;

SD_CLK=1;

}

SD_DI=1;

}

//=========================================================== //从SD卡读一字节,模拟SPI总线方式

unsigned char SdRead()

{

unsigned char n,i;

for(i=8;i;i--)

{

SD_CLK=1;

SD_CLK=0;

n<<=1;

if(SD_DO) n|=1;

}

return n;

}

//============================================================ //检测SD卡的响应

unsigned char SdResponse()

{

uchar i=0,response=0;

while(i<=8)

{

response = SdRead();

if(response==0x00)

break;

if(response==0x01)

break;

i++;

}

return response;

}

//================================================================ //发命令到SD卡

void SdCommand(unsigned char command, unsigned long argument, unsigned char CRC) {

SdWrite(command|0x40);

/*SdWrite(((unsigned char *)&argument)[0]);

SdWrite(((unsigned char *)&argument)[1]);

SdWrite(((unsigned char *)&argument)[2]);

SdWrite(((unsigned char *)&argument)[3]);*/

SdWrite(argument>>24);

SdWrite(argument>>16);

SdWrite(argument>>8);

SdWrite(argument);

SdWrite(CRC);

}

//================================================================ //初始化SD卡

unsigned char SdInit(void)

{

unsigned char i;

unsigned char response=0xFF;

P3=0xff;

SD_CS=1;

for(i=0;i<=0xfe;i++)

SdWrite(0xff);

SD_CS=0;

SdCommand(0x00,0,0x95);

SD_DI=1;

response=SdResponse();

if(response!=0x01)

{

return 0;

}

if(response==0x01)

{ //不管什么SD卡都能进入这一步,同时也说明硬件没问题SD_CS=1;

//Beep=0;

//while(1);//用来查看程序能否运行到这一步,去掉//即可

SdWrite(0xff);

SD_CS=0;

while(1)

相关文档
最新文档