单片机读取sd卡数据,sdad 2023-12-01 21:27:31 0 0 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); //等待按键按下继续执行 } } 收藏(0)