SD卡存储采集数据电路设计毕业论文 - 图文
更新时间:2024-06-01 20:29:01 阅读量: 综合文库 文档下载
- sd卡存储数据的原理推荐度:
- 相关推荐
I
编号:
毕业设计说明书
题 目: SD卡存储采集
数据电路设计
题目类型: 理论研究 实验研究 √工程设计 工程技术研究 软件开发
2012年4月10日
II
摘 要
许多工业现场需要数据采集器完成各类数据采集工作。实际应用中要求数据采集器工作可靠,成本低廉,操作简单便于数据收集和分析;既要方便与PC机联机,又能独立完成数据采集、存储工作。
随着近年来SD卡储存容量的大幅度提高,价格降低,其应用范围越来越广泛。当数据采集系统需要较长的时间来捕捉和记录大量数据时,选择SD卡作为存储介质,是一个非常好的选择。例如在电能监测以及无功补偿系统中,要连续记录大量的电压、电流、有功功率、无功功率以及时间等参数,当单片机采集到这些数据时就可以利用SD作为存储媒质。
论文介绍了SD卡存储采集数据电路设计原理、电路以及程序,阐述了基于STC12C5A60S2芯片主控的DY_mini80E开发板实现数据的采集和数据的SD存储的设计电路过程和实现方法以及运行得到的结果分析。该系统能同时采集四路周期信号波形,并将四路模拟电压(0-5V)进行A/D转换,每秒钟转换一次,结果转换为ASCII码形式,且四路结果分别存储到SD卡预先建立好的CH1.txt、CH2.txt、CH3.txt、CH4.txt文档中。设计在STC12C5A60S2主控芯片的DY_mini80E开发板上,利用开发板上A/D转换模块PCF8591,外接SD接口模块,完成了调试实现。
关键词:数据采集;STC12C5A60S2;PCF8591;SD卡;REG1117-3.3;FAT32文件系统
III
Abstract
Many industry site need data collector of all kinds of data acquisition work completed. Practical application request data collector reliable, low cost, easy to operate, easy to data collection and analysis; Both convenient and PC online, and independently complete the data acquisition, storage work.
In recent years, with SD card storage capacity greatly raised, the lower prices, its application scope is more and more widely. When the data acquisition system needs a long time to catch and records of large quantities of data, choose SD card as a storage medium, is a very good choice. For example in the electrical energy monitoring and reactive compensation system, a record a lot of voltage, current, active power, reactive power and parameters such as time, when the SCM acquisition to these data can use SD as storage medium.
This paper introduces the SD card store data acquisition circuit design principle, circuit and program, this paper expounds the main control based on STC12C5A60S2 chip DY_mini80E development board realize data acquisition and data storage SD circuit design process and the realization methods and operation result analysis. The system can also collecting four ways of periodic signal waveform, and will be four road simulation voltage (0-5 V) for A/D conversion, every second conversion once, result into ASCII form, and four road respectively to the storage SD card established beforehand good CH1. TXT, CH2. TXT, CH3. TXT, CH4. TXT documents. The design of the main control chip in STC12C5A60S2 DY_mini80E development board, using the developed on board A/D conversion module PCF8591, external SD interface module, completed the debugging realized.
Keyword: Data collection;STC12C5A60S2; PCF8591; SD card; REG1117-3.3; FAT32 file system
IV
目 录
引言 .......................................................... 2 1 方案论证与选择 .............................................. 3
1.1 设计相关指标分析及系统构成 ...................................................... 3 1.2 主控电路芯片的选择 .............................................................. 3
2 SD卡简介 ................................................... 4
2.1 SD存储卡系统概念 ................................................................ 4 2.1.1总线拓扑 ....................................................................... 4 2.1.2总线协定 ....................................................................... 6 2.2 SD卡的引脚定义及SD卡的命令 ..................................................... 7 2.2.1 SD卡的引脚定义 ................................................................ 7 2.2.2 SD卡的命令 .................................................................... 8
3 硬件设计 .................................................. 10
3.1 电源模块 ....................................................................... 10 3.2 单片机最小系统 ................................................................. 11 3.2.1 STC12C5A60S2原理图以及它的特性 ............................................... 11 3.2.2 单片机STC12C5A60S2最小系统的组成 ............................................ 13 3.3 带SD卡的TFT彩屏 .............................................................. 15
4 软件设计 .................................................. 18
4.1 软件设计目标 ................................................................... 18 4.2 设计环境 ....................................................................... 18 4.3 系统软件设计 ................................................................... 18 4.3.1 系统初始化 ................................................................... 18 4.3.2 SD卡初始化 ................................................................... 19 4.3.3 数据块的读写 ................................................................. 20 4.3.4 SD卡存储时间和电压流程图 ..................................................... 23
V
4.3.5 定时器T0函数流程图 .......................................................... 24 4.3.6 主体程序流程图 ............................................................... 24
5 结论 ...................................................... 26 谢 辞 ..................................................... 27 参考文献 ..................................................... 28 附 录 ..................................................... 29
第 2 页 共 36 页
引言
随着近年来SD卡储存容量不断大幅度提高,价格不断降低,其应用范围越来越广泛。当数据采集系统需要较长的时间来捕捉和记录大量数据时,选择SD卡作为存储介质,是一个非常好的选择。就如在电能监测系统中,要连续记录大量的电压、电流及时间等参数,当采集到这些数据时就可以利用SD作为存储媒质。
SD卡是由日本松下、东芝及美国SanDisk公司于1999年8月共同开发研制。大小不足一张邮票的SD一记忆卡,重量不足2克,但却拥有高记忆容量、快速数据传输率、极大的移动灵活性以及很好的安全性。SD卡在24mm×32mm×2.1mm的体积内结合了SanDisk快闪一记忆卡控制与MLC技术和Toshiba(东芝)0.6u及0.13 u的NAND技术,通过9针的接口界而与专门的驱动器相连接,不需要额外的电源来保持其上记忆的信息。而且它是一体化固体介质,没有任何移动部分。SD卡的技术建立是基于MultiMwdia卡(MMc)格式上发展而来,大小和MMC差不多。长宽和MMC一样,只是比MMC厚了0.7mm,以容纳更大容量的存贮单元。SD卡与MMC卡保持着向上兼容,也就是说,MMC可以被新的SD设备存取,兼容性则取决于应用软件,但SD卡却不可以被MMC设备存取。
采用SD卡存储技术设计一款低成本数据采集模块。该数据采集模块可与PC机共同实现数据采集与分析,也可长时间独立工作于工业现场,并将采集数据存放于大容量SD卡,便于数据收集并利用计算机分析。该数据采集模块,结构简单,工作稳定,体积小,成本低。
单片机是智能化模块,有数据存储、读写的功能,并且支持汇编和C语言编程,在工作电压稳定的条件下可以实现长时间稳定的工作,而且还具有价格低廉的优势。在读写SD卡中,单片机比PC机更适合在现场长时间工作。而STC12C5A60S2系列单片机价格便宜、性能稳定。基于此特点,设计采用PCF8591进行A/D转换,用STC12C5A60S2单片机对SD卡进行读写操作。
第 3 页 共 36 页
1 方案论证与选择
1.1 设计相关指标分析及系统构成
设计要求是将四路模拟电压进行数字化后存储到SD存储卡中。具体说明如下: (1)将四路模拟电压(0-5V)进行A/D转换,转换结果为十进制3位有效数字。 (2)要求每秒钟各路都转换一次,并将结果转换为ASCII码形式,如1.23V。 (3)四路结果分别存储到SD卡预先建立好的CH1.txt、CH2.txt、CH3.txt、CH4.txt文档中。
图1.1是SD卡存储采集数据电路设计框图。系统要完成模拟电压的A/D转换,每秒钟各自转换一次,结果分别存到建立好的SD卡中的文档中。
电源 A通道输入 (按键(采集与清除) 采四 (PCF8591)A/D集路 B通道输入 模、带拟
电压 C通道输入 卡)(的主 控 D通道输入 芯彩片转 屏换(SD0V-5V) TFT ) 图1.1 SD卡存储采集数据电路设计框图
STC12C5A60S2卡存储与彩屏显示 SD1.2 主控电路芯片的选择
方案一:AVR单片机上资源丰富:带E2PROM,PWM,RTC,SPI,UART,TWI,ISP,AD,WDT等;AVR除了有ISP功能外,还有IAP功能,方便升级应用程序;AVR单片机系列齐全,可适用于各种不同场合的要求。具有高的处理速度,能够非常容易、快速地处理复杂的数字信号。
方案二:采用STC12C5A60S2单片机实现整个系统的统一控制和数据处理。单片机STC12C5A60S2是一种超低功耗微处理器, 具有丰富的片上外设和较强的运算能力, 支持在线编程, 使用十分方便, 性价比较高。由STC12C5A60S2芯片主控DY_mini80E开发板(板上含有PCF8591八位A/D转换模块)再加上一块带SD卡的TFT彩屏等就可以满足题目设计调试要求。设计采用此方案。
第 4 页 共 36 页
2 SD卡简介
2.1 SD存储卡系统概念 2.1.1总线拓扑 (1)SD模式总线 SD总线信号:
CLK: 主设备对卡发出的时钟讯号。 CMD: 双向命令/响应讯号。
DAT0-DAT3: 4个双向数据传输信号。 VDD、VSS1、VSS2: 电源与地。
SD模式总线有主机(应用程序),从机(卡),同步的星型拓扑(如图2.1)。时钟、电源、地连接到所有卡。命令(CMD)和数据(DAT0- DAT3)信号对每个卡提供点到点的连接。在发初始化命令给每张卡的时候,允许应用程序发现并分配逻辑地址给卡此时数据总是单独地被送到每个卡。然而,在初始化之后,所有的命令就可以同时送到所有的卡,为了分开控制堆叠中的卡,而将地址信息包含在命令包中。
主机
Clk Vdd Vss D0-3(a) Cmd(a) Clk Vdd Vss D0-3(b) Cmd(b) Clk Vdd Vss D0-3(c) Cmd(c) SD存储卡(a) SD存储卡(b) SD存储卡(c) 图2.1 SD模式总线拓扑图
SD总线允许动态的配置数据线的数目。在上电后,SD存储卡默认的只使用DAT0作为数据传输线。在设定初值之后主机能改变总线宽度(即改为2根线或3根线等。)
第 5 页 共 36 页
(2)SPI模式总线
SD存储卡的兼容通信模式被设计为连接SPI通道,被用在各种微控制器中。如图2.2。这种模式在上电后的第一次复位时选择使用,在重新上电之前不能变更。SPI标准只定义实际的连接,和不完全的数据转移协定。SD卡的SPI模式使用在SD模式下相同的模式。从应用程序观点来看,SPI模式使用的是现有的设备,这样就使得主机系统通过很小的改动就可以使用SD卡。缺点是数据传输效率的损失,相对SD模式减小了总线宽度。
SD存储卡的SPI接口能连接到具有SPI接口的现有主机上。和任何其他的SPI设备一样,SD存储卡的SPI接口如下四种信号组成: CS: 主机到卡的片选信号。 CLK: 主机到卡的时钟信号。 DataIn: 主机到卡的数据信号。
DataOut: 卡到主机的数据信号。
SPI的另一个特性是字节方式的传输,在卡中也一样。所有的数据都是字节(8位)的集合,而且总是字节排列好等待CS信号。
图2.2 SPI模式总线拓扑
卡的区别和寻址方式被片选(CS)信号代替。每个命令都是被CS信号是低电平的那张卡接收。
CS信号在SPI处理时(命令传输、响应和数据传物必须是一直有效的。SPI使用SD模式中9根信号线中的7根(DAT1. DAT2不使用,DAT3是CS信号)。
第 6 页 共 36 页
2.1.2总线协定 (1)SD总线
SD总线上的通信是基于命令和数据位流,开始于启动位、结束于停止位,如图2.3。
命令: 一个命令是启动一个操作的记号。每条命令都可以从主机发出,被唯一的卡接收(定址命令),或被全部卡接收(广播命令)。命令可以在CMD线上被连续的传输。
响应:响应可以由被定址的卡发出,或者所有的卡(同时)向主机发出对先前命令的应答。响应可以在CMD线上连续的传输。
数据:数据能从卡传输到主机,反之亦然,数据经由数据线传输。
卡使用一个中间地址来实现寻址,在设定初始相位期间中间地址被分配到卡上。SD总线上的基本操作是命期响应方式。这种总线处理方式是直接在命令或响应结构里面传递他们的信息。此外,有些操作带有数据。
R1、R3、R6 开始位 R2 图2.3 响应的方式
传递到SD卡或从卡中传出的数据是包含在数据块中的。CRC位标志了数据块传输的
0 响应位 0 0 0 开始位 响应的内容:反映了命令和状态信息(R1响应),ORG寄存器(R3响应)或RCA(R6),被一个7bitCRC核对和保护 响应位 结束位 CONTENT 总长度=48字节 CONTENT=CID or CSD 总长度=136字节 CRC 1 结束位 1 成功完成;单一块和多重块的操作是预先定义的;注意多重块操作模式有利于快速写入;当一个停止命令在CMD线上出现的时候,一个多重块传输结束。数据转移可以根据主机的配置使用单根或多根数据线(只要卡支持)。
每个命令以一个起始位‘0'开始以一个截止位‘1'结束,总长度是48位。每段指令都被CRC位保护以便传输错误时能被发现,而且运算可能是重复的。
响应根据其内容,有四种编码方式。长度不是48位就是136位。数据块的CRC保护算法为多名的16位的CCITT。
在CMD线中MSB位先传愉,LSB位后传输。当使用宽总线时,数据一次传输4位。
第 7 页 共 36 页
每一根DAT线都要传输开始位、结束位和CRC位。CRC位被每根DAT线单独计算并核对。CRC状态响应和忙指示只会在DAT0上由卡向主机传输(DAT1-DAT3在此期间与此无关)。 (2)SPI总线
SD通道以指令和以起始位开始以停止位结束的数据位流为基础,SPI通道是被定向的位组。每个命令或数据块都被组装为8位的字节并且是被排齐到CS信号的字节(即长度是8个时钟周期的循环)。类似SD协议,SPI信息也是由命令、响应和数据块所组成。所有的通信在主机和卡之间被主机控制。主机处理总线上CS信号为低电平的那个。
响应的行为在SPI模式里有三个方面不同于SD模式: ① 被选择的卡总是回应命令。
② 响应使用为两种新的(8&16位)结构。
③ 当卡遇到一个数据检索问题的时候,它会用一个错误响应(替换预期的数据块)回应,而不像在SD模式中回应超时。
本设计采用SPI总线模式。
2.2 SD卡的引脚定义及SD卡的命令 2.2.1 SD卡的引脚定义 (1)SD卡引脚功能详述:
表2.1 SD卡引脚功能详述
引脚 编号 1 2 3 4 5 6 7 8 9 名称 SD模式 类型 描述 卡检测/数据线3 命令/回应 电源地 电源 时钟 电源地 数据线0 数据线1 数据线2 名称 #CS DI VSS VDD SCLK VSS2 DO RSV RSV SPI模式 类型 I I S S I S O或PP 描述 片选 数据输入 电源地 电源 时钟 电源地 数据输出
CD/DAT3 IO或PP CMD VSS1 VDD CLK VSS2 DAT0 DAT1 DAT2 PP S S I S IO或PP IO或PP IO或PP 注:S:电源供给;I:输入;O:采用推拉驱动的输出;PP:采用推拉驱动的输入输出。
第 8 页 共 36 页
(2) SD卡支持的两种总线方式:
SD方式与SPI方式。其中SD方式采用6线制,使用CLK、CMD、DAT0~DAT3进行数据通信。而SPI方式采用4线制,使用CS、CLK、DataIn、DataOut进行数据通信。SD方式时的数据传输速度与SPI方式要快,采用单片机对SD卡进行读写时一般都采用SPI模式。采用不同的初始化方式可以使SD卡工作于SD方式或SPI方式。这里只对其SPI方式进行介绍。 2.2.2 SD卡的命令 (1) 命令类型
控制SD卡有4种类型的命令: ① 广播命令,无响应。
广播命令的特点是如果所有的CMD线与主机连接到一起。如果把它们分开,那么每张卡将在轮到它的时候单独接收。
② 有响应的广播命令。
从所有卡来的响应是同时的。但是在SD卡里没有开漏模式,这个类型命令只可以使用在所有的CMD线是分开的情况下。这个命令将被所有的卡单独接受并响应。
③ 在DAT上没有数据传输的定址(点对点)命令。 ④ 在DAT上有数据传输的定址命令。
所有的命令和响应都在CMD线上进行。命令传送总是从左边的位开始。 (2) 命令格式
所有的命令都有48位的固定码,在20MHz的情况下需要传输2.4ms。命令格式如下:表2.2。
表2.2 命令格式
位 位数 值 描述
47 1 ‘0’ 起始位 46 1 ‘1’ 传输位 [45:40] 6 x 命令索引 [39:8] 32 x 变量 [7:1] 7 x CRC7 0 1 x 结束位 一个命令总是以一个启动位开始(总是‘0’),后面跟了指示传输方向的位(主机=‘1’)。下6位指示命令的索引,这个值解释了二进制代码数(在0和63之间)。一些命令需要一个变量(例如:一个地址32位)。在表中被‘x’指代的值,指示这个变量依赖的命令。所有的命令都被CRC保护。每一条命令由一个结束位结束。 (3) SD卡命令集:
第 9 页 共 36 页
SD卡命令共分为12类,分别为class0到classⅡ,不同的SD卡,主控根据其功能,支持不同的命令集如下:
C1ass0:(卡的识别、初始化等基本命令集): CMD0:复位SD卡。 CMD1:读OCR寄存器。 CMD9:读CSD寄存器。 CMD10:读CTD寄存器。
CMD12:停止读多块时的数据传输。 CMD13:读Cardes Status寄存器。 Class2(读卡命令集): CMD16:设置块的长度。 CMD17:读单块。
CMD18:读多块,直至主机发送CMD12为止。 Class4(写卡命令集): CMD24:写单块。 CMD25:写多块。 CMD27:写CSD寄存器。 Class5(擦除卡命令集): CMD32:设置擦除块的起始地址. CMD33:设置擦除块的终止地址。 CMD38:擦除所选择的块。 Class6(写保护命令集): CMD28:设置写保护块的地址。 CMD29:擦除写保护块的地址。
CMD30:Ask the card for the status of the mite protection bits。 Class7:卡的锁定,解锁功能命令集。 class8:申请特定命令集。 classl0和class11:保留。
其中class 1, class3,class9的SPI模式不支持。
第 10 页 共 36 页
3 硬件设计
系统整体硬件方案分为三个部分:电源部分、单片机STC12C5A60S2主控芯片的DY_mini80E开发板的选择部分(包括信号采集、A/D转换等)、带SD卡的TFT彩屏的选择部分(包括SD卡工作电路部分等)。
设计在Keil编程环境下,建立工程,编写程序,然后将程序下载到单片机中,同时复位单片机,然后调节DY_mini80E开发板上的四路电位器采集不同的电压信号(四路电压范围均0V-5V),按动采集键后,信号开始采集,每秒钟各通道进行一次A/D转换,并对数据进行处理后由单片机控制分别存入带SD卡的TFT彩屏的SD卡的相应文档中。并用TFT彩屏显示经过A/D转换后的四路实时电压,用以观察采集数据的变化。
3.1 电源模块
SD卡的工作电平为3.3V,而控制芯片STC12C5A60S2的逻辑电平为5V CMOS电平标准。因此,它们之间不能直接相连,否则可能会烧坏SD卡;出于对安全工作的考虑,有必要解决电平匹配问题。
要解决这一问题,最根本的就是解决逻辑器件接口的要有两条:一为输出电平器件输出高电平的最小电压值,应该大于接收电平器件识别为高电平的最低电压值;另一条为输出电平器件输出低电平的最大电压值,应该小于接收电平器件识别为低电平的最高电压值。
一般来说,通用的电平转换方案是采用类似SN74ALVC4245的专用电平转换芯片,这类芯片不仅可以用作升压和降压,而且允许两边电源不同。但是,这个方案代价相对昂贵,而且一般的专用电平转换芯片都是同时转换8路、16路或者更多路数的电平,相对本系统仅仅需要转换4路来说是一种资源的浪费。
带SD卡的TFT彩屏模块中包含REG1117-3.3 电压转换模块。在SD卡向单片机传输数据时可以直接连接,因为它们之间的电平刚好满足上述的电平兼容原则,所以只做一个直流5V的稳压电源给系统供电即可,既经济又实用。电源电路原理图如图3.1。
图3.1 电源电路原理图
第 11 页 共 36 页
该电路的基本工作过程是:市电220V经变压器降压变成8V交流,再经整流桥VD整流成约11.5V直流,再经过滤波电容C1、C2后经LM7805稳压管稳压成稳定的5V电压供整个系统供电。
3.2 单片机最小系统
3.2.1 STC12C5A60S2原理图以及它的特性
单片机控制模块是整个系统的核心。本系统采用STC12C5A60S2单片机为核心元件。下面图3.2就是一个STC12C5A60S2单片机的原理图。
图3.2 STC89C52原理图
STC12C5A60S2单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S,即25万次/秒),针对电机控制,强干扰场合。
(1) 增强型 8051 CPU,1T,单时钟/机器周期,指令代码完全兼容传统8051。 (2) 工作电压:
? STC12C5A60S2 系列工作电压: 5.5V - 3.3V(5V单片机); ? STC12LE5A60S2 系列工作电压: 3.6V - 2.2V(3V单片机)。 (3) 工作频率范围:0~35MHz,相当于普通8051的 0~420MHz。
(4) 用户应用程序空间 8K /16K / 20K / 32K / 40K / 48K / 52K / 60K / 62K 字
第 12 页 共 36 页
节等。
(5) 片上集成1280字节 RAM。
(6) 通用I/O口(36/40/44个),复位后为:准双向口/弱上拉(普通8051传统I/O口) 可设置成四种模式:准双向口/弱上拉,强推挽/强上拉,仅为输入/高阻,开漏每个I/O 口驱动能力均可达到20mA,但整个芯片最大不要超过120mA。
(7) ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真 器,可通过串口(P3.0/P3.1)直接下载用户程序,数秒即可完成一片。 (8) 有EEPROM功能(STC12C5A62S2/AD/PWM无内部EEPROM)和看门狗。
(9) 内部集成MAX810专用复位电路(外部晶体12M以下时,复位脚可直接1K电阻到地)。 (10) 外部掉电检测电路: 在P4.6口有一个低压门槛比较器5V单片机为1.33V,误差为 ±5%,3.3V 单片机为1.31V,误差为±3%。
(11) 时钟源:外部高精度晶体/时钟,内部R/C振荡器(温漂为±5% 到±10% 以内)用 户在下载用户程序时,可选择是使用内部R/C 振荡器还是外部晶体/ 时钟,常温下内部R/C振荡器频率为:
? 5.0V 单片机为: 11MHz ~ 15.5MHz; ? 3.3V 单片机为: 8MHz ~ 12MHz。
精度要求不高时,可选择使用内部时钟,但因为有制造误差和温漂,以实际测试为 准。
(12) 共4个16位定时器。两个与传统8051兼容的定时器/计数器,16位定时器T0 和T1, 没有定时器2,但有独立波特率发生器做串行通讯的波特率发生器,再加上2路PCA模块可再实现2个16位定时器。
(13) 2个时钟输出口,可由T0的溢出在P3.4/T0输出时钟,可由T1的溢出在P3.5/T1输 出时钟。
(14) 外部中断I/O口7路,传统的下降沿中断或低电平触发中断,并新增支持上升沿中 断的PCA模块,Power Down模式可由外部中断唤醒,INT1/P3.3,T0/P3.4,T1/P3.5, RXD/P3.0,CCP0/P1.3(也可通过寄存器设置到P4.2), CCP1/P1.4(也可通过寄存器设置到P4.3)。
(15) PWM(2路)/PCA(可编程计数器阵列,2路);也可用来当2路D/A使用;也可用来再实现2个定时器;也可用来再实现2个外部中断(上升沿中断/下降沿中断均可分别或同时支持)。
(16) A/D转换, 10位精度ADC,共8路,转换速度可达250K/S(每秒钟25万次)。 (17) 通用全双工异步串行口(UART),由于STC12系列是高速的8051可再用定时器或PCA 软件实现多串口。
(18) STC12C5A60S2系列有双串口,后缀有S2标志的才有双串口,RxD2/P1.2(可通过
第 13 页 共 36 页
寄存器设置到P4.2),TxD2/P1.3(可通过寄存器设置到P4.3)。 (19) 工作温度范围:-40 ~ +85℃(工业级) / 0 ~ 75℃(商业级)。 (20) 封装:LQFP-48, LQFP-44, PDIP-40, PLCC-44, QFN-40。
I/O口不够时,可用2到3根普通I/O口线外接74HC164/165/595(均可级联)来扩展I/O口,还可用A/D做按键扫描来节省I/O口,或用双CPU,三线通信,还多了串口。 3.2.2 单片机STC12C5A60S2最小系统的组成
单片机STC12C5A60S2最小系统(DY_mini80E开发板),是指用最少的元件组成的单片机可对STC12C5A60S2单片机来说,其最小系统一般应该包括:单片机、晶振电路、复位电路、A/D转换电路等。本设计的最小系统的原理图见附件A。 (1)复位电路
STC12C5A60S2的复位引脚(RESET)是第9脚,当此引脚连接高电平超过2个机器周期,即可产生复位的动作。以24MHz的时钟脉冲为例,每个时钟脉冲为0.5us,两个机器周期为1us,因此,在第9脚上连接一个2us的高电平脉冲,即可产生复位动作。最简单的就是只有一个电阻跟一个电容就可可靠复位的电路,电阻一般选择10KΩ,电容一般选择10uF。
DY_mini80E开发板有两种复位电路方式,如下图3.4所示的复位电路。这里说下用高电平复位:在VCC和RST端接一容量为10uF左右的电解电容,再串联一个电阻R21(10KΩ)接地。
图3.4 复位电路
第 14 页 共 36 页
正常工作时,利用RST内部复位下拉电阻Rr(40KΩ-220KΩ)便构成了复位电路。接通电源瞬时,电容C10上电压很小,由于复位下拉电阻Rr>>10KΩ,所以复位下拉电阻Rr上的电压接近电源电压,即RST位高电平,电路没有影响。在电容充电过程中,RST端电位逐渐下降,当RST端电位小于某一数值后,CPU脱离复位状态。只要电容C容量足够大,即可保证RST高电平有效时间大于24个真到周期,CPU能可靠复位。在断电后,VCC逐渐下降,当VCC=0时,相当于VCC端与地等电位,这时电容C10通过电阻R21迅速放电,保证再上电时端位高电平。
此复位电路本身存在一个缺点,当死机时只能通过关机复位。为了解决这一问题,在电解电容C10上并联一个电阻R10和开关K。
复位按钮按下时,电解电容C10通过R10放电,当电解电容C10放电结束后,RST端的电位由Rr和R10分压比决定。由于Rr>>R10,因此RST位高电平,CPU进入复位状态,松手后,电解电容C10充电,RST端电位下降,CPU脱离复位状态。R10的作用在于限制按钮按下瞬间电解电容C10的放电电流,避免产生火花,以保护按钮的触点。 (2)晶振电路(时钟电路)
STC12C5A60S2单片机的最高时钟脉冲频率已经达到了24MHz,它内部已经具备了振荡电路,只要在STC12C5A60S2的两个引脚(即18、 19脚)连接到简单的石英振荡体的2个管脚即可,同时晶体的2个管脚也要用30pF的电容耦合接地。在该电路由两个30pF的电容C8、C9和一个24MHz的晶振Y2组成。其连接方式如图3.5。
图3.5 晶振电路
(3)A/D转换电路
PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。PCF8591具有4个模拟输入、1个模拟输出和1个串行I2C总线接口。PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向I2C总线以串行的方式进行传输。
PCF8591的功能包括多路模拟输入、内置跟踪保持、8-bit模数转换和8-bit数模转换。
A/D转换电路如图3.6。电路将电压VCC(5V)通过四路W3~W6均10KΩ的滑动变阻器
第 15 页 共 36 页
(即电压可调范围0V-5V)分别进入AIN0~AIN3进行A/D转换,转换后的数字信号通过SCL、SDA脚送到STC12C5A60S2单片机。
图3.6 A/D转换电路
3.3 带SD卡的TFT彩屏
控制芯片STC12C5A60S2的逻辑电平为5V CMOS电平标准,而SD卡的逻辑电平为3.3V,它们之间不能直接相连,否则可能会烧坏SD卡;但我们选择了带SD卡的TFT彩屏模块,TFT彩屏模块中已含REG1117-3.3 电压转换模块。而在SD卡向单片机传输数据时可以直接连接,因为它们之间的电平刚好满足上述的电平兼容原则。图3.7即为带SD卡的TFT彩屏接口定义。
数据接口兼容DY_mini80E开发板上12864接口,GND为1脚,对应12864的1脚,插接方式如图3.9带SD卡的TFT彩屏与DY_mini80E开发板实物连接图。
图3.7 带SD卡的TFT彩屏接口定义
第 16 页 共 36 页
带SD卡的TFT彩屏数据接口兼容DY_mini80E开发板上的12864液晶接口,GND为1脚,对应12864液晶插座的脚,其接口原理图如图3.7;插接方式如图3.8 带SD卡的TFT彩屏与DY_mini80E开发板实物连接图。SD卡信号接口,直接接5V单片机,DY_mini80E开发板需要使用4根度光线连接,实物图见图3.9。
图3.8 TFT彩屏接口原理图
SD卡 镀光线 插接12864液晶接口,1脚对齐 图3.9 带SD卡的TFT彩屏与DY_mini80E开发板实物连接图
第 17 页 共 36 页
TFT彩屏原理图如图3.10。其中REG1117-3.3是电平转换芯片,作用是把5V的电平转换到3.3V后给74245八同相三态收发器及SD卡供安全电压。
图3.10 TFT彩屏原理图
第 18 页 共 36 页
4 软件设计
4.1 软件设计目标
最终能实现同时将四路模拟电压(0-5V)进行A/D转换,转换结果为十进制有效数字3位;要求每秒钟转换一次,并将结果转换为ASCII码形式;并将四路结果分别存储到SD卡预先建立好的CH1.txt、CH2.txt、CH3.txt、CH4.txt文档中。采集实时的4个通道电压值显示在TFT彩屏上;按S1按键进行采集及存储,再按S1按键暂停采集及存储,按S2键清除SD卡中的内容;按S按键系统进行复位。
4.2 设计环境
Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。用过汇编语言后再使用C来开发,体会更加深刻。
Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。下面介绍Keil C51开发系统各部分功能和使用。
Keil C51单片机软件开发系统的整体结构:Uvision 与Ishell分别是C51 for Windows和for Dos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。然后分别由C51及A51编译器编译生成目标文件(.OBJ),目标文件可由LIB51创建生成库文文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。 ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。
4.3 系统软件设计
设计主要在Keil环境下进行编程。 4.3.1 系统初始化
要让系统正常运行首先要对系统进行初始化,主要包括:定时器T0初始化、DS1302初始化、LCD初始化、SD卡初始化、文件系统初始化。其流程图如图4.1所示。
第 19 页 共 36 页
开始 定时器T0 初始化DS1302 初始化LCD 用背景色清屏 显示初始化状态 SD卡初始化 文件系统初始化 打开界面背景位图文件并显示 关闭背景 位图文件 显示通道 指示字符 返回
图4.1 系统始化流程图
4.3.2 SD卡初始化
对SD卡进行初始化,初始化的过程中设置SD卡工作在SPI模式,其流程图如图4.2所示。
在复位成功之后可以通过CMD55和ACMD41判断当前电压是否在工作范围内。主机还可以继续通过CMD10读取SD卡的CID寄存器,通过CMD16设置数据Block长度,通过CMD9读取卡的CSD寄存器。从CSD寄存器中,主机可获知卡容量,支持的命令集等重要
第 20 页 共 36 页
参数。具体程序见附录C。
开 始
接受SD卡响应 发送激活命令CMD1 进入SPI总线模式 发送复位命令CMD0 发送74个时钟周期 否 响应bit0=0? 结 束
图4.2 SD卡初始化流程图
4.3.3 数据块的读写
完成SD卡的初始化之后即可进行它的读写操作。SD卡的读写操作都是通过发送SD卡命令完成的。SPI总线模式支持单块(CMD24)和多块(CMD25)写操作,多块操作是指从指定位置开始写下去,直到SD卡收到一个停止命令CMD12才停止。单块写操作的数据块长度只能是512字节。单块写入时,命令为为CMD24,当应答为0时说明可以写入数据,大小为512字节。SD对每个发送给自己的数据块都通过一个应答命令确认,它为1个字节长,当低5位为00101时,表明数据块被正确写入SD卡。
可见,读写SD卡的操作都是在初始化后基于SD卡命令和响应完成操作的,写SD卡的程序流程图如图4.3所示。
第 21 页 共 36 页
开 始
发送写命令CMD24 否 响应全零吗? 返 回
接受SD卡响应 发送2字节CRC码 发送512字节数据 发送数据的起始标志 否 响应是0X5吗? 结 束
图4.3 写SD卡流程图
① 写单块
1):发送命令CMD24; 2):接收R1响应;
3):发送Data Tokens (Single Block Write: Oxfe); 4):发送一个block(一般为512个字节); 5):发送两个CRC16码;
6):循环接收数据,等待写完成,直到写完成接收到0xff。 ② 写多块
1):发送命令CMD25; 2):接收R1b响应;
3):发送Data Tokens (Single Block Write: 0xfe);
第 22 页 共 36 页
4):发送一个block(一般为512个字节; 5):发送两个字节CRC16码;
6):循环接收数据,等待写完成,直到写完成接收到0xff;
7):重复步骤3,继续发送下一个数据包,直到所有数据包发送完成,至步骤8继续; 8):发送命令CMD12,数据传输结束; 9):接受R1b相应。
在需要读取SD卡中数据的时候,读SD卡的命令字为CMD17,接收正确的第一个响应命令字节为0xFE,随后是512个字节的用户数据块,最后为2个字节的CRC验证码。 读SD卡的程序流程图如图4.4所示。
开 始
发送读命令CMD17 否 响应0xFE吗? 返 回
接受2字节CRC码 接受512字节数据 否 CRC码校正,对吗?
结 束
图4.4 读SD卡流程图
① 读单块
l):发送命令CMD17; 2):接收R1响应;
3):等待Data Tokens (Single Block Read:0xfe); 4):接收一个Block(一般为512个字节);
第 23 页 共 36 页
5):接收两个宇节CRC16码。 ② 读多块
l):发送命令CMD 17; 2):接收R1响应;
3):等待Data Tokens (Single Block Read:0xfe; 4):接收一个Block(一般为5121个字节); 5):接收两个字节CRC16码;
6):重复步骤3,继续接收下一个数据包,直到接收所有数据包完成后,至步骤7继续; 7):发送命令CMD12 ,数据传输结束; 8):接收R1b响应。
4.3.4 SD卡存储时间和电压流程图
打开指定文件,若失败(即没有该文件)那么就新建该指定文件,之后,追加该通道的日期时间和电压值,具体见流程图4.5所示。
开始 打开文件CH*.txt 否 成功? 是 新建文件CH*.txt 追加日期时间和该通道电压值 关闭文件 否 4次? 是 返回 图4.5 SD卡存储时间和电压流程图
*代表通道数
第 24 页 共 36 页
4.3.5 定时器T0函数流程图
系统要求四个通道每一秒中分别进行一次A/D转换,系统采用24MHz晶振,一个周期0.5us,定时器初值赋值为50ms,则1s/(50ms*0.5us)=40,即溢出40次中断一次为1s。具体见流程图4.6所示。
中断 重新赋初值50mS 溢出次数加一 否 溢出40次? 是 溢出次数清零 置位1S标志位 中断返回
图4.6 定时器T0函数流程图
4.3.6 主体程序流程图
系统一上电就进行系统初始化,再不断循环扫描是否有按键按下什么功能按键按下,根据有无按键按下进入往下的相应程序,之后进行时间标志判断,是,就清除标志,读各通道采样数据并计算电压值,再判断是否采集标志,是的话就SD卡存储并LCD显示,否的话不存储只LCD显示。具体见流程图4.7所示。
第 25 页 共 36 页
开始 系统初始化 未按下 采集、停止采集 按键内容 清除 删除记录文件 置位/清除采集位 否 时间标志位 是 清除时间标志位 读取DS1302 读取4个通道AD采样数据 计算电压值 否 采集标志位 是 SD卡存储 时间和电压 显示时间和各通道电压
图4.7 主程序流程图
第 26 页 共 36 页
5 结论
设计实现了利用单片机对SD卡进行读写控制的功能,基本达到了设计的目的。根据理论设计,并用计算机编程进行了模拟,制作出了实物并经测试功能完全符合设计要求。 从理论基础出发,完成了将四路模拟电压(0-5V)进行A/D转换,转换结果为十进制有效数字3位;每秒钟转换一次,结果转换为ASCII码形式;并将四路结果分别存储到SD卡预先建立好的CH1.txt、CH2.txt、CH3.txt、CH4.txt文档中。还自行增加了显示模块。
本设计应用STC12C5A60S22读写SD卡有两点需要注意。
首先,需要寻找一个实现STC12C5A60S2单片机与SD卡通讯的解决方案:SD卡有两个可选的通讯协议:SD模式和SPI模式SD模式是SD卡标准的读写方式,但是在选用SD模式时,往往需要选择带有SD卡控制器接口的MCU,或者必须加入额外的SD卡控制单元以支持SD卡的读写。然而,STC12C5A60S2单片机没有集成SD卡控制器接口,若选用SD模式通讯就无形中增加了产品的硬件成本。在SD卡数据读写时间要求不是很严格的情况下,选用SPI模式可以说是一种最佳的解决方案。因为在 SPI模式下,通过四条线就可以完成所有的数据交换,并且目前市场上很多MCU都集成有现成的SPI接口电路,采用SPI模式对SD卡进行读写操作可大大简化硬件电路的设计。设计用SPI总线模式读写SD卡。
其次,SD卡所能接受的逻辑电平与STC12C5A60S2提供的逻辑电平不匹配,需要解决电平匹配问题。要解决这一问题,最根本的就是解决逻辑器件接口的电平兼容问题,原则主要有两条:一为输出电平器件输出高电平的最小电压值,应该大于接收电平器件识别为高电平的最低电压值;另一条为输出电平器件输出低电平的最大电压值,应该小于接收电平器件识别为低电平的最高电压值。考虑到SD卡在SPI协议的工作模式下,我们采用带SD卡的TFT彩屏,它包括显示模块和SD模块,SD模块中已有电压转换模块,所以不用担心被烧坏问题。在SD卡向单片机传输数据时可以直接连接,因为它们之间的电平刚好满足上述的电平兼容原则。
第 27 页 共 36 页
谢 辞
基于SD卡存储采集数据电路设计终于告一段落了,在此我想对帮助我的老师们和同学们真诚的说声谢谢。
论文的研究工作是在陈锡华副教授的悉心指导下完成的。论文的每一步进展都倾注着老师的关怀、教导和帮助。老师渊博的知识和丰富的经验使我受益匪浅,此外,陈老师言传身教,不仅使我开拓了视野,增加了知识,更重要的是使我系统的掌握了科学研究的方法和自己动手的能力。在这里,向我的陈老师表示我由衷的谢意!
与此同时也非常感谢我的卢文华同学在设计过程中给我的帮助和鼓励。
最后,还要向所有关心和帮助过我的人致以最衷心的感谢!论文的工作是在我的导师陈锡华教授的悉心指导下完成的,陈教授严谨的治学态度和科学的工作方法给了我极大的帮助和影响。在此衷心感谢陈老师对我的关心和指导。
还要向百忙之中抽时间对本文进行审阅,评议和参与本人论文答辩的各位老师表示感谢!
第 28 页 共 36 页
参考文献
[1] 潘水雄.新编单片机原理与应用,西安:西安电子科技大学出版社,2008-01. [2] 赵威.SD存储卡的设计和实现,上海:上海交通大学软件学院,2007-09. [3] 于振南.51单片机读写SD卡,哈尔滨:哈尔滨工程大学信息学院,2009-03. [4] 康华光.电子技术基础,北京:高等教育出版社,2005-12.
[5] 潘新民,王燕芳.微型计算机控制技术,北京:电子工业出版社,2006-01. [6] 龚运新.单片机C语言开发技术,北京:清华大学出版社,2006-10. [7] 张宋润.单片机应用设计200例,北京:北京航空航天大学出版社,2006-7. [8] 关德新,冯文全.单片机外围器件实用手册-电源器件分册[M],北京:北京航空航 天大学出版社,1998-02.
[9] 华成英.模拟电子技术基础(第三版),高等教育出版社,2001.
[10] 王伟.高性能、低功耗带RAM实时时钟芯片DS1302 (上),电子世界:第一期, 1995,26-35.
[11] 王伟.高性能、低功耗带 RAM 实时时钟芯片 DS1302(下),电子世界:第四期, 1995,32-41.
第 29 页 共 36 页
附 录
附件A:STC12C5A60S2单片机最小系统原理图
第 30 页 共 36 页
附件B:A/D转换程序
/*----------------------------------------------- 名称:IIC协议 PCF8591 AD转换
内容:使用4路AD中的4路检测外部模拟量输入 ------------------------------------------------*/
#include
#define AddWr 0x90 //写数据地址 #define AddRd 0x91 //读数据地址 extern bit ack;
/*------------------------------------------------ 读AD转值程序
输入参数 Chl 表示需要转换的通道,范围从0-3 返回值范围0-255
------------------------------------------------*/ unsigned char ReadADC(unsigned char Chl) {
unsigned char Val;
Start_I2c(); //启动总线
SendByte(AddWr); //发送器件地址 if(ack==0)return(0);
SendByte(0x40|Chl); //发送器件子地址 if(ack==0)return(0); Start_I2c(); SendByte(AddRd); if(ack==0)return(0); Val=RcvByte();
NoAck_I2c(); //发送非应位 Stop_I2c(); //结束总线
return(Val); }
第 31 页 共 36 页
附件C:SD卡程序
#include \
#include \这是振南的公共函数头文件
bit is_init; //在初始化的时候设置此变量为1,同步数据传输(SPI)会放慢 unsigned char bdata _dat; sbit _dat7=_dat^7; sbit _dat6=_dat^6; sbit _dat5=_dat^5; sbit _dat4=_dat^4; sbit _dat3=_dat^3; sbit _dat2=_dat^2; sbit _dat1=_dat^1; sbit _dat0=_dat^0;
/****************************************************************** - 功能描述:IO模拟SPI,发送一个字节 - 隶属模块:SD卡模块 - 函数属性:内部
- 参数说明:x是要发送的字节 - 返回说明:无返回
- 注:其中is_init为1时,写的速度放慢,初始化SD卡SPI速度不能太高 ******************************************************************/ void SD_spi_write(unsigned char x) {
_dat=x;
SD_SI=_dat7; SD_SCL=0;
if(is_init) delay(DELAY_TIME); SD_SCL=1;
if(is_init) delay(DELAY_TIME); SD_SI=_dat6; SD_SCL=0;
if(is_init) delay(DELAY_TIME); SD_SCL=1;
if(is_init) delay(DELAY_TIME); SD_SI=_dat5; SD_SCL=0;
if(is_init) delay(DELAY_TIME); SD_SCL=1;
if(is_init) delay(DELAY_TIME); SD_SI=_dat4; SD_SCL=0;
if(is_init) delay(DELAY_TIME); SD_SCL=1;
第 32 页 共 36 页
if(is_init) delay(DELAY_TIME); SD_SI=_dat3; SD_SCL=0;
if(is_init) delay(DELAY_TIME); SD_SCL=1;
if(is_init) delay(DELAY_TIME); SD_SI=_dat2; SD_SCL=0;
if(is_init) delay(DELAY_TIME); SD_SCL=1;
if(is_init) delay(DELAY_TIME); SD_SI=_dat1; SD_SCL=0;
if(is_init) delay(DELAY_TIME); SD_SCL=1;
if(is_init) delay(DELAY_TIME); SD_SI=_dat0; SD_SCL=0;
if(is_init) delay(DELAY_TIME); SD_SCL=1;
if(is_init) delay(DELAY_TIME); }
/****************************************************************** - 功能描述:IO模拟SPI,读取一个字节 - 隶属模块:SD卡模块 - 函数属性:内部 - 参数说明:无
- 返回说明:返回读到的字节
******************************************************************/ unsigned char SD_spi_read() //SPI读一个字节 {
SD_SO=1; SD_SCL=1;
if(is_init) delay(DELAY_TIME); SD_SCL=0;
if(is_init) delay(DELAY_TIME); _dat7=SD_SO; SD_SCL=1;
if(is_init) delay(DELAY_TIME); SD_SCL=0;
if(is_init) delay(DELAY_TIME); _dat6=SD_SO; SD_SCL=1;
if(is_init) delay(DELAY_TIME);
第 33 页 共 36 页
SD_SCL=0;
if(is_init) delay(DELAY_TIME); _dat5=SD_SO; SD_SCL=1;
if(is_init) delay(DELAY_TIME); SD_SCL=0;
if(is_init) delay(DELAY_TIME); _dat4=SD_SO; SD_SCL=1;
if(is_init) delay(DELAY_TIME); SD_SCL=0;
if(is_init) delay(DELAY_TIME); _dat3=SD_SO; SD_SCL=1;
if(is_init) delay(DELAY_TIME); SD_SCL=0;
if(is_init) delay(DELAY_TIME); _dat2=SD_SO; SD_SCL=1;
if(is_init) delay(DELAY_TIME); SD_SCL=0;
if(is_init) delay(DELAY_TIME); _dat1=SD_SO; SD_SCL=1;
if(is_init) delay(DELAY_TIME); SD_SCL=0;
if(is_init) delay(DELAY_TIME); _dat0=SD_SO; return (_dat); }
/****************************************************************** - 功能描述:向SD卡写命令 - 隶属模块:SD卡模块 - 函数属性:内部
- 参数说明:SD卡的命令是6个字节,pcmd是指向命令字节序列的指针 - 返回说明:命令写入后,SD卡的回应值,调用不成功,将返回0xff
******************************************************************/ unsigned char SD_Write_Cmd(unsigned char *pcmd)
//向SD卡写命令,pcmd是命令字节序列的首地址 {
unsigned char temp,time=0; SD_CS=1;
SD_spi_write(0xff); //提高兼容性,如果没有这里,有些SD卡可能不支持 SD_CS=0;
第 34 页 共 36 页
SD_spi_write(pcmd[0]); SD_spi_write(pcmd[1]); SD_spi_write(pcmd[2]); SD_spi_write(pcmd[3]); SD_spi_write(pcmd[4]); SD_spi_write(pcmd[5]); do
{ temp = SD_spi_read();//一直读,直到读到的不是0xff或超时 time++;
}while((temp==0xff)&&(time
/****************************************************************** - 功能描述:复位SD卡,用到CMD0,使用SD卡切换到SPI模式 - 隶属模块:SD卡模块
- 函数属性:外部,供用户调用 - 参数说明:无
- 返回说明:调用成功,返回0x00,否则返回INIT_CMD0_ERROR (sd.h中有定义) ******************************************************************/ unsigned char SD_Reset()//SD卡复位,进入SPI模式,使用CMD0(命令0) {
unsigned char time,temp,i;
unsigned char pcmd[] = {0x40,0x00,0x00,0x00,0x00,0x95}; //命令0的字节序列 is_init=1; //将is_init置为1 SD_CS=1; //关闭片选
for(i=0;i<0x0f;i++) //初始时,首先要发送最少74个时钟信号,这是必须的!!! {
SD_spi_write(0xff); //120个时钟 }
SD_CS=0; //打开片选 time=0; do {
temp=SD_Write_Cmd(pcmd);//写入CMD0 time++;
if(time==TRY_TIME) {
SD_CS=1; //关闭片选
return(INIT_CMD0_ERROR);//CMD0写入失败 }
}while(temp!=0x01); SD_CS=1; //关闭片选
SD_spi_write(0xff); //按照SD卡的操作时序在这里补8个时钟 return 0;//返回0,说明复位操作成功
第 35 页 共 36 页
}
/****************************************************************** - 功能描述:初始化SD卡,使用CMD1 - 隶属模块:SD卡模块
- 函数属性:外部,供用户调用 - 参数说明:无
- 返回说明:调用成功,返回0x00,否则返回INIT_CMD1_ERROR (sd.h中有定义) ******************************************************************/ unsigned char SD_Init() //初始化,使用CMD1(命令1) {
unsigned char time,temp;
unsigned char pcmd[] = {0x41,0x00,0x00,0x00,0x00,0xff}; //命令1的字节序列 SD_CS=0; //打开片选 time=0; do {
temp=SD_Write_Cmd(pcmd); time++;
if(time==TRY_TIME) {
SD_CS=1; //关闭片选
return(INIT_CMD1_ERROR);//CMD1写入失败 }
}while(temp!=0); is_init=0; //初始化完毕,将is_init设置为0,为了提高以后的数据传输速度 SD_CS=1; //关闭片选
SD_spi_write(0xff); //按照SD卡的操作时序在这里补8个时钟 return(0); //返回0,说明初始化操作成功 }
/**************************************************************************** - 功能描述:将buffer指向的512个字节的数据写入到SD卡的addr扇区中 - 隶属模块:SD卡模块
- 函数属性:外部,供用户调用 - 参数说明:addr:扇区地址
buffer:指向数据缓冲区的指针
- 返回说明:调用成功,返回0x00,否则返回WRITE_BLOCK_ERROR (sd.h中有定义) - 注:SD卡初始化成功后,读写扇区时,尽量将SPI速度提上来,提高效率
****************************************************************************/ unsigned char SD_Write_Sector(unsigned long addr,unsigned char *buffer) //向SD卡中的 指定地址的扇区写入512个字节,使用CMD24(命令24) {
unsigned char temp,time; unsigned int i;
unsigned char pcmd[] = {0x58,0x00,0x00,0x00,0x00,0xff};
第 36 页 共 36 页
//向SD卡中单个块(512字节,一个扇区)写入数据,用CMD24 addr<<=9;
//addr = addr * 512将块地址(扇区地址)转为字节地址 [这里就限制了SD卡的最大容量为4G] pcmd[1]=((addr&0xff000000)>>24); //将字节地址写入到CMD24字节序列中 pcmd[2]=((addr&0x00ff0000)>>16); pcmd[3]=((addr&0x0000ff00)>>8); SD_CS=0;//打开SD卡片选 time=0; do {
temp=SD_Write_Cmd(pcmd); time++;
if(time==TRY_TIME) {
SD_CS=1; //关闭片选
return(temp); //命令写入失败 }
}while(temp!=0);
for(i=0;i<100;i++) //这里要插入若干时钟信号 {
SD_spi_read(); }
SD_spi_write(0xfe);//写入开始字节 0xfe,后面就是要写入的512个字节的数据 for(i=0;i<512;i++) //将缓冲区中要写入的512个字节写入SD卡 {
SD_spi_write(buffer[i]); }
SD_spi_write(0xff);
SD_spi_write(0xff); //两个字节的CRC校验码,不用关心 temp=SD_spi_read(); //读取返回值
if((temp&0x1F)!=0x05) //如果返回值是 XXX00101说明数据已经被SD卡接受了 {
SD_CS=1;
return(WRITE_BLOCK_ERROR); //写块数据失败 }
while(SD_spi_read()!=0xff);
//等到SD卡不忙(数据被接受以后,SD卡要将这些数据写入到自身的FLASH中,需要一个时间)//忙时,读回来的值为0x00,不忙时,为0xff SD_CS=1; //关闭片选
SD_spi_write(0xff);//按照SD卡的操作时序在这里补8个时钟 return(0); //返回0,说明写扇区操作成功 }
/**************************************************************************** - 功能描述:读取addr扇区的512个字节到buffer指向的数据缓冲区
第 37 页 共 36 页
- 隶属模块:SD卡模块
- 函数属性:外部,供用户调用 - 参数说明:addr:扇区地址
buffer:指向数据缓冲区的指针
- 返回说明:调用成功,返回0x00,否则返回READ_BLOCK_ERROR (sd.h中有定义) - 注:SD卡初始化成功后,读写扇区时,尽量将SPI速度提上来,提高效率
****************************************************************************/
unsigned char SD_Read_Sector(unsigned long addr,unsigned char *buffer)//从SD卡的指定扇区中读出512个字节,使用CMD17(17号命令) {
unsigned int j;
unsigned char time,temp;
unsigned char pcmd[]={0x51,0x00,0x00,0x00,0x00,0xff}; //CMD17的字节序列 addr<<=9; //addr=addr*512 将块地址(扇区地址)转为字节地址
pcmd[1]=((addr&0xff000000)>>24);//将字节地址写入到CMD17字节序列中 pcmd[2]=((addr&0x00FF0000)>>16); pcmd[3]=((addr&0x0000FF00)>>8); SD_CS=0;//打开片选 ime=0; do {
temp=SD_Write_Cmd(pcmd); //写入CMD17 time++;
if(time==TRY_TIME) {
return(READ_BLOCK_ERROR); //读块失败 }
}while(temp!=0);
while (SD_spi_read()!= 0xfe); //一直读,当读到0xfe时,说明后面的是512字节的数据了 for(j=0;j<512;j++) //将数据写入到数据缓冲区中 { buffer[j]=SD_spi_read(); }
SD_spi_read();
SD_spi_read();//读取两个字节的CRC校验码,不用关心它们 SD_CS=1; //SD卡关闭片选
SD_spi_write(0xff);//按照SD卡的操作时序在这里补8个时钟 return 0; }
正在阅读:
空巢老人关爱情况调研报告12-12
钢结构计算表08-30
税务会计年终总结不足地方五篇08-23
广西师范大学届本科毕业论文设计题目03-08
微分几何(版)梅向明黄敬之编课后题答案10-11
2022年通用节目串词精选,节目串词大全08-01
材料力学 - 习题集(含答案)02-29
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 电路设计
- 毕业论文
- 采集
- 存储
- 图文
- 数据
- 新闻稿件中的常见错误分析
- 卫生法学作业及参考答案(要点)
- 管理学关于激励理论的梳理
- 南京大学与东南大学
- 甲醇期货套期保值策略和风控流程
- 全国中考语文作文题263篇
- 片弹簧弹簧拉压试验机的基本概念
- 武汉二中广雅中学2018年中考英语模拟(二)(word版
- 线性代数第一章课后习题答案
- 《终端增值服务设计》任务书_通信113132
- 2018人教版部编本二年级下册道德与法治《试种一粒籽》公开课教案
- 40米架桥机计算书
- 二00七年象山县第三届中小学生棋类比赛
- 金属热处理工艺学课后习题答案及资料
- 门禁系统论文
- Python 解析配置模块之ConfigParser详解文档
- 高级中央空调系统操作员(多选题、判断题)
- 新店镇园北区土地整理工程
- SUB200型超探操作简规
- 金融学2014年12月在线作业(随机)2答案