毕业设计(论文)基于单片机MP3播放系统设计.doc
本科毕业论文(设计)论文(设计)题目:MP3播放系统2011 年 5 月 15 日目 录摘要IIIABSTRACTIV前言1第一章 系统描述21.1 综述21.2 系统框图21.3 功能实现2第二章 系统的硬件设计和方案对比选择32.1 系统设计结构图32.2系统设计方案对比选择32.2.1 MCU微处理控制器的方案对比选择32.2.2 存储设备模块对比选择42.2.2 音频解码器的对比选择4第三章 系统的硬件设计电路及元件说明53.1 MCU微控制器电路53.1.1 STC12C5A60S2基本特性63.1.2 STC12C5A60S2增强特性73.2 SD卡模块83.2.1 SD卡结构与接口定义93.2.2 SD卡读写模块原理电路图103.3 VS1003音频解码器模块123.3.1 VS1003基本特性123.3.2 VS1003结构框图123.3.3 VS1003电路原理图143.4 按键控制143.5 复位电路153.6 晶振电路16第四章 系统的软件设计174.1 程序设计框架174.2 znFAT文件系统模块介绍174.2.1 文件系统174.2.2 FAT32文件系统174.2.3 znFAT文件系统194.3 SD卡驱动程序设计224.3.1 SPI通信协议概述224.3.2 SD卡驱动234.4 VS1003音频解码器模块304.5 主程序设计32第五章 系统的制作、焊接与调试335.1 系统的制作335.2 系统的焊接335.3 系统的调试33设计总结35参考文献36致谢37附录38附录一 系统的主程序清单31附录二 基于单片机MP3播放系统设计的原理图36附录三 基于单片机MP3播放系统的PCB图37附录四 基于单片机MP3播放系统设计的元器件清38附录五 基于单片机MP3播放系统设计的实物图39基于单片机播放系统设计摘要根据STC12C5A60S2单片机的特点和芬兰VLSI公司出品的VS1003音频解码芯片,本文提出了一种用单片机实现简易mp3播放器的方法,同时给出了软硬件设计的方法,设计过程中包括硬件电路设计和软件程序编写两个方面。在硬件方面主要有VS1003音频解码器以及mp3播放器的按键,在软件方面主要有VS1003的驱动,SD卡工作在SPI模式下的读写驱动,FAT32文件系统的移植,以及通过识别键值来控制SD的扇区读写。整个设计过程包括电子系统的设计技术及调试技术,包括需求分析,原理图的绘制,PCB板的绘制,制板,器件采购,安装,焊接,硬件调试,软件模块程序的编写,模块测试,系统整体测试等整个开发调试过程。关键词:单片机播放系统,STC12C5A60S2, VS1003, FAT32,。Based on MCU mp3 system designAbstractAccording to the characteristics of STC12C5A60S2 microcontroller and Finland DFM product of our company VS1003 audio decoding chips, this paper puts forward a method using microcontroller is simple mp3 player method is given, and the hardware and software design method, design process including hardware circuit design and software programming two aspects. In hardware mainly has VS1003 audio codec and mp3 player key, in software basically has VS1003 driver, SD card work in SPI mode of reading and writing, FAT32 drive file system transplantation, and by identifying key value to control the SD sectors, reading, speaking and writing.The whole design process including electrical system design technology and debug technology, including the requirement analysis, the principle drawing and PCB rendering, plate making, installation, the device procurement, welding, hardware debugging, software module program compiling, and module testing and system overall test etc all development debugging process.Keywords: STC12C5A60S2, VS1003, FAT32, keyboard.前言随着科技的日益发展,电子产品也不仅仅是在工业控制中流行,已经布满了我们整个生活中。人们已经不再是追求温饱生活的简单目标,而是在这基础上追求更好的娱乐精神享受。VS10XX系列在国家mp3业余爱好者中影响颇大,Apple的iPod在的前身就是使用的是VS10XX系列芯片,为了成为一个mp3爱好者,本文也设计了一个简易的mp3方案,同时给出了软硬件设计的方法。本设计的论文包括硬件电路设计和软件程序设计两个方面,其中前者主要在第三章中重点叙述,后者在第四章中叙述。在本设计论文的结尾,分别附有与本设计相关的资料,包括设计系统主程序,系统原理图,系统PCB图,系统元件清单,系统实物图及系统使用说明。第一章 系统描述1.1 综述本系统是基于STC12C5A60S2单片机所设计的MP3播放器,音频文件存储在SD卡上,通过文件系统的读SD扇区,由STC12C5A60S2单片机读取数据并送到VS1003音频解码器模块解码并输出,同时还可以通过按键来选择SD卡存储的歌曲的顺序,以及暂停播放歌曲和音频解码器模块的音量大小。整个系统分为四个模块:MCU最小系统板、键盘、VS1003音频解码、SD卡模块。MCU是STC12C5A60S2单片机的最小系统板,上面有芯片需要工作的最基本的资源:时钟控制电路、复位电路与外围电路相连的接口。1.2 系统框图图1.1 系统总框图1.3 功能实现SD卡读写FAT32文件系统MP3文件播放键盘控制歌曲顺序第二章 系统的硬件设计及方案对比选择2.1 系统设计结构图图2.1 系统设计结构图2.2 系统设计方案对比选择根据设计要求,结合实际情况和设计成本要求,对系统主要部分的电路方案叙述如下。2.2.1 MCU微控制器方案对比选择方案一:MCU微处理控制器的种类很多,有ATMEL公司生产的AT89SXX系列单片机,其中有8位的单片机,也有16位的单片机。AT89S52为8位的单片机,它是一种低损耗、高性能的CMOS微处理器,片内有8K字节的存储空间,128字节RAM、4个8位并口、1个全双工串行口、2个16位定时/计数器,寻址范围64K。并且可以在线进行重复编程、快速擦除、快速写入程序,能重复擦除 / 写入1000次左右,数据保存时间为十年。方案二:也是ATMEL公司生产的AVR单片机,它也有很多特点,比如:体积小 、集成度高、可靠性好、易于扩展、高速度、低功耗;功能强、是一款RISC精简指令集高速8位单片机。但是其市场价格较高,且已经在MCU市场夹缝中生存,且现在以有停产的趋势。方案三:是宏晶科技公司生产的STC12C5A60S2单片机,它是一款增强型单片机。是一款高性能的微处理器,片内有60K字节的存储空间、1280字节SRAM、2个16位定时/计数器,兼容普通51单片机,没有定时器2,但有独立波特率发生器做串行通讯的波特率发生器,工作频率是普通51单片机的10倍左右。综上所述,在本设计中,考虑到程序生成的HEX文件较大,并且需要较快的执行速度,选择宏晶科技公司生产的STC12C5A60S2单片机为微处理控制器。2.2.2 存储设备模块的对比选择 方案一:CF卡是目前市场上历史悠久的存储卡之一,存储容量大,成本低,兼容性好,这些都是CF卡的优点,缺点则是体积比较大。方案二:Infineon和SanDisk公司共同推出的一种全新的小巧的存储卡产品MMC卡,但是它适用于对尺寸和电池续航能力要求很高的手机以及其他手持便携设备。方案三:SD卡(Secure Digital Memory Card)中文翻译为安全数码卡,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛的用于便携式装置上,例如数码相机、个人数码助理(PDA)和多媒体播放器等。SD卡大小犹如一张邮票,重量只有2克,但是确有高记忆容量、快速数据传输、极大的移动灵活性以及很好的安全性。综上所述,在本设计中,考虑到SD卡比较常用,而且有较成熟的读取方法,所以选择SD卡作为本系统的存储设备。2.2.3 音频解码器的对比选择 根据以前使用音频解码器的经验,选用芬兰的VLSI公司的VS10xx系列的芯片性价比最高,而且也有很成熟的驱动方案。通过查阅VS10xx系列的芯片手册,选择VS1003音频解码器。VS1003是一个单片MP3/WMA/MIDI音频解码器和ADPCM编码器,它包含一个高性能,自主产权的低功耗DSP处理核VS_DSP,工作数据存储器,为用户应用提供5KB的指令RAM和0.5KB的数据RAM。串行的控制和数据接口,4个常规用途的I/O口,一个UART,也有一个高品质可变采样率的ADC和立体声DAC,还有一个耳机放大器和地线缓冲器。所以VS1003很符合本设计的基本需求功能。 第三章 系统的硬件设计电路及元件说明本章根据系统设计结构图来对每个部分的电路进行分析和说明,重点讲述MCU微控制器STC12C5A60S2、SD卡模块电路、VS1003音频解码器模块电路、键盘。该系统中STC12C5A60S2是核心器件,系统的设计原理图如附录二所示。3.1 MCU微控制器图3.1 STC12C5A60S2的塑封图STC12C5A60S2的塑封图如图3.1所示,它为DIP40双列直插塑料封STC12C5A60S2作为系统的核心控制元件,只有它能正常工作后才能使其它的元件进入正常工作状态。因此,下面对STC12C5A60S2进行必要的说明,STC12C5A60S2的管脚如图3.2所示。 图3.2 STC12C5A60S2的管脚图3.1.1 STC12C5A60S2基本特性1)VCC:40脚,供电电压,一般接+5V电压。2)GND:20脚,接工作地。3)P0口:18脚,P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻辑电平。对P0端口写“1”时,引脚用作高阻抗输入。当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在这种模式下,P0具有内部上拉电阻。 在 flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部加上拉电阻,一般上啦电阻选4.7K10K为宜。本设计中用5.1K的排阻对P0口进行上拉电平。4)P1口:3239脚,P1口是一个内部具有上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4个TTL门电流。P1端口写入“1”后,被内部上拉电阻把端口拉高,此时可以作为作输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。5)P2口:2027脚,P2 口是一个具有内部上拉电阻的8 位双向I/O 口,P2 输出缓冲器能驱动4 个TTL 逻辑电平。对P2 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX DPTR)时,P2 口送出高八位地址。在使用8位地址(如MOVX RI)访问外部数据存储器时,P2口输出P2锁存器的内容。在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。6)P3口:1017脚,P3 口是一个具有内部上拉电阻的8 位双向I/O 口,P3 输出缓冲器能驱动4 个TTL 逻辑电平。7)RESET:9脚,复位输入端。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。8)ALE/P(_):30脚,当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。9)PSEN:29脚,外部程序存储器的选通信号。10)EA()/VP:31脚,访问外部程序存储器控制信号。当为低电平时,则读取外部程序存储器;当端为高电平时,则读取内部程序存储器。11)XTAL1:19脚,振荡器反相放大器和内部时钟发生电路的输入端。如采用外部时钟源时,XTAL1为输入端。12)XTAL2:18脚,振荡器反相放大器的输出端。如采用外部时钟源时,XTAL2应悬空不接。3.1.2 STC12C5A60S2的增强特性1) 增强型8051,1T,单时钟/机器周期,指令代码完全兼容传统8051。2) 工作频率范围:0-35MHZ,相当于普通8051的0-420MHZ。3) 用户应用程序空间8K/16K/20K/32K/40K/48K/52K/60K/62K字节4) 片上集成1280字节RAM。5) ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器可通过串口(P3.0/P3.1)直接下载用户程序,数秒即可完成一片。6) 有EEPROM功能。7) 内部集成MAX810专用复位电路(外部晶体12M以下时,复位脚可直接1K电阻到地)。8) 16位定时器T0/T1,没有定时器2但有独立波特率发生器做串行通讯的波特率发生器。再加上两个PCA模块可再实现2个16定时器。9) A/D转换,10位精度ADC,共8路,转换速度可达250K/S。10)新增支持上升沿中断的PCA模块。3.2 SD卡模块SD卡中文翻译为安全数码卡,SD卡的技术是在MultiMedia卡(MMC)基础上发展而来的。目前市场上SD卡的品牌有很多,诸如:SanDisk,Kingmax,松下和Kingston。SD卡最大的特点就是通过加密功能,可以保证数据资料的安全保密。图3.3 SD卡实物图3.2.1 SD卡结构与接口定义图3.4 SD卡结构图图3.5 SD接口与定义图3.6 SD卡的引脚定义SD卡的驱动有两种模式,SD模式与SPI模式。我们在用单片机对SD卡进行驱动的时候,通常使用SPI模式,一方面是因为SPI模式接口与操作方法比较简单,易于实现;另一方面是因为本设计操作的数据量并不是很大,速度并不需要很快。SD模式用于数据量比较大,速度要求比较快的应用场合。SD模式操作起来比较复杂。SD卡工作在SPI模式时,只需要4跟信号线,即CS片选、DIN数据输入、CLK时钟、DOUT数据输出。而且SD卡的工作电压在3.3V。3.2.2 SD卡读写模块原理电路图图3.7 SD卡读写模块电路图3.8 单片机3.3V分压电路 因为SD卡的工作电压需要3.3V,而我们本设计电路主要采用5V供电,所以需要采用5V分压,选取3.3K和1.8K电阻串联分压提供3.3V电压。3.3 VS1003音频解码器模块VS1003是芬兰的VLSI公司VSXX系列的芯片,是一个单片MP3/WMA/MIDI音频解码器和ADPCM编码器。3.3.1 VS1003基本特性l 能解码MPEG1和MPEG2音频层III(CBR+VBR+ABR);WMA 4.0/4.1/7/8/9 5-384kbps所有流文件;WMV(PCM+IMA AD-PCM);产生MIDI/SP-MIDI文件l 对话筒输入或线路输入的音频信号进行IMA ADPCM编码l 支持MP3和WAV流l 高低音控制l 单时钟操作12.13MHZl 内部PLL锁相环时钟倍频器l 低功耗l 内含高性能片上立体声数模转换器,两声道间无相位差l 内含能驱动30欧负载的耳机驱动器l 模拟,数字,I/O单独供电l 为用户代码和数据准备的5,5KB片上RAMl 串行的控制,数据接口l 可被用作微处理器的从机l 特殊应用的SPI Flash引导l 供调试用途的UART接口3.3.2 VS1003结构框图图3.9 VS1003的结构框图主要功能管脚介绍:XRESET: 复位DREQ: 数据请求XDCS: 数据片选XCS: 命令片选SCLK: 串行时钟SI: 串行输入SO: 串行输出MICP: 同向差分话筒输入MICN: 同向差分话筒输出LEFT RIGHT: 左右声道LINEIN: 线入输入GBUF: 公共地缓冲器RCAP: 基准滤波电容 3.3.3 VS1003电路原理图图3.10 VS1003的电路原理图3.4 按键控制本设计采用按键来实现歌曲的播放功能,增加上一首、下一首、播放、停止、音量增、音量减等功能,以实现人机交互功能。如图3.11所示。图3.11 按键部分的电路图3.5 复位电路在STC12C5A60S2单片机中的振荡器运行时,RST()引脚上保持到少2个机器周期的高电平输入信号,复位过程即可完成。根据此原理,本设计采用上电复位和按键复位嵌套在系统中,增强了系统的实用性。本设计具体的复位电路如图3.12所示。图3.12 复位电路连接图3.6 晶振电路AT89S52在工作时需要外部提供时钟信号,因此,本设计选择在其18脚19脚之间接上22.1184MHz的晶振,为单片机提供机器振荡周期,并且方便使用串口助手调试模块电路的基本功能。其电路连接图如图3.13所示。在图中,电容器1C2,1C3起稳定振荡频率、快速起振的作用,其电容值一般在2050pF。图3.13 晶振电路连接图第四章 系统的软件设计4.1 程序设计框架4.2 znFAT系统模块介绍4.2.1 文件系统什么是文件系统?具体来说,文件系统为用户与存储设备的底层硬件交互抽象出来的一种操作接口,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的读取,给用户提供了一种机制,方便用户很简便的操作文件以及快速简洁的找到磁盘上的位置,而且不用理会底层实现的复杂机制。如果有了文件系统,我们就可以将数据组织为一个文件,给这些数据起一个名字(文件名),通过这个名字就可以访问这些数据。文件系统会根据文件名为我们找到数据在磁盘中的位置。4.2.2 FAT32文件系统图4.1 FAT32文件系统整体概述u MBR(master boot record)区计算机在按下power键以后,开始执行主板bios程序。进行完一系列检测和配置以后。开始按bios中设定的系统引导顺序引导系统。假定现在是硬盘。Bios执行完自己的程序后如何把执行权交给硬盘呢。交给硬盘后又执行存储在哪里的程序呢。其实,称为mbr的一段代码起着举足轻重的作用。MBR(master boot record),即主引导记录,有时也称主引导扇区。位于整个硬盘的0柱面0磁头1扇区(可以看作是硬盘的第一个扇区)。MBR不随操作系统的不同而不同,意即不同的操作系统可能会存在相同的MBR,即使不同,MBR也不会夹带操作系统的性质。具有公共引导的特性。u DBR (DOS BOOT RECORD)区DBR区(DOS BOOT RECORD)即操作系统引导记录区的意思,通常占用分区的第0扇区共512个字节(特殊情况也要占用其它保留扇区,我们先说第0扇)。在这512个字节中,其实又是由跳转指令,厂商标志和操作系统版本号,BPB(BIOS Parameter Block),扩展BPB,os引导程序,结束标志几部分组成。u FAT Allocation Table(文件分配表)它的作用是记录硬盘中有关文件如何被分散存储在不同扇区的信息。同FAT16相比,FAT32主要具有以下特点:(1) 同FAT16相比FAT32最大的优点是可以支持的磁盘大小达到2TB(2047GB),但是不能支持小于512MB的分区。基于FAT32的Win 2000可以支持分区最大为32GB;而基于 FAT16的Win 2000支持的分区最大为4GB。 (2) 由于采用了更小的簇,FAT32文件系统可以更有效率地保存信息。如两个分区大小都为2GB,一个分区采用了FAT16文件系统,另一个分区采用了FAT32文件系统。采用FAT16的分区的簇大小为32KB,而FAT32分区的簇只有4KB的大小。这样FAT32就比FAT16的存储效率要高很多,通常情况下可以提高15%。 (3) FAT32文件系统可以重新定位根目录和使用FAT的备份副本。另外FAT32分区的启动记录被包含在一个含有关键数据的结构中,减少了计算机系统崩溃的可能性。u 保留扇区FAT32中的保留扇区除了磁盘总第0扇区用作DBR,总第2扇区(win98系统)或总第0xC扇区(win2000,winxp)用作OS引导代码扩展部分外,其余扇区都不参与操作系统管理与磁盘数据管理,通常情况下是没作用的。操作系统之所以在FAT32中设置保留扇区,是为了对DBR作备份或留待以后升级时用。FAT32中,DBR偏移0x34占2字节的数据指明了DBR备份扇区所在,一般为0x06,即第6扇区。当FAT32分区DBR扇区被破坏导致分区无法访问时。可以用第6扇区的原备份替换第0扇区来找回数据。u 簇FAT32文件系统中簇是存取数据的最小单元!哪怕一个文件的数据量只有一个字节,它也会占用一个簇,而这个簇的空闲空间不能再被其他文件的数据占用!4.2.3 Znfat文件系统Znfat是由振南开创的用于单片机、ARM、DSP等微处理器的,与FAT32文件系统相兼容的,占用硬件资源极低的,应用和移植较为方便的,功能较为完备的嵌入式文件系统解决方案。图4.2 znFAT的功能图通过简单的移植,使znFAT与格式化为FAT32文件系统的SD卡底层驱动结合起来,抽象出图4.2中的功能函数,实现对SD卡的操作。图4.3是znFAT的接口函数:图4.3 znFAT接口函数简单介绍一下本系统采用的几个znFAT的接口函数:u 在使用znFAT其他函数之前,必须对存储设备进行初始化znFAT_Device_Init()。函数实现如下:void znFAT_Device_Init() SD_Reset(); SD_Init(); u 在对存储设备进行初始化之后,还需要调用znFAT_Init()对文件系统初始化,将很多参数信息装入到arg指向的结构体中,比如扇区大小、根目录的位置、FAT表大小等等。这些参数绝大部分是来自于DBR的BPB中,因此此函数主要在作对DBR的参数解析。函数实现如下:void znFAT_Init(void) struct znFAT_BPB *bpb;bpb=(struct znFAT_BPB *)(znFAT_Buffer); /将数据缓冲区指针转为struct znFAT_BPB 型指针pArg->DEV_No=Dev_No; /装入设备号pArg->BPB_Sector_No =znFAT_Find_DBR(); /znFAT_FindBPB()可以返回BPB所在的扇区号znFAT_ReadSector(pArg->BPB_Sector_No,znFAT_Buffer);pArg->FATsectors =LE2BE(bpb->BPB_FATSz32) ,4);/装入FAT表占用的扇区数到FATsectors中pArg->FirstDirClust =LE2BE(bpb->BPB_RootClus) ,4);/装入根目录簇号到FirstDirClust中pArg->BytesPerSector =LE2BE(bpb->BPB_BytesPerSec),2);/装入每扇区字节数到BytesPerSector中pArg->SectorsPerClust =LE2BE(bpb->BPB_SecPerClus) ,1);/装入每簇扇区数到SectorsPerClust 中 pArg->FirstFATSector =LE2BE(bpb->BPB_RsvdSecCnt) ,2)+pArg->BPB_Sector_No;/装入第一个FAT表扇区号到FirstFATSector 中 pArg->FirstDirSector =(pArg->FirstFATSector)+(bpb->BPB_NumFATs0)*(pArg->FATsectors); /装入第一个目录扇区到FirstDirSector中pArg->Total_Size =LE2BE(bpb->BPB_TotSec32),4)*pArg->BytesPerSector; /磁盘的总容量,单位是字节temp_last_cluster=Search_Last_Usable_Cluster();u 打开一个文件(支持文件名通配,如A*.txt或*.*),UINT8 znFAT_Open_File(struct FileInfoStruct *pfi,CONST INT8 *filepath,UINT32 item,UINT8 is_file)u UINT8 znFAT_ReadSector(UINT32 addr,UINT8 *buf) znFAT的存储设备底层驱动接口,读取存储设备的addr扇区的512个字节的数据放入buf数据缓冲区中。4.3 SD卡驱动程序设计 SD卡拥有SD和SPI两种工作模式,相对于SD模式,SPI(同步串行传输)模式可以简化主机设计,降低成本。并且大部分微处理器都有SPI模式,即使没有SPI模式的微处理器,也可以通过软件来模拟SPI。本设计因为微处理器没有SPI模式,所以也采用软件来模拟SPI与SD卡进行通信。如图4.4:图4.4 SD卡数据通信方式4.3.1 SPI通信协议概述SPI(Serial Peripheral Interface)的原意是串行外围设备接口。是MOTOROLA首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH ,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。SPI总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息。外围设置FLASH RAM、网络控制器、LCD显示驱动器、A/D转换器和MCU等。SPI总线系统可直接与各个厂家生产的多种标准外围器件直接接口,该接口一般使用4条线:串行时钟线(SCK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOSI和低电平有效的从机选择线SS(有的SPI接口芯片带有中断信号线 INT或INT、有的SPI接口芯片没有主机输出/从机输入数据线MOSI)。 SPI的通信原理也比较简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是SDI(数据输入),SDO(数据输出),SCK(时钟),CS(片选)。 对于不带SPI串行总线接口的STC12C5A60S2单片机来说,也可以采用I/O口来模拟SPI通信。如图4.5:图4.5 模拟SPI总线接口图P1.1模拟MCU的数据输出端(MOSI),P1.2模拟SPI的数据输入端(MISO),P1.0模拟SPI的SCK输出端,P0.7模拟SPI的从机选择端。对于下降沿输入、上升沿输出的各种外围串行外围接口芯片,只要改变P1.0的输出电平顺序就可以模拟出SPI的操作。4.3.2 SD卡的驱动图4.6 命令格式例如CMD0(命令0)的格式为:0x40(命令) 0x00 0x00 0x00 0x00(参数) 0x95(CRC)。SD卡的主要功能操作有u 复位操作图4.7 复位时序图74+clock:因为在SD卡上电初期,电压的上升过程根据SD卡组织的计算约合64个CLK周期才能到达SD卡的正常工作电压他们管这个叫做Supply ramp up time,其后的10个CLK是为了与SD卡同步,之后开始CMD0的操作,使复位命令成功响应。对应功能函数:unsigned char SD_Reset() unsigned char time,temp,i; unsigned char pcmd = 0x40,0x00,0x00,0x00,0x00,0x95; /命令0的字节序列is_init=1; /将is_init置为1SD_CS=1; /关闭片选 for(i=0;i<0x0f;i+) 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); return 0;/返回0,说明复位操作成功u 初始化操作图4.8 初始化时序图对应功能函数为: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; SD_CS=1; /关闭片选 SD_spi_write(0xff); return(0); /返回0,说明初始化操作成功u 写扇区图4.9 写扇区的时序对应功能函数为:unsigned char SD_Write_Sector(unsigned long addr,unsigned char *buffer)/向SD卡中的指定地址的扇区写入512个字节,使用CMD24(命令24) . unsigned char pcmd = 0x58,0x00,0x00,0x00,0x00,0xff; . 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(bufferi); 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);/忙时,读回来的值为0x00,不忙时,为0xffSD_CS=1; /关闭片选SD_spi_write(0xff); return(0); /返回0,说明写扇区操作成功u 读扇区图4.10 读扇区的时序对应的功能函数为:unsigned char SD_Read_Sector(unsigned long addr,unsigned char *buffer)/从SD卡的指定扇区中读出512个字节,使用CMD17(17号命令)