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

上传人:sk****8 文档编号:3545918 上传时间:2019-06-04 格式:DOC 页数:9 大小:38.50KB
下载 相关 举报
基于AT89C52单片机的SD卡读写设计.doc_第1页
第1页 / 共9页
基于AT89C52单片机的SD卡读写设计.doc_第2页
第2页 / 共9页
基于AT89C52单片机的SD卡读写设计.doc_第3页
第3页 / 共9页
基于AT89C52单片机的SD卡读写设计.doc_第4页
第4页 / 共9页
基于AT89C52单片机的SD卡读写设计.doc_第5页
第5页 / 共9页
点击查看更多>>
资源描述

1、基于 AT89C52 单片机的 SD 卡读写设计 2011-09-30 12:49:29 来源:互联网 关键字:AT89C52 SD 卡读写 长期以来,以 Flash Memory 为存储体的 SD 卡因具备体积小、功耗低、可擦写以及非易失性等特点而被广泛应用于消费类电子产品中。特别是近年来,随着价格不断下降且存储容量不断提高,它的应用范围日益增广。当数据采集系统需要长时间地采集、记录海量数据时,选择 SD 卡作为存储媒质是开发者们一个很好的选择。在电能监测以及无功补偿系统中,要连续记录大量的电压、电流、有功功率、无功功率以及时间等参数,当单片机采集到这些数据时可以利用 SD 作为存储媒质。本

2、文主要介绍了 SD 卡在电能监测及无功补偿数据采集系统中的应用方案。设计方案应用 AT89C52 读写 SD 卡有两点需要注意。首先,需要寻找一个实现 AT89C52 单片机与 SD 卡通讯的解决方案;其次,SD 卡所能接受的逻辑电平与 AT89C52 提供的逻辑电平不匹配,需要解决电平匹配问题。通讯模式SD 卡有两个可选的通讯协议:SD 模式和 SPI 模式。SD 模式是 SD 卡标准的读写方式,但是在选用 SD 模式时,往往需要选择带有 SD 卡控制器接口的 MCU,或者必须加入额外的 SD卡控制单元以支持 SD 卡的读写。然而,AT89C52 单片机没有集成 SD 卡控制器接口,若选用

3、SD 模式通讯就无形中增加了产品的硬件成本。在 SD 卡数据读写时间要求不是很严格的情况下,选用 SPI 模式可以说是一种最佳的解决方案。因为在 SPI模式下,通过四条线就可以完成所有的数据交换,并且目前市场上很多 MCU 都集成有现成的 SPI 接口电路,采用 SPI 模式对SD 卡进行读写操作可大大简化硬件电路的设计。虽然 AT89C52 不带 SD 卡硬件控制器,也没有现成的 SPI接口模块,但是可以用软件模拟出 SPI 总线时序。本文用 SPI总线模式读写 SD 卡。电平匹配SD 卡的逻辑电平相当于 3.3V TTL 电平标准,而控制芯片AT89C52 的逻辑电平为 5V CMOS 电

4、平标准。因此,它们之间不能直接相连,否则会有烧毁 SD 卡的可能。出于对安全工作的考虑,有必要解决电平匹配问题。要解决这一问题,最根本的就是解决逻辑器件接口的电平兼容问题,原则主要有两条:一为输出电平器件输出高电平的最小电压值,应该大于接收电平器件识别为高电平的最低电压值;另一条为输出电平器件输出低电平的最大电压值,应该小于接收电平器件识别为低电平的最高电压值。一般来说,通用的电平转换方案是采用类似SN74ALVC4245 的专用电平转换芯片,这类芯片不仅可以用作升压和降压,而且允许两边电源不同步。但是,这个方案代价相对昂贵,而且一般的专用电平转换芯片都是同时转换 8 路、16 路或者更多路数

5、的电平,相对本系统仅仅需要转换 3 路来说是一种资源的浪费。考虑到 SD 卡在 SPI 协议的工作模式下,通讯都是单向的,于是在单片机向 SD 卡传输数据时采用晶体管加上拉电阻法的方案,基本电路如图 1 所示。而在 SD 卡向单片机传输数据时可以直接连接,因为它们之间的电平刚好满足上述的电平兼容原则,既经济又实用。这个方案需要双电源供电(一个 5V 电源、一个 3.3V 电源供电) ,3.3V 电源可以用 AMS1117 稳压管从 5V 电源稳压获取。硬件接口设计SD 卡提供 9Pin 的引脚接口便于外围电路对其进行操作,9Pin 的引脚随工作模式的不同有所差异。在 SPI 模式下,引脚1(D

6、AT3)作为 SPI 片选线 CS 用,引脚 2(CMD)用作 SPI总线的数据输出线 MOSI,而引脚 7(DAT0)为数据输入线MISO,引脚 5 用作时钟线(CLK) 。除电源和地,保留引脚可悬空。本文中控制 SD 卡的 MCU 是 ATMEL 公司生产的低电压、高性能 CMOS 8 位单片机 AT89C52,内含 8K 字节的可反复擦写的只读程序存储器和 256 字节的随机存储数据存储器。由于AT89C52 只有 256 字节的数据存储器,而 SD 卡的数据写入是以块为单位,每块为 512 字节,所以需要在单片机最小系统上增加一片 RAM。本系统中 RAM 选用存储器芯片 HM6225

7、6,容量为 32K。对 RAM 进行读写时,锁存器把低 8 位地址锁存,与 P2 口的 8 位地址数据构成 16 位地址空间,从而可使 SD 卡一次读写 512 字节的块操作。系统硬件图如图 2 所示。软件设计SPI 工作模式SD 卡在上电初期自动进入 SD 总线模式,在此模式下向SD 卡发送复位命令 CMD0。如果 SD 卡在接收复位命令过程中CS 低电平有效,则进入 SPI 模式,否则工作在 SD 总线模式。对于不带 SPI 串行总线接口的 AT89C52 单片机来说,用软件来模拟 SPI 总线操作的具体做法是:将 P1.5 口(模拟 CLK线)的初始状态设置为 1,而在允许接收后再置 P

8、1.5 为 0。这样,MCU 在输出 1 位 SCK 时钟的同时,将使接口芯片串行左移,从而输出 1 位数据至 AT89C52 单片机的 P1.7(模拟 MISO线) ,此后再置 P1.5 为 1,使单片机从 P1.6(模拟 MOSI 线)输出 1 位数据(先为高位)至串行接口芯片。至此,模拟 1 位数据输入输出便完成。此后再置 P1.5 为 0,模拟下 1 位数据的输入输出,依此循环 8 次,即可完成 1 次通过 SPI 总线传输 8 位数据的操作。本文的实现程序把 SPI 总线读写功能集成在一起,传递的val 变量既是向 SPI 写的数据,也是从 SPI 读取的数据。具体程序如下:(程序是

9、在 Keil uVision2 的编译环境下编写)sbit CS=P35;sbit CLK= P15;sbit DataI=P17;sbit DataO=P16;#define SD_Disable() CS=1 /片选关#define SD_Enable() CS=0 /片选开unsigned char SPI_TransferByte(unsigned char val)unsigned char BitCounter;for(BitCounter=8; BiCounter!=0; BitCounter-) CLK=0;DataI=0; / writeif(valval=1;CLK=1;i

10、f(DataO)val|=1; / readCLK=0;return val;nextSD 卡的初始化对 SD 卡进行操作首先要对 SD 卡进行初始化,初始化的过程中设置 SD 卡工作在 SPI 模式,其流程图如图 3 所示。在复位成功之后可以通过 CMD55 和 ACMD41 判断当前电压是否在工作范围内。主机还可以继续通过 CMD10 读取 SD 卡的 CID 寄存器,通过 CMD16 设置数据 Block 长度,通过CMD9 读取卡的 CSD 寄存器。从 CSD 寄存器中,主机可获知卡容量,支持的命令集等重要参数。SD 卡初始化的 C 语言程序如下:unsigned char SD_In

11、it(void) unsigned char retry,temp;unsigned char i;for (i=0;i0x0f;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

12、_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)

13、写操作,多块操作是指从指定位置开始写下去,直到 SD 卡收到一个停止命令 CMD12 才停止。单块写操作的数据块长度只能是 512 字节。单块写入时,命令为 CMD24,当应答为 0 时说明可以写入数据,大小为 512 字节。SD 卡对每个发送给自己的数据块都通过一个应答命令确认,它为 1 个字节长,当低 5 位为 00101 时,表明数据块被正确写入SD 卡。在需要读取 SD 卡中数据的时候,读 SD 卡的命令字为CMD17,接收正确的第一个响应命令字节为 0xFE,随后是 512个字节的用户数据块,最后为 2 个字节的 CRC 验证码。可见,读写 SD 卡的操作都是在初始化后基于 SD 卡命令和响应完成操作的,写、读 SD 卡的程序流程图如图 4 和图 5 所示。结束语实验结果表明单片机使用 12MHz 的晶体振荡器时,读写速度和功耗都基本令人满意,可以应用于对读写速度要求不高的情况下。本文详细阐述了用 AT89C52 单片机对 SD 卡进行操作的过程,提出了一种不带 SD 卡控制器,MCU 读写 SD 卡的方法,实现了 SD 卡在电能监测及无功补偿数据采集系统中的用途。(本文转自电子工程世界:http:/

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 实用文档资料库 > 策划方案

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。