《MCS51MCU读写SD卡版单片机毕业论文.doc》由会员分享,可在线阅读,更多相关《MCS51MCU读写SD卡版单片机毕业论文.doc(89页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、摘 要近年来, SD存储卡在嵌入式产品中的应用越来越广泛, 但SD卡接口一般仅集成在32位高端处理器中, 一般51单片机则由于资源限制没有该接口。因此,如何解决51单片机应用系统存取SD卡大容量数据就显得很有实际意义。本系统使用MXT8051F04A作为单片机与SD卡的接口芯片, 采用SPI串行方式对SD卡的扇区进行读写,读写过程和结果通过串口调试助手在主机上显示。本论文的核心主要从硬件设计和软件编程两个大的方面介绍了系统的实现。硬件电路设计主要包括MXT8051F04A最小系统电路、电源电路、串口电路、SD卡接口电路。程序采用C语言在Keil软件下进行编写、调试,程序主要包括SD卡扇区读写程
2、序、串口程序等软件模块。系统实现了对SD卡扇区的读写,达到了设计的要求和目的。关键字:MXT8051F04A,SD卡,Keil1 / 89ABSTRACTIn recent years, SD memory card applications in the embedded products more widely, but generally only the integrated SD card interface in 32-bit high-end processor, microcontroller 51 is generally not the interface due to r
3、esource constraints. Therefore, how to solve the 51 SCM applications to access data on large-capacity SD cards seem very practical. The system uses MXT8051F04A as SCM and SD card interface chip, using SPI mode on the SD card serial read and write sectors, reading and writing process and results thro
4、ugh the serial port on the host display debugging assistant. The core of this thesis, the main hardware and software design introduces two major aspects of the system implementation. Hardware design includes MXT8051F04A minimum system circuit, power circuit, the serial port circuitry, SD card interf
5、ace circuit. Program using C language under the Keil software write, debug, the program includes reading and writing SD card sector program, serial procedures of software modules. System realizes the SD card read and write sectors, meets the design requirements and objectives. Keywords: MXT8051F04A,
6、SD Card,Keil目 录第1章 引言11.1 选题背景11.2 研究目标和意义11.3 本文要完成的工作1第2章 单片机读写SD卡的硬件电路设计32.1 系统硬件平台组成32.2 电源模块32.3 MXT8051F04A单片机最小系统电路设计42.3.1 MXT8051F04A简介42.3.2 晶振复位电路82.4 SD卡电路设计82.4.1 通讯模式92.4.2 电平匹配92.4.3 硬件接口设计102.5 串口电路设计122.6 PCB绘制132.7 本章小结14第3章 单片机读写SD卡的软件设计143.1 SD卡的扇区读写143.1.1 模拟SPI协议143.1.2 SD卡命令15
7、3.1.3 SD卡的初始化193.1.4 数据块的读写203.2 串口程序25第4章 调试264.1 系统硬件调试264.2 软件调试274.3 软硬件的联合调试274.4 本章小结29第5章结束语305.1 总结305.2 展望30参考文献31致32附录33附录一:单片机读写SD卡的完整原理图33附录二:单片机读写SD卡的完整程序36外文资料原文63译文64第1章 引言1.1 选题背景SD卡(Secure Digital Memory Card)中文翻译为安全数码卡,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用,例如个人数码助理(PDA)、数码相机和多媒体播放器等
8、。SD卡由日本松下、东芝与美国SanDisk公司于1999年8月共同开发研制。大小犹如一邮票的SD记忆卡,重量只有2克左右,但却拥有高记忆容量、快速数据传输率、极大的移动灵活性以与很好的安全性。SD卡在现在的日常生活与工作中使用非常广泛,时下已经成为最为通用的数据存储卡。在诸如MP3、数码相机等设备上也都采用SD卡作为其存储设备。SD卡之所以得到如此广泛的使用,是因为它价格低廉、存储容量大、使用方便、通用性与安全性强等优点。既然它有着这么多优点,那么如果将它加入到单片机应用开发系统中来,将使系统变得更加出色,特别是一些单片机系统需要长时间地采集、记录海量数据时,选择SD卡作为存储媒质是开发者们
9、一个很好的选择。这就要求对SD卡的硬件与读写时序进行研究。1.2 研究目标和意义研究51单片机对SD卡的读写,解决51单片机应用系统存取大容量数据。1.3 本文要完成的工作本课题是针对单片机读写SD卡进行研究,由研究目的决定了研究的容涉与了单片机系统硬件设计和SD卡数据读取两方面。在系统硬件设计方面,包括硬件电路的设计;在软件设计方面,包括SD卡读写程序,串口程序。本文将完成以下的任务:1. 基于MXT8051F04A微控制器进行读写SD卡系统的设计,即完成本系统硬件器件的选择和电路的初步设计。2. 各子功能模块硬件电路设计、调试以与软硬件的联合调试。进行模块软硬件调试和实验,验证系统的可靠性
10、。3. 进行软件方面的研究,即SD卡协议和命令研究还有单片机串口程序,程序采用C语言在Keil环境下编写 。第2章 单片机读写SD卡的硬件电路设计2.1 系统硬件平台组成图2-1 系统硬件平台如图2-1所示系统硬件平台配置如下:控制器:时代民芯科技的MXT8051F04A单片机,运行频率可达80M。晶振复位电路:系统采用了RC上电复位。JTAG电路:用来完成程序的下载和调试。SD卡电路:SD卡使用的是存储容量为2G的金士顿SD卡。串口电路:采用了MAX232EP进行电平转换和主机进行通信。电源电路:系统采用9V供电,使用两片ASM1117电源转换芯片分别获得5V 和3.3V为系统供电。2.2
11、电源模块电源是系统最关键的部分,决定着整个系统的成败。本系统单片机供电围为3.6-5V电源,而SD卡的供电围为2.7-3.6V,所以系统需要两种电源。本系统采用9V电源供电,通过低压差三端线性稳压器ASM1117芯片得到5V和3.3V电源。电路如图2-2所示。图2-2 电源模块系统输入的9V电源首先通过ASM1117-5.0电源转换芯片把输入的9V电压转换为5V,然后5V电压再通过ASM1117-3.3把5V电压转换为3.3V.。ASM1117前后并行接了多个滤波、退藕电容,以进一步稳定线性电源的平滑度,减小电源的纹波,提高电源的带负载能力和瞬态响应。2.3 MXT8051F04A单片机最小系
12、统电路设计单片机最小系统包括:晶振电路、复位电路。复位采用了简单可靠的上电复位。2.3.1 MXT8051F04A简介本系统采用了时代民芯科技自行研制的高性能8051单片机MXT8051F04A。MXT8051F04A是以高速单指令周期8051为核的MCU。电路拥有丰富的外设,包括PWM、UART、WDT,Timer等,大容量存储器,嵌32Kx8可在线编程Flash,10位AD,8位DA,若干OP,36x4 LCD driver、POR以与可编程增益放大器(PGA)等模拟电路。电路集成片上调试系统,通过标准JTAG接口,快速诊断复杂SOC,该调试系统具有不占用任何硬件资源,支持全速运行、单步运
13、行、硬件断点、软件断点以与观察部特殊功能寄存器、程序指针和部RAM等功能。上位机通过标准JTAG接口以与用户定义指令执行在线编程和在线调试。同时提供调试和编程软件包。MXT8051F04A的系统框图如图2-3。图2-3 MXT8051F04A系统框图MXT8051F04A共有128个引脚,采用QFP128封装,其引脚排列如图2-4。图2-4 MXT8051F04A引脚排列管脚功能大致说明如下(详细介绍请看MXT8051F04A数据手册):系统时钟:XTAL1、XTAL2为MXT8051F04A系统时钟晶振的输出、输入引脚。MXT8051F04A有三个时钟源,外部晶体振荡器,部振荡器和32768
14、Hz晶体振荡器。外部晶体振荡器和部振荡器提供主时钟,通过部寄存器PCON.1(CKSEL)来选择。32768Hz晶体振荡器为RTC提供时钟。RTC: RTCXTAL1和RTCXTAL2是RTC的32768Hz晶体振荡器的输入输出引脚。I/O口:MXT8051F04A共提供一个8位双向口P0、两个5位双向口P1,P2,每个口通过口控制寄存器控制输入输出,通过上拉控制寄存器控制部上拉电阻,P2具有第二功能,通过方式控制寄存器控制P2口的第二功能。P0、P1、P2分别对应部数据寄存器P0、P1、P2,这些寄存器即可字节寻址也可位寻址,写入端口的值通过部寄存器锁存以保证I/O引脚输出的值保持不变。当进
15、行读操作时,当引脚配置为输入时,引脚的电平被读入,但通过读-修改-写指令或者当引脚被配置为输出时所读取的是部锁存器的值,而非引脚的值。CPU通过MOV传送指令对I/O口进行读写操作。 UART :TXD、RXD分别为单片机串口的发送引脚和接受引脚。UART 是一个能进行异步传输的串行口。UART 可以工作在全双工方式。在所有方式下,接收数据放入数据缓冲器。这就允许在软件尚未读取前一个数据字节的情况下开始接收第二个输入数据字节。 UART在特殊功能寄存器中有一个串行控制寄存器(SCON)和一个串行数据缓冲器(SBUF)。用同一个地址访问发送寄存器和接收寄存器。读操作访问接收寄存器,写操作访问发送
16、寄存器。 如果被允许,UART能产生中断。UART有两个中断源:一个发送中断标志TI(SCON.1)(数据字节发送结束时置位)和一个接收中断标志RI(SCON.0)(接收完一个数据字节后置位)。当UART转向中断服务程序时硬件不清除UART中断标志,中断标志必须用软件清除。这就允许软件查询UART中断的原因。PWM口:PWM0、PWM1、PWM2为PWM输出口。MXT8051F04A建3个10位PWM, 每个PWM由两个8位寄存器构成,它们分别是PWM0H,PWM0L,PWM1H,PWM1L,PWM2H,PWM2L。由PWMXL和PWMXH的低两位构成一个10位的寄存器。写入到PWMXH和PW
17、MXL的值代表一个PWM周期中的高电平宽度。当PWM计数器等于PWM寄存器时PWM输出低电平,当PWM计数器溢出时输出高电平,从而改变PWM输出的占空比,实现脉宽调制。 JTAG接口:MXT8051F04A包含一个片JTAG接口和逻辑,提供在线编程和在调试所需要的边界扫描功能,支持FLASH的读和写操作以与非侵入式在系统调试。JTAG接口有四个专用引脚,它们是:TCK、TMS、TDI和TDO。运放:MXT8051F04A部集成有5个运放器,分别是OP1-OP5。其中OP1、OP2与电阻网络一起组成一个带256级增益控制的差分输入可编程增益控制器PGA,PGA的输出送到一个起调零作用的运算放大器
18、OP3,经调零电路调整后输出到ADC的模拟通道3(AIN3)。另外三个运算放大器可与外部电阻一起组成恒流源和放大电路。 LCD驱动:MXT8051F04A部集成段式LCD驱动,LCD 驱动由主要偏压产生电路、COM驱动器、SEG驱动器几部分组成。COM1-COM4为位选,SEGMENT0-SEGMENT36为段选。数模转换器 (DAC):MXT8051F04A片的数模转换器(DAC)采用电阻串分压结构,主要由8-256译码器、模拟开关、电阻串和输出缓冲器等几部分组成。电阻串将参考电源分成256等份,输入数据经译码器译码后,控制模拟开关选择合适的电压经输出缓冲器输出。2.3.2 晶振复位电路单片
19、机最小系统包括:晶振电路、复位电路。复位采用了简单可靠的上电复位电路。电路如图2-5所示:图2-5 晶振复位电路2.4 SD卡电路设计应用单片机读写SD卡有两点需要注意。首先,需要寻找一个单片机与SD卡通讯的解决方案;其次,SD卡所能接受的逻辑电平为3.3V,如果是5V单片机则需要解决电平匹配问题。2.4.1 通讯模式SD卡有两个可选的通讯协议:SD模式和SPI模式。SD模式是SD卡标准的读写方式,但是在选用SD模式时,往往需要选择带有SD卡控制器接口的MCU,或者必须加入额外的SD卡控制单元以支持SD卡的读写。然而MXT8051F04A单片机没有集成SD卡控制器接口,若选用SD模式通讯增加了
20、产品的硬件成本。在SD卡数据读写时间要求不是很严格的情况下,选用SPI模式可以说是一种最佳的解决方案。因为在SPI模式下,通过四条线就可以完成所有的数据交换,并且目前市场上很多MCU都集成有现成的SPI接口电路,采用SPI模式对SD卡进行读写操作可大大简化硬件电路的设计。虽然MXT8051F04A不带SD卡硬件控制器,也没有现成的SPI接口模块,但是可以用软件模拟出SPI总线时序。本文用SPI总线模式读写SD卡。2.4.2 电平匹配SD卡的逻辑电平相当于3.3V TTL电平标准,而控制芯片的逻辑电平为5V电平标准。因此,它们之间不能直接相连,否则会有烧毁SD卡的可能。出于安全的考虑,有必要解决
21、电平匹配问题。要解决这一问题,最根本的就是解决逻辑器件接口的电平兼容问题,原则主要有两条:一为输出电平器件输出高电平的最小电压值,应该大于接收电平器件识别为高电平的最低电压值;另一条为输出电平器件输出低电平的最大电压值,应该小于接收电平器件识别为低电平的最高电压值。一般来说,通用的电平转换方案是采用类似SN74ALVC4245的专用电平转换芯片,这类芯片不仅可以用作升压和降压,而且允许两边电源不同步。但是,这个方案代价相对昂贵,而且一般的专用电平转换芯片都是同时转换8路、16路或者更多路数的电平,相对本系统仅仅需要转换3路来说是一种资源的浪费。考虑到SD卡在SPI协议的工作模式下,通讯都是单向
22、的,于是在单片机向SD卡传输数据时采用晶体管加上拉电阻法的方案,基本电路如图2-6所示。而在SD卡向单片机传输数据时可以直接连接,因为它们之间的电平刚好满足上述的电平兼容原则,既经济又实用。这个方案需要双电源供电(一个5V电源、一个3.3V电源供电),3.3V电源直接用AMS1117三端线性稳压器从5V电源稳压获取。图2-6 SD卡电平转换2.4.3 硬件接口设计SD卡提供9Pin的引脚接口便于外围电路对其进行操作,9Pin的引脚随工作模式的不同有所差异。在SPI模式下,引脚1(DAT3)作为SPI片选线CS用,引脚2(CMD)用作SPI总线的数据输出线MOSI,而引脚7(DAT0)为数据输入
23、线MISO,引脚5用作时钟线(CLK)。除电源和地,保留引脚可悬空,详细的引脚定义见表2-1。引脚排列如图2-7。图2-7 SD卡引脚定义表2-1 SD卡引脚功能定义引脚SD模式 SPI模式名称类型描述名称类型描述1CD/DAT3IO或PP数据线3CSI片选2CMDPP命令DII数据输入3VSS1S电源地VSSS电源地4VDDS电源VDDS电源5CLKI时钟SCLKI时钟6VSS2S电源地VSS2S电源地7DAT0IO或PP数据线0DOO或PP数据输出8DAT1IO或PP数据线1RSV 保留9DAT2IO或PP数据线2RSV 保留单片机与SD卡的接口电如图2-8所示。图2-8 单片机与SD卡接
24、口电2.5 串口电路设计本系统设计串口电路主要用于通过串口调试助手调试程序和主机显示读写过程以与结果。单片机与PC机之间采用RS232方式的串行通信。RS232是美国电子工业协会EIA和Bell公司一起开发的于1969年颁布的通信协议。它适合传输速率在0-20KB/S围的通信,现已成为微机串行通信接口中广泛应用的一种标准。RS232规定,当数据传输速度小于0-20KB/S且电缆的电容负荷小于2500pF时,传输距离小于15m。本系统采用RS232异步通信方式。为增加信号在线路上的传输距离和提高抗干扰能力,RS232提高了信号的传输电平。该接口采用双极性信号,公共地线和负逻辑。对于发送端:-5V
25、15V表示逻辑1,+5V+15V表示逻辑O。对于接收端:电压低于-3V表示1,高于+3V表示O。它与单片机的逻辑电平不一致,因此在实际应用时,必须把TTL电平转换为RS232或者对两者进行逆转换。为方便设计,提高系统稳定性,保护器件,根据产品资料,选用MAXIM公司生产的MAX232CPE芯片。MAX232CPE部有2个线路驱动器(Tx)和2个接收器(Rx)。部具有两个充电泵,把+3.3VDC转换成士10vDC。具有+15KVESD保护,RS232收发器体积小,应用方便,外围电路简单。串行接口电路如图2-9所示。图2-9 串口电路2.6 PCB绘制PCB设计是硬件工作中的难点,前面所有工作都集
26、中体现在电路板上,因而PCB的设计直接影响整个系统的性能。在PCB布线之前先对原理图进行了电气规则检查,在检查正确无误的情况下开始布线,布线采用手工布线完成,其中元器件的封装参考了标准封装库,对于一些Protel中没有自带封装的元器件按照数据手册上的规进行制作,并对二极管、三极管等极性元件,以与一些非对称性元件的引脚定义做了仔细的检查。在布局上将模拟电路和数字电路分开,整体上采用模块化布局,去藕电容放置在靠近器件的电源/地的地方,并将跳线放置在板子的边缘。为了系统能够稳定的运行,电路板子采用双层设计,上层为元件层,为了过滤高频干扰,我们在5V电源与地之间与3.3V电源与地之间分别加入了采用0.
27、luF的滤波电容,以滤除高频干扰。不同层采用相互垂直走线的方式以避免串扰。布线时应注意以下规则:(1)各部件之间引线尽量短。(2)发热量大的元件不能放在底层,底层不方便放置散热片。(3)晶振,电解电容等怕热元件应该远离发热量大的元件,晶振用地线包围。(4)接插件应该放在板子边缘。(5)开关,滑动电阻器等手工调整元件应该放在合适手工调整的地方,尽量放 在板子边缘,可调旋钮应朝外。(6)每个IC都应该放置0.1uF和10uF旁路电容,滤除高频杂波和电源去耦。2.7 本章小结本章属于系统的硬件电路设计部分,其中简要的介绍了系统的组成,参考了相关的技术文档,其中包括MXT8051F04A芯片的Data
28、Sheet,以与MAX232的DataSheet和SD官方资料,根据系统的需要并结合他人的开发经验设计了每部分的电路,文中给出了各部分的主要信号电路连接图,详细的电路原理图可在附录A中得到,这一章将作为后续的基础,可靠的硬件平台是本系统得以有效运行最有力的保障。第3章 单片机读写SD卡的软件设计软件设计主要包括二部分: 对SD扇区读写, 单片机跟上位机(HOST)依据RS232传输协议的通信程序设计。3.1 SD卡的扇区读写SD卡扇区读写主要包含:单片机普通I/O口模拟SPI协议,SD卡初始化,SD卡扇区数据的读写。3.1.1 模拟SPI协议SD卡的SPI通信接口使其可以通过SPI通道进行数据
29、读写。从应用的角度来看,采用SPI接口的好处在于,很多单片机部自带SPI控制器,不光给开发上带来方便,同时也见降低了开发成本。对于不带SPI串行总线接口的MXT8051F04A单片机,需要用软件来模拟SPI总线操作。软件模拟SPI协议读写字节如图3-1和3-2。图3-1 读取一个字节图3-2 发送一个字节3.1.2 SD卡命令SD卡自身具有完备的命令系统,以实现各项操作。SD卡命令共分为12类,分别为Class0-Class12。不同的SD卡支持的指令集不尽一样,SP1模式下支持的命令和SD总线模式下支持的命令也不一致。SD卡所有的命令都由6个字节组成,发送的时候首先发送最高位。其命令格式如表
30、3-1。表3-1SD卡命令的格式Byte1Byte2-Byte5Byte6765 0 31 07 001命令号命令参数CRC校验码1Byte1:命令的开始位为始终为0;1表明是主机发送给SD卡的命令,后面是命令号(命令号,由指令标志定义,如CMD39为100111即十六进制为0x27,那么完整的CMD39第一字节为01100111,即0x27+0x40)。Byte2-5:命令参数,有些命令没有参数。例如CMD0命令参数就为0。CMD24为写单块命令就有命令参数,命令参数就是要写扇区的地址。Byte6:前7位为CRC校验位,最后一位为停止位0。命令传输过程采用发送应答机制过程如图3-3所示。图3
31、-3 命令应答表3-2列取了SPI模式下常用的命令。表3-2SPI模式下常用命令命令号功能CMD0复位SD卡CMD1读OCR寄存器CMD9读CSD寄存器CMD10读CID寄存器CMD12停止读多块时的数据传输CMD16设置块的长度CMD17写单块CMD18读多块,直到主机发送CMD12为止CMD24写单块CMD25写多块CMD32设置擦出块的起始地址CMD33设置擦出块的终止地址CMD38擦出所选的块CMD55状态每一个命令都有自己命令应答格式。在SPI模式中定义了三种应答格式,如表3-3、表3-4、表3-5所示。表3-3 二字节应答模式字节位含义17开始位,始终为06参数错误5地址错误4擦除
32、序列错误3CRC错误2非法命令1擦除复位0闲置状态27溢出,CSD覆盖6擦除参数5写保护非法4卡ECC失败3卡控制器错误2未知错误1写保护擦除跳过,锁解锁失败0锁卡表3-5 六字节应答模式字节位含义17开始位,始终为06参数错误5地址错误4擦除序列错误3CRC错误2非法命令1擦除复位0闲置状态25全部操作条件寄存器,高位在前表3-3 一字节应答模式字节位含义17开始位,始终为06参数错误5地址错误4擦除序列错误3CRC错误2非法命令1擦除复位0闲置状态3.1.3 SD卡的初始化SD卡的初始化是非常重要的,只有进行了正确的初始化,才能进行扇区读写等操作。根据SD卡的手册说明,在初始化过程中,SP
33、I的时钟不能太快,否则会造初始化失败。在初始化成功后,应尽量提高SPI的速率。在刚开始要先发送至少74个时钟信号,这是必须的,因为在上电初期,电压的上升过程据SD卡组织的计算约合64个CLK周期才能到达SD卡的正常工作电压,其后的10个CLK是为了与SD卡同步,如果疏忽了这一点,可能使初始化不成功。随后就是写入命令CMD0,为了实现兼容性,发送CMD0后,再发送CMD55和ACMD41(使用ACMD类的指令前应先发CMD55,CMD55起到一个切换到ACMD类命令的作用)确认是否有回应,如果有回应则为SD卡,如果等回应超时,则可能是MMC卡,再发CMD1确认。完成上面操作后SD卡进入SPI模式
34、。主机还可以继续通过CMD10读取SD卡的CID寄存器,通过CMD16设置数据Block长度,通过CMD9读取卡的CSD寄存器。从CSD寄存器中,主机可获知卡容量,支持的命令集等重要参数。SD卡初始化的C语言程序见附录。其流程图如图3-4所示。图3-4 SD卡初始化3.1.4 数据块的读写完成SD卡的初始化之后即可进行它的读写操作。SD卡的读写操作都是通过发送SD卡命令完成的。SPI总线模式支持单块(CMD24)和多块(CMD25)写操作,多块操作是指从指定位置开始写下去,直到SD卡收到一个停止命令CMD12才停止。单块写操作的数据块长度只能是512 字节。单块写入时,命令为CMD24,当应答
35、为0时说明可以写入数据,大小为512 字节。SD卡对每个发送给自己的数据块都通过一个应答命令确认,它为1个字节长,当低5位为00101 时,表明数据块被正确写入SD 卡。写SD卡程序流程图如图3-5。具体C程序实现如下:unsigned char SD_WriteSector(unsigned char *buffer, unsigned long address)unsigned int count = 0;unsigned char response = 0xff; unsigned int timeout = 0; /写命令超时address = 9; /address=address*
36、512将块地址转为字节地址 SD_Enable(); doresponse = SD_WriteCommand(0x18, address, 0xff);/发送读数据命令timeout+;while(0x0 != response) & (timeout TRY_TIME); if(0x0 = response) SD_WriteByte(0xff);SD_WriteByte(0xff);/command was a success - now send data SD_WriteByte(0xfe); /写入开始字节 0xfe for(count = 0; count 512; count+
37、)/将缓冲区中的512个字节写入SD卡 SD_WriteByte(*buffer+); SD_WriteByte(0xff); SD_WriteByte(0xff); /两个字节的CRC校验码,不用关心 response = SD_ReadByte();/读数据响应response = response & 0x1f;if(0x05 != response)SD_Disable();/如果返回值是XXX00101说明数据已经被SD卡接受Uart_Send_String(写扇区失败rn);return SD_WRITE_ERROR;/*等到SD卡不忙数据被接受以后,SD卡要将这些数据写入到自身的
38、FLASH中,需要一个时间忙时,读回来的值为0x00,不忙时,为0xff*/ while(0 = SD_ReadByte(); /等到SD卡不忙 SD_Disable(); SD_WriteByte(0xff);/按照SD卡的操作时序在这里补8个时钟return SD_SUCCESS; /写扇区操作成功return SD_WRITE_ERROR;/写扇区操作失败图3-5 写扇区在需要读取SD卡中数据的时候,先发送读SD卡的命令字CMD17,接收正确的第一个响应命令字节为0xFE,随后是512个字节的用户数据块,最后为2个字节的CRC 验证码。可见,读写SD卡的操作都是在初始化后基于SD卡命令和
39、响应完成操作的,读SD卡的程序流程图如图3-6。具体C程序实现如下:/* 函数: SD_ReadSector.* 描述: 写扇区.* 输入: buffer:存放读出数据的缓冲* 输出: address:要读取数据的地址.* 返回: 如果操作成功返回SD_SUCCESS.失败返回SD_READ_ERROR*/unsigned char SD_ReadSector(unsigned char *buffer, unsigned long address)unsigned int count = 0; unsigned char response = 0xff;unsigned int timeou
40、t = 0; /写命令超时address = 9; /address=address*512将块地址转为字节地址 SD_Enable(); doresponse = SD_WriteCommand(0x11,address,0xff);/写入CMD17timeout+;while(0x0 != response) & (timeout TRY_TIME); if(response = = 0) while(SD_ReadByte()!=0xfe);/start with DATA TOKEN = 0xFESD_ReadByte();for(count = 0; count 512; count
41、+) *buffer+ = SD_ReadByte(); SD_ReadByte();/读校验和 SD_ReadByte(); SD_Disable(); SD_WriteByte(0xff);/按照SD卡的操作时序在这里补8个时钟 return SD_SUCCESS; /读扇区操作成功 Uart_Send_String(读扇区失败rn);return SD_READ_ERROR; /读扇区操作失败图3-6 读扇区3.2 串口程序串口程序主要是串口初始化程序和串口发送接收程序。串口初始化程序主要完成串口的中断设置,波特率设置,接收使能等。流程图如图3-7。图3-7 串口初始化串口的发送接收程序
42、比较简单,串口发送程序只需把要发送的数据赋给串口数据缓冲寄存器,当数据发送完成后,发送中断标志有硬件置1,申请中断,CPU响应后发送下一帧数据,该中断发送标志位必须有软件清0。串口接收程序和发送程序相似,在接收到第8位数据时,硬件置位接收中断标志位,进入中断服务程序,在中断服务程序中把数据缓冲寄存器的值赋给存放接收数据的临时存。该中断接收标志位也必须有软件清0。第4章 调试系统调试由三部分组成:硬件调试、软件调试、软硬件的联合调试。4.1 系统硬件调试在板子拿到手后,我们完成电路的焊接工作,在电路的焊接过程中,我们应该一个一个模块的焊接,焊接完一个模块,检查一个模块。首先焊接电源相关的部分,把
43、电源部分焊接完后,检查下是否存在虚焊、漏焊等情况。如果确认无误后加上直流电源,查看电源的电流情况,如果电流过大可能存在短路的情况,应立即关闭电源检查线路。如果正常,则用万用表检查各个输入输出点的电压是否正确。首先,测试9V电压是否加到ASMlll7-5.0的输入端上,测试中发现已经正确加在了ASMlll7-5.0上,之后检测ASMlll7-5.0输出引脚是否为5V左右,然后测试5V电压是否加到ASMlll7-3.3的输入端上,测试中发现已经正确加在了ASMlll7-3.3上,之后检测ASMlll7-3.3输出引脚是否为3.3V左右,如果结果都正确,则表明电源模块部分正确。在确认电源模块没有问题
44、的情况下焊接主要芯片,如MXT8051F04A、MAX232等。焊接完这些芯片后,测量各个芯片的供电电压是否正确。虽然电压加上了,但是不知道单片机是否真的工作起来了,于是用示波器观察MTX8051晶振的输出波形是否是11.0592M的正弦波。如果观察到了,说明单片机正常工作。主芯片正常工作后,下面就是测试串口是否正常工作。下载先前编写好的串口发送接收程序,通过烧程器把程序下载到单片机里运行,打开串口调试助手,观察串口调试助手是否接收到了发送的字符。如果接收到了,表明串口电路正常工作。如果不正常工作,首先检查硬件原理图是否正确,TXD和RXD是否接反,波特率是否设置正确,串口调试助手的打开的端口
45、是否和实际端口不一致。通过上面的调试,硬件电路正常工作,硬件调试工作完成。4.2 软件调试在硬件还没有准备好的情况下,在Keil下进行了软件的单步跟踪。通过在keil下单步跟踪调试发现一个问题:在SD卡的发送命令函数中,定义了一个无符号型变量,初始值赋值3对其进行自减操作,判断是否大于等于0,如果为假则循环结束。结果导致程序进入死循环,运行不正常。后来跟踪到这里才发现变量为无符号变量,而我却用来进行自减,当变量自减到0时,因为是无符号变量,所以再自减就变为了128,所以进入了死循环,把变量改为符号型变量,问题解决。4.3 软硬件的联合调试硬件制作好后,就开始软硬件的联合调试。其中遇到的问题主要有以下几个:1. 程序里向串口发送中文字符,结果串口调试助手显示为乱码。首先检查程序的波特率是否和串口调试助手的波特率是否一致,检