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

电子常识

2640人已加入

描述

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

  }

  }

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
评论(0)
发评论
chenxitianlan 2023-07-25
0 回复 举报
我记得振南出国fat文件系统,当时感觉挺好的,后来不知道咋没有了,华怡科技出过一个详细的SD卡操作视频,用户的时stm32讲解的,挺好的,不过要钱,某宝有,但是他的时stm32的,讲的倒是可以 收起回复

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分