新闻中心

EEPW首页>嵌入式系统>设计应用> 基于AT89C52单片机的SD卡读写设计

基于AT89C52单片机的SD卡读写设计

作者:武汉理工大学自动化学院 苏义鑫 程 敏 武汉大学 何力 时间:2008-08-04 来源:中电网 收藏

卡的初始化

本文引用地址://m.amcfsurvey.com/article/86566.htm

  对卡进行操作首先要对卡进行初始化,初始化的过程中设置SD卡工作在SPI模式,其流程图如图3所示。

  在复位成功之后可以通过CMD55和ACMD41判断当前电压是否在工作范围内。主机还可以继续通过CMD10读取SD卡的CID寄存器,通过CMD16设置数据Block长度,通过CMD9读取卡的CSD寄存器。从CSD寄存器中,主机可获知卡容量,支持的命令集等重要参数。SD卡初始化的C语言程序如下:

  unsigned char SD_Init(void)

  { unsigned char retry,temp;

  unsigned char i;

  for (i=0;i<0x0f;i++)

  { SPI_TransferByte(0xff); //延迟74个以上的时钟

  }

  SD_Enable(); //开片选

  SPI_TransferByte(SD_RESET); //发送复位命令

  SPI_TransferByte(0x00);

  SPI_TransferByte(0x00);

  SPI_TransferByte(0x00);

  SPI_TransferByte(0x00);

  SPI_TransferByte(0x95);

  SPI_TransferByte(0xff);

  SPI_TransferByte(0xff);

  retry=0;

  do{ temp=Write_Command_SD(SD_INIT,0);

  //发送初始化命令

  retry++;

  if(retry==100) //重试100次

  {SD_Disable(); //关片选

  return(INIT_CMD1_ERROR);

  //如果重试100次失败返回错误号

  }

  }while(temp!=0);

  SD_Disable(); //关片选

  return(TRUE); //返回成功

  }

  数据块的读写

  完成SD卡的初始化之后即可进行它的读写操作。SD卡的读写操作都是通过发送SD卡命令完成的。SPI总线模式支持单块(CMD24)和多块(CMD25)写操作,多块操作是指从指定位置开始写下去,直到SD卡收到一个停止命令CMD12才停止。单块写操作的数据块长度只能是512字节。单块写入时,命令为CMD24,当应答为0时说明可以写入数据,大小为512字节。SD卡对每个发送给自己的数据块都通过一个应答命令确认,它为1个字节长,当低5位为00101时,表明数据块被正确写入SD卡。

  在需要读取SD卡中数据的时候,读SD卡的命令字为CMD17,接收正确的第一个响应命令字节为0xFE,随后是512个字节的用户数据块,最后为2个字节的CRC验证码。

  可见,读写SD卡的操作都是在初始化后基于SD卡命令和响应完成操作的,写、读SD卡的程序流程图如图4和图5所示。

结束语

  实验结果表明使用12MHz的晶体振荡器时,读写速度和功耗都基本令人满意,可以应用于对读写速度要求不高的情况下。本文详细阐述了用对SD卡进行操作的过程,提出了一种不带SD卡控制器,MCU读写SD卡的方法,实现了SD卡在电能监测及无功补偿数据采集系统中的用途。


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭