足球外围app-靠谱的外围足球app

行业新闻
Group news
足球外围app(靠谱的外围足球app)    您的位置: 足球外围app  >  行业新闻  >  正文

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

2019年11月08日 文章来源:网络整理 热度:146℃ 作者:刘英

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

关键词:SD卡单片机

  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卡程序详解

  单片机读取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); //等待按键按下继续执行

  }

  }

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

关注电子发烧友微信

有趣有料的资讯及技术干货

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

下载发烧友APP

打造属于您的人脉电子圈

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

关注发烧友课堂

锁定最新课程活动及技术直播

声明:电子发烧友网转载作品均尽可能注明出处,该作品所有人的一切权利均不因足球外围app而转移。

上一篇:单片机硬件、软件抗干扰措施介绍


下一篇:从3个方面来了解物联网安全的指标参数

友情链接
Links
XML 地图 | Sitemap 地图