单片机读写SD卡教程.doc_第1页
单片机读写SD卡教程.doc_第2页
单片机读写SD卡教程.doc_第3页
单片机读写SD卡教程.doc_第4页
单片机读写SD卡教程.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

点这郑重声明:本实验并不是对所有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 = P11;sbit SD_DI = P12;sbit SD_DO = P10;sbit SD_CS = P13;sbit Beep=P20;/用来调程序标志/=/=/定义512字节缓冲区,89C52直接定义成unsigned char DATA80;,太大了RAM不够unsigned char xdata DATA512;void delay(unsigned int z)unsigned int x,y;for(x=z;x0;x-);for(y=110;y0;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(i24);SdWrite(argument16);SdWrite(argument8);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)SdCommand(0x01,0,0xff);/SdCommand(0x01,0x00000000,0xff);/进SPIresponse=0xff;SD_DI=1;for(i=0;i250;i+)/response!=0x00/等待回复response=SdResponse(); /Beep=0;/if(response=0) break;if(response=0) break;/回复0则通过SPI,只要通过SPI后面的指令才能继/续/Beep=0;/Beep=0;/看程序能否跳出来,挑不出来则进不了SPISD_CS=1;SdWrite(0xff);SD_CS=0;/Beep=0;return 1; /=/往SD卡指定地址写数据,一次最多512字节 最好不要乱写 否则fat系统被改掉SD卡打不开unsigned char SdWriteBlock(unsigned char *Block, unsigned long address,int len)unsigned int count;unsigned char dataResp;SD_CS=0;SdCommand(0x18,address,0xff);if(SdResponse()=00)SdWrite(0xff);SdWrite(0xff);SdWrite(0xff);/command was a success - now send data/start with DATA TOKEN = 0xFESdWrite(0xfe);/now send datafor(count=0;countlen;count+) SdWrite(*Block+);for(;count512;count+) SdWrite(0);/data block sent - now send checksumSdWrite(0xff); /两字节CRC校验, 为0XFFFF 表示不考虑CRCSdWrite(0xff);/Now read in the DATA RESPONSE tokendataResp=SdRead();while(SdRead()=0);dataResp=dataResp&0x0f; /mask the high byte of the DATA RESPONSE tokenSD_CS=1;SdWrite(0xff);if(dataResp=0x0b)return 0;if(dataResp=0x05)return 1;return 0;/printf(Command 0x18 (Write) was not received by the SD.n);return 0;/=/从SD卡指定地址读取数据,一次最多512字节unsigned char SdReadBlock(unsigned char *Block, unsigned long address,int len)unsigned int count,i;uchar response;SD_CS=0;/while(1)/SdCommand(0x11,address,0xff);/SD_DO=1;/P0=SdResponse();/P0=0xff;/while(1);while(response!=0xfe & i=200) Beep=0;/P0=0xf0;/Beep=0;for(count=0;count512;count+) *Block+=SdRead(); SdRead();SdRead();/Now read in the DATA RESPONSE tokenSD_CS=1;SdWrite(0xff);return 1;void main()unsigned int mm;unsigned long AddTemp=0x11200;/70144;/SD卡地址第一个数据物理地址初始

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论