单片机读取sd卡数据,sdad

 SD卡简介

 SD卡是Secure Digital Card卡的简称,直译成汉语就是“安全数字卡”,是由日本松下公司、东芝公司和美国SANDISK公司共同开发研制的全新的存储卡产品。SD存储卡是一个完全开放的标准(系统),多用于MP3、数码摄像机、数码相机、电子图书、AV器材等等,尤其是被广泛应用在超薄数码相机上。SD卡在外形上同MultiMedia Card卡保持一致,大小尺寸比MMC卡略厚,容量也大很多。并且兼容MMC卡接口规范。不由让人们怀疑SD卡是MMC升级版。

 另外,SD卡为9引脚,目的是通过把传输方式由串行变成并行,以提高传输速度。它的读写速度比MMC卡要快一些,同时,安全性也更高。SD卡最大的特点就是通过加密功能,可以保证数据资料的安全保密。它还具备版权保护技术,所采用的版权保护技术是DVD中使用的CPRM技术(可刻录介质内容保护)。

 

 单片机读取sd卡数据_51单片机读写SD卡程序详解

 #include 《reg52.h》//程序通过调试

 #include 《stdio.h》

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

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

 sbit SD_CLK = P3^7;

 sbit SD_DI = P3^5;

 sbit SD_DO = P3^6;

 sbit SD_CS = P3^4;

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

 //定义按键端口

 sbit KEY = P2^7;

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

 //定义512字节缓冲区,注意需要使用 xdata关键字

 unsigned char xdata DATA[512];

 void delayms(unsigned int count)

 {

 int i,j;

 for(i=0;i《count;i++)

 {

 for(j=0;j《260;j++);

 }

 }

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

 //写一字节到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=0;

 SD_CLK=1;

 n《《=1;

 if(SD_DO) n|=1;

 }

 return n;

 }

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

 //检测SD卡的响应

 unsigned char SdResponse()

 {

 unsigned char i=0,response;

 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(CRC);

 }

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

 //初始化SD卡

 unsigned char SdInit(void)

 {

 int delay=0, trials=0;

 unsigned char i;

 unsigned char response=0x01;

 SD_CS=1;

 for(i=0;i《=9;i++)

 SdWrite(0xff);

 SD_CS=0;

 //Send Command 0 to put MMC in SPI mode

 SdCommand(0x00,0,0x95);

 response=SdResponse();

 if(response!=0x01)

 {

 return 0;

 }

 while(response==0x01)

 {

 SD_CS=1;

 SdWrite(0xff);

 SD_CS=0;

 SdCommand(0x01,0x00ffc000,0xff);

 response=SdResponse();

 }

 SD_CS=1;

 SdWrite(0xff);

 return 1;

 }

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

 //往SD卡指定地址写数据,一次最多512字节

 //unsigned char SdWriteBlock(unsigned char *Block, unsigned long address,int len)

 unsigned char SdWriteBlock(unsigned long address,int len)

 {

 unsigned int count;

 unsigned char dataResp;

 //Block size is 512 bytes exactly

 //First Lower SS

 SD_CS=0;

 //Then send write command

 SdCommand(0x18,address,0xff);

 if(SdResponse()==00)

 {

 SdWrite(0xff);

 SdWrite(0xff);

 SdWrite(0xff);

 //command was a success - now send data

 //start with DATA TOKEN = 0xFE

 SdWrite(0xfe);

 //now send data

 //for(count=0;count《len;count++) SdWrite(*Block++);

 for(count=0;count《len;count++) SdWrite(count);

 //for(count=0;count《len;count++) SdWrite(0xFF);

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

 //data block sent - now send checksum

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

 SdWrite(0xff);

 //Now read in the DATA RESPONSE token

 dataResp=SdRead();

 //Following the DATA RESPONSE token

 //are a number of BUSY bytes

 //a zero byte indicates the MMC is busy

 while(SdRead()==0);

 dataResp=dataResp&0x0f; //mask the high byte of the DATA RESPONSE token

 SD_CS=1;

 SdWrite(0xff);

 if(dataResp==0x0b)

 {

 //printf(“DATA WAS NOT ACCEPTED BY CARD -- CRC ERROR\n”);

 return 0;

 }

 if(dataResp==0x05)

 return 1;

 //printf(“Invalid data Response token.\n”);

 return 0;

 }

 //printf(“Command 0x18 (Write) was not received by the MMC.\n”);

 return 0;

 }

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

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

 unsigned char SdReadBlock(unsigned char *Block, unsigned long address,int len)

 {

 unsigned int count;

 //Block size is 512 bytes exactly

 //First Lower SS

 //printf(“MMC_read_block\n”);

 SD_CS=0;

 //Then send write command

 SdCommand(0x11,address,0xff);

 if(SdResponse()==00)

 {

 //command was a success - now send data

 //start with DATA TOKEN = 0xFE

 while(SdRead()!=0xfe);

 for(count=0;count《len;count++) *Block++=SdRead();

 for(;count《512;count++) SdRead();

 //data block sent - now send checksum

 SdRead();

 SdRead();

 //Now read in the DATA RESPONSE token

 SD_CS=1;

 SdRead();

 return 1;

 }

 //printf(“Command 0x11 (Read) was not received by the MMC.\n”);

 return 0;

 }

 void initbaud(void)

 {

 TMOD=0X20;

 TH1=0XFD;

 TL1=0XFD;

 PCON=0X00;

 TR1=1;

 SCON=0X50;//8位波特可变

 //SCON=0X52;//8位波特可变 TI开中断

 }

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

 //主程序

 main()

 {

 unsigned int i;

 unsigned long AddTemp=331264;//SD卡地址第一个数据物理地址初始值,可以用winhex查看,这里是641物理扇区,512x641=328192,根据实际SD卡内容更改

 delayms(5);

 SdInit(); //SD卡初始化

 while(1)

 {

 SdWriteBlock(AddTemp,512);

 delayms(1000);

 AddTemp=331264;

 SdReadBlock(DATA,AddTemp,512);//每次读出512字节放到缓冲区

 initbaud();

 for(i=0;i《512;i++)

 {

 SBUF=DATA[i];

 while(!TI);

 TI=0;

 delayms(1);

 }

 while(KEY); //等待按键按下继续执行

 }

 }

相关推荐

相关文章