单片机读写SD卡教程.doc

上传人:wj 文档编号:7425533 上传时间:2023-05-11 格式:DOC 页数:8 大小:191KB
下载 相关 举报
单片机读写SD卡教程.doc_第1页
第1页 / 共8页
单片机读写SD卡教程.doc_第2页
第2页 / 共8页
单片机读写SD卡教程.doc_第3页
第3页 / 共8页
单片机读写SD卡教程.doc_第4页
第4页 / 共8页
单片机读写SD卡教程.doc_第5页
第5页 / 共8页
单片机读写SD卡教程.doc_第6页
第6页 / 共8页
单片机读写SD卡教程.doc_第7页
第7页 / 共8页
单片机读写SD卡教程.doc_第8页
第8页 / 共8页
亲,该文档总共8页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

单片机读写SD卡教程.doc

《单片机读写SD卡教程.doc》由会员分享,可在线阅读,更多相关《单片机读写SD卡教程.doc(8页珍藏版)》请在冰点文库上搜索。

单片机读写SD卡教程.doc

点这

郑重声明:

本实验并不是对所有SD卡都能成功运行

第一步:

打开winhex软件,用读卡器读SD卡,在winhex中查看SD卡

点击查找(ctrl+F)

输入FAT(找到DBR处)

发现DBR起始于0x11200扇区地址,它必是512整数倍,因为一个扇区含512BYTE,所以在程序中读一个扇区时一定要是512整数倍,否则会出错。

11200地址对应的值是0xEB,本程序读一下这个地址的值看看是否正确。

注意有的winhex编址是十进制

看看程序吧

#include

#defineucharunsignedchar

#defineuintunsignedint

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

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

sbitSD_CLK=P1^1;

sbitSD_DI=P1^2;

sbitSD_DO=P1^0;

sbitSD_CS=P1^3;

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

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

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

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

unsignedcharxdataDATA[512];

voiddelay(unsignedintz)

{

unsignedintx,y;

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

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

}

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

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

voidSdWrite(unsignedcharn)

{

unsignedchari;

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

{

SD_CLK=0;

SD_DI=(n&0x80);

n<<=1;

SD_CLK=1;

}

SD_DI=1;

}

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

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

unsignedcharSdRead()

{

unsignedcharn,i;

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

{

SD_CLK=1;

SD_CLK=0;

n<<=1;

if(SD_DO)n|=1;

}

returnn;

}

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

//检测SD卡的响应

unsignedcharSdResponse()

{

uchari=0,response=0;

while(i<=8)

{

response=SdRead();

if(response==0x00)

break;

if(response==0x01)

break;

i++;

}

returnresponse;

}

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

//发命令到SD卡

voidSdCommand(unsignedcharcommand,unsignedlongargument,unsignedcharCRC)

{

SdWrite(command|0x40);

/*SdWrite(((unsignedchar*)&argument)[0]);

SdWrite(((unsignedchar*)&argument)[1]);

SdWrite(((unsignedchar*)&argument)[2]);

SdWrite(((unsignedchar*)&argument)[3]);*/

SdWrite(argument>>24);

SdWrite(argument>>16);

SdWrite(argument>>8);

SdWrite(argument);

SdWrite(CRC);

}

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

//初始化SD卡

unsignedcharSdInit(void)

{

unsignedchari;

unsignedcharresponse=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)

{

return0;

}

if(response==0x01)

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

SD_CS=1;

//Beep=0;

//while

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

SdWrite(0xff);

SD_CS=0;

while

(1)

{

SdCommand(0x01,0,0xff);//SdCommand(0x01,0x00000000,0xff);//进SPI

response=0xff;

SD_DI=1;

for(i=0;i<250;i++)//response!

=0x00//等待回复

{

response=SdResponse();//Beep=0;/

if(response==0)break;

}

if(response==0){break;}//回复0则通过SPI,只要通过SPI后面的指令才能继//续

// Beep=0;

}

// Beep=0;//看程序能否跳出来,挑不出来则进不了SPI

SD_CS=1;

SdWrite(0xff);

SD_CS=0;

// Beep=0;

return1;

}

}

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

//往SD卡指定地址写数据,一次最多512字节最好不要乱写否则fat系统被改掉SD卡打不开

unsignedcharSdWriteBlock(unsignedchar*Block,unsignedlongaddress,intlen)

{

unsignedintcount;

unsignedchardataResp;

SD_CS=0;

SdCommand(0x18,address,0xff);

if(SdResponse()==00)

{

SdWrite(0xff);

SdWrite(0xff);

SdWrite(0xff);

//commandwasasuccess-nowsenddata

//startwithDATATOKEN=0xFE

SdWrite(0xfe);

//nowsenddata

for(count=0;count

for(;count<512;count++)SdWrite(0);

//datablocksent-nowsendchecksum

SdWrite(0xff);//两字节CRC校验,为0XFFFF表示不考虑CRC

SdWrite(0xff);

//NowreadintheDATARESPONSEtoken

dataResp=SdRead();

while(SdRead()==0);

dataResp=dataResp&0x0f;//maskthehighbyteoftheDATARESPONSEtoken

SD_CS=1;

SdWrite(0xff);

if(dataResp==0x0b)

{

return0;

}

if(dataResp==0x05)return1;

return0;

}

//printf("Command0x18(Write)wasnotreceivedbytheSD.\n");

return0;

}

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

//从SD卡指定地址读取数据,一次最多512字节

unsignedcharSdReadBlock(unsignedchar*Block,unsignedlongaddress,intlen)

{

unsignedintcount,i;

ucharresponse;

SD_CS=0;

// while

(1)

// {

SdCommand(0x11,address,0xff);

// SD_DO=1;

// P0=SdResponse();

// P0=0xff;

// while

(1);

while(response!

=0xfe&&i<200){response=SdRead();P0=response;i++;}

// if(i>=200)Beep=0;

// P0=0xf0;

// }

// Beep=0;

for(count=0;count<512;count++)*Block++=SdRead();

SdRead();

SdRead();

//NowreadintheDATARESPONSEtoken

SD_CS=1;

SdWrite(0xff);

return1;

}

voidmain()

{

unsignedintmm;

unsignedlongAddTemp=0x11200;//70144;//SD卡地址第一个数据物理地址初始值70144是通过winhex查看,对于你的SD卡肯定要改

//可以用winhex查看,一定要是512整数倍

mm=SdInit();

//

SdReadBlock(DATA,AddTemp,1);

delay(10);

// Beep=0;

if(DATA[0]==0xeb)Beep=0;//看读的对不对

while

(1);

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2