您当前的位置:五五电子网电子知识电子知识资料主板-硬盘-存储-插卡基于51单片机SD卡的读写设计 正文
基于51单片机SD卡的读写设计

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

点击数:7434 次   录入时间:03-04 11:40:50   整理:http://www.55dianzi.com   主板-硬盘-存储-插卡

  该设计的硬件接口电路如下图所示,SD卡的操作模式选用SPI模式,单片机通过软件编程实现SPI模式的数据传输。在SPI模式下,单片机与SD卡的连接主要有4根线:包括时钟线,两根数据传输线和一根片选线。引脚1(CS)作为SPI片选线CS用,引脚2(DI)用作SPI总线的数据输入线,而引脚7(DO)为数据输出线,引脚5用作时钟线(CLK)。除电源和地,保留引脚可悬空。

接口电路

  在电路中还要解决SD卡与AT89C51的电平匹配问题,这里使用如下图所示的电路,将AT89C51的5VCMOS逻辑电平转换为SD卡的3.3VTTL电平,从而实现它们之间的正确连接。

电平转换电路

  SD卡在进行通信和数据读写时采用标准的SPI接口,由于51系列单片机不具备标准的SPI接口,因此在通信过程中需要通过软件编程,实现对标准SPI接口通信协议的模拟以实现通信过程。
  
  SD卡的软件设计主要包括两部分内容:SD卡的上电初始化过程和对SD卡的读写操作。
  
  下面首先介绍一些SD卡读写过程中用到的操作子函数。
  
  1.SD卡读写的操作子函数SD卡读写的操作子函数主要包括以下几个。
  
  函数delay:延时微秒。
  
  函数SD_read_byte:读出一字节。
  
  函数SD_write_byte:写入一字节。
  
  函数SD_write_command:发送SD的命令。
  
  (1)延时函数delay。
  
  该函数用来实现延时微秒,其程序代码如下。

程序代码

  (2)函数SD_read_byte。
  
  该函数的功能是从SD卡读出一个字节的数据信号,接收信号时从高位到低位进行,其程序代码如下。

程序代码

程序代码

  (3)函数SD_write_byte。
  
  该函数的功能是向SD卡写入一个字节的数据信号,写入数据时从高位到低位进行,其程序代码如下。

程序代码

  (4)函数SD_write_command。
  
  该函数用于向SD卡写入不同的操作命令以实现不同的功能,每个命令的字节数为6个,其程序代码如下。

程序代码

程序代码

 



www.55dianzi.com

  2.SD卡的上电初始化
  
  SD卡从上电到对SD卡进行正确的读写操作需要一个上电初始化的过程。上电初始化的流程图如下图示,操作步骤如下。

流程图

  (1)SD卡上电后,主机必须首先向SD卡发送74个时钟周期,以完成SD卡上电过程。
  
  (2)SD卡上电后会自动进入SD总线模式,并在SD总线模式下向SD卡发送复位命令CMD0,此时应设置片选信号CS处于低电平态,使SD卡进入SPI总线模式,否则SD卡工作在SD总线模式。
  
  (3)SD卡进入SPI工作模式后会发出应答信号,若主机读到的应答信号为01,即表明SD卡已进入SPI模式,此时主机即可不断地向SD卡发送命令字CMD1并读取SD卡的应答信号,直到应答信号为00,以表明SD卡已完成初始化过程,准备好接收下一命令。
  
  (4)初始化完成后,系统便可读取SD卡的各寄存器,并进行读写等操作。
  
  SD卡的上电初始化程序代码如下。

程序代码

程序代码

 



www.55dianzi.com

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

流程图

  写SD卡的程序代码如下。

程序代码

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

流程图

  读SD卡的程序代码如下。

程序代码

程序代码

  注意事项
  
  (1)在SD初始化时应当注意的是:主机在向SD卡发送命令字CMDO时,SD卡是处于SD总线模式的,此时要求每一个命令都要有合法的CRC校验位,所以,此时的命令字CMDO必须有正确的CRC校验位(其校验位为95H)。而在发送命令字CMD1时,SD卡已处于SPI模式,而默认的SPI模式无需CRC校验,此时的CRC校验位可直接写入0。
  
  (2)读扇区:SD卡允许以块数据进行读写,在这里用CMD16命令设定每读写的块为512字节,正好是一个扇区,设置好后用CMD17读块命令读取512放入缓冲区即可。




本文关键字:单片机  主板-硬盘-存储-插卡电子知识资料 - 主板-硬盘-存储-插卡