基于STM32的MP3播放器设计_第1页
基于STM32的MP3播放器设计_第2页
基于STM32的MP3播放器设计_第3页
基于STM32的MP3播放器设计_第4页
基于STM32的MP3播放器设计_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于STM32的MP3播放器设计基于STM32的MP3播放器设计摘要MP3播放器从原理上看是一个具有MP3播放功能的微型电脑。在MP3播放器小小的机身里,拥有MP3播放器存储器(存储卡)、MP3播放器显示器(大部分为LCD显示屏)、MP3播放器中央处理器[MCU(微控制器)或MP3播放器解码DSP(数字信号处理器)等。微处理器是播放器的“大脑”,用来接受用户选择的播放控制,并将当前播放的歌曲信息显示在液晶显示屏上,然后向数据信号处理芯片发出指令,音频信号将能够准确地被处理。我们可以通过数据传输线(USB)或WIFI局域网将MP3与PC进行连接,将自己喜欢的音频文件通过网络下载并导入到MP3中。总而言之,是这个信息化世界智慧的结晶。而本设计就是利用信盈达科技有限公司出产的STM32解码板和核心板上的VS1053芯片,通过在KEIL软件中对VS1053芯片进行C语言驱动代码的编写,来驱动一个具有简单功能的开发版MP3播放器。关键词:MP3播放器、SPI通信、代码编写、MP3playerdesignbasedonstm32AbstractInprinciple,MP3playerisamicrocomputerwithMP3playingfunction.InthesmallbodyofMP3player,thereareMP3playermemory(memorycard),MP3playerdisplay(mostlyinLCDdisplay),MP3playercentralprocessor(MCU)orMP3playerdecodingDSP(digitalsignalprocessor),etc.Themicroprocessoristhe"brain"oftheplayer,whichisusedtoaccepttheplaybackcontrolselectedbytheuser,displaythecurrentlyplayedsonginformationontheLCDscreen,andthensendinstructionstothedatasignalprocessingchip,andtheaudiosignalwillbeprocessedaccurately.WecanconnectMP3andPCthroughUSBorWiFiLAN,downloadandimportourfavoriteaudiofilesintoMP3throughthenetwork.Allinall,itisthecrystallizationofthewisdomoftheinformationworld.ThisdesignistouseSTM32decodingboardandvs1053chiponthecoreboardproducedbysinyindaTechnologyCo.,Ltd.todriveadevelopmentversionMP3playerwithsimplefunctionsbycompilingthedrivecodeofvs1053chip.Keywords:mp3player、SPIcommunication、codewriting目录1前言1.1本设计的目的、意义及应达到的技术要求 61.2本设计在国内外的发展概况及存在的问题 71.3本设计应解决的主要问题 72本设计 82.1设计原理 82.2方案选择 82.3分析问题 92.4设计过程 92.4.1VS1053解码器通信接口 92.4.2VS1053解码器通信协议 102.4.3VS1053关键寄存器 模式控制寄存器MODE 时钟频率加乘数寄存器CLOCKF 音量控制寄存器VOL 162.4.4解码器硬件复位 162.4.5解码器软件复位 172.4.6音频通道选择器初始化 172.5代码编写 182.5.1解码器底层接口函数实现 182.5.2解码器复位函数实现 硬件复位 软件复位 222.5.3配置寄存器 232.5.4音频通道选择器初始化 232.5.5利用VS1053播放一首歌曲 242.6硬件测试 253结论 26参考文献 27致谢 28附录 291前言随着时代的发展,在当今的时代背景下,低延迟为核心的5G网络、嵌入式系统、物联网、云计算等新崭技术已经成为了现今电子信息技术发展的主要角色,从产业发展的角度来说,这已经是一股无法逆转的浪潮。而嵌入式系统正是电子信息科技应用中最为核心的一部分,成为了新世纪最具生命力的技术之一。伴随着消费类电子产业的发展的逐步壮大,各种各样的嵌入式电子产品走进了人们的视野中,进入到生活的方方面面。电脑也从以前的老式大块头PC机变得五花八门,六角形游戏主机、轻薄本、游戏本等形态,各式各样的嵌入式系统在出现在社会的各个角落中,在这之中,ARM公司推出的芯片受到了许多用户的赞赏。ARM芯片由于其功耗低、性能高、体积小、成本低等诸多特点越来越广泛地受到了各企业的重点注意,成为了许多企业开发产品首要考虑采用的硬件芯片。本课题的制作的MP3也是基于ARM平台的STM32系列芯片。VS1053是VLSI公司VSXX系列里面性能最为出色的一款,支持MP3、WMA、WAV、MIDI、FLAC……音频格式,支持硬件FFT频谱,DAC音频输出驱动器可以直接驱动32欧姆阻抗的耳机。该芯片的DAC具备有立体声功能,解码效果达到HIFI级别;芯片还有一个最大的特点就是自动化处理数据,内部具有一个2048字节的数据FIFO,我们只需要把音频数据发送给它内部的FIFO就可以了,它内部会自动对音频数据进行处理,自动识别播放的码率,自动播放音乐,自动的产生音乐的频谱数据。2048字节的数据FIFO能缓存音频数据,这样一来CPU就有足够的时间去处理其它的事情了,不需要每时每刻都在传输音频数据给VS1053。本课题以VS1053B为目标芯片,以此研究如何实现MP3播放器。1.1本设计的目的、意义及应达到的技术要求目前智能手机所拥有的功能越来越多,MP3的功能也被整合到了手机中,但是音乐播放仅仅为手机的功能之一,而音乐播放却是MP3的主要职责。对于普通人来说,手机已经能很好地满足日常需求,而对于音乐发烧友或职业音乐人来说,MP3才是作为播放系统中前端的优选。而且手机的插孔所输出的电流不能满足部分高档耳机需要的工作电流,而MP3播放器则能让耳机以满功率输出音乐,达到最优播放效果这也是为何在智能手机日益发展的今天MP3音乐播放器仍像数码相机一样经久不衰的原因。在大多数MP3播放器所支持的音频格式中,MP3格式是最为常见的,它支持的歌曲为44.1KHz采样率,比特率范围一般是8-256Kbps。越高档的MP3支持的比特率范围自然越大,从各种角度上看MP3支持的范围自然是越广越好的。1.2本设计在国内外的发展概况及存在的问题世界上第一台MP3播放器是Saehan公司在1998年推出的MPManF10。虽然该设备发售后就像浪花一样消失在电子产品的浪潮中,不过MPManF10的出现启动了MP3市场,导致许多的电子厂商开始着手研发MP3设备。RioPMP300在1998年底被美国的帝盟公司推出,这是第一个给全世界的人们留下了深刻印象的MP3。随着MP3这一产品的迅猛发展,到了2004年,MP3播放器从内存、机身、音质上的发展无法再吸引更多人们的目光之时,MP3便开始了往多功能设备发展的趋势。正如十几年来在手机上所发生的事一样,人们对于MP3的要求越来越高,从单纯的进行音乐播放,到像手机一样既能打电话又能拍照、上网……,不过,消费类电子产品的一大发展趋势是一个产品融合多个功能,就像IPHONE第一代发布时乔布斯说的“AnIpod,Aphone,Aninternetcommunicate”。在中国首次推出彩色屏幕的MP3后,韩国iRiver趁势率先推出拥有拍摄功能的MP3。到了今日,MP3领域的领先地位依旧被韩国企业占据。MP3已经成为了便携播放设备类的一个主流产品,而且在手机之后也成为了最为广泛使用的个人随身电子产品。至于MP3格式的局限性,MP3格式的文件有一些限制是不能通过使用更好的编码器来绕过的,例如:最大位速是320kbps;相对于变化迅速的信号来说,时间的分辨率太低;对于超过15.5/15.8kHz的频率没有尺度因子带*1;Jointstereo*2是基于帧与帧完成的;没有定义编码器/解码器的整体时延,这就说明了gaplessplayback缺少一个正式的规定。虽然有以上限制,但是一个经过优秀调教MP3播放器也是能够地出色地完成编码任务的。1.3本设计应解决的主要问题在STM32上驱动一款芯片需要了解这款芯片的基础硬件结构,和在STM32上对应连接到的管脚等信息,并在KEIL软件上通过C语言编程的方式对芯片的驱动代码进行编写,令芯片能够按照开发者的要求进行运作。故目前的主要问题是如何在KEIL中进行VS1053B的芯片驱动代码编写,使VS1053B芯片能在STM32开发板上顺利运行。。2本设计2.1设计原理STM32解码板STM32解码板STM32核心板LCD显示屏VS1053VS1053解码器硬、软件复位VS1053关键寄存器SPI硬、软件复位VS1053关键寄存器SPI通信外接74HC4052模拟通道选择器件驱动代码编写驱动代码编写图2.0MP3项目结构图2.2方案选择在硬件的选择方面,经过数家MP3开发板套件的比较,我最终选用了信盈达公司的STM32-M3核心板和配套的解码板进行该项目,该开发板硬件已配套MP3系统的基础代码,用户需使用哪项功能,则仅需专门对该功能另外进行芯片驱动代码编写即可达到开发编程的目的。决定MP3播放器性能的是它的解码芯片,该芯片不仅决定了MP3进行音频文件处理的速度,也决定了MP3能够给用户带了什么特殊音效,包括左右混响、3D音效等特殊音效。而使用较差的MP3解码芯片所带来的后果不仅仅只是降低音质,而且还很可能无法支持高采样率的MP3音频文件。市面中最常见的MP3播放器芯片有:Atmel,VLSI,Sigmatel,Actions,Sunplus(凌阳),PHILIPS,MosArt(华矽),Telechip,ST,CRYSTAL等。芯片备选方案中包含WM8978和VS1053B这两款芯片,而1053可以编解码的(带adc、dac),8978只是音频ADC、DAC功放(编解码需要mcu完成),故本项目选用的芯片为VLSI公司的VS1053b芯片,这片解码芯片性能强劲,能够满足本次设计的所有需求。在驱动代码的方案选择上,编写STM32-M3的驱动代码毫无疑问应选择C语言来进行编写。C语言是一门面向过程的、抽象化的通用程序设计语言,并广泛应用于底层开发。C语言能够以简单的方式对低级处理器进行编译和处理。C语言是一种仅产生少量的机器语言并且不需要任何运行环境支持就能进行运行的高效率程序设计语言。虽然C语言提供了许多低级处理的功能,但它仍然保持了跨平台的特性,以一个标准规格编写出来的C语言程序可以在包括类似嵌入式处理器以及超级计算机等作业平台的许多计算机平台上进行编译。软件方面我选择的是美国KeilSoftware公司所出品的Keil软件来进行本项目的代码编写。该软件开发系统,是以51系列兼容单片机C语言为主的。Keil软件提供了完成代码编写所需要的C编译器、链接器、宏汇编、库管理以及一个功能强大的仿真调试器等在内的一套完整的开发方案。WIN98、NT、WIN2000、WINXP、WIN10等主流操作系统可以运行Keil软件。如果开发者需要进行C语言编程,Keil几乎就是开发者的首选,如果开发者不使用C语言而仅仅使用汇编语言来进行编程,Keil所具有的方便易用的集成环境、强大的软件仿真调试工具也会开发者户事半功倍。2.3分析问题要驱动在STM32上的VS1053B芯片,编写驱动代码时主要需要解决的问题是:选择VS1053解码器的哪个通信接口进行通信、编写VS1053解码器的通信协议代码、通过读芯片配套的原理图决定选择哪几个VS1053解码器的寄存器进行置位操作、编写软件复位代码、编写硬件复位代码。硬件连接方面则使用USB-AtoUSB-MINI-B型连接线、ST-LINK烧录器以及连接口转换插板配合来进行PC到项目硬件的连接和项目代码的烧录。2.4设计过程 以下对项目代码设计所必要的各项步骤进行思路分析。2.4.1VS1053解码器通信接口VS1053支持SPI和IIS两种通信接口,这里我们选择SPI作为VS1053和STM32的通信接口。通过查询开发板原理图得知:图2.1VS1053解码板管脚配置通过翻阅芯片说明书得知在SPI模式下需要用到的设置为:表2.1SPI引脚对应STM32引脚及模式设置VS1053引脚连接到STM32引脚STM32引脚的模式VS串行数据输出SOPA6上拉输入VS串行数据输入SIPA7复用推挽输出,时钟50MVS串行时钟SCLKPA5复用推挽输出,时钟50MVS命令操作片选XCSPF7通用推挽输出,时钟2MVS数据操作片选XDCSPF6通用推挽输出,时钟2MVS数据请求引脚DREQPC13下拉输入VS复位引脚XRESTPE6通用推挽输出,时钟2M有两个独立的输入/输出引脚,故工作方式选择全双工通过查阅芯片手册和原理图和参考本文中2.4.2进行的分析,可以了解到所需要进行的SPI配置为:1工作方式—全双工2数据长度—8位3数据发送顺序—高位先发4通信速度——9.2M5通信协议——选择模式0VS1053的2048字节FIFO是否可以接收数据是通过DREQ信号引脚来反馈的,如果该引脚是高电平,则说明VS1053b可以接受最少为32字节的SDI数据或者接收一条SCI命令,低电平则代表不能接收数据。2.4.2VS1053解码器通信协议VS1053解码器有两种通信协议,分别是:串行数据接口的串行协议(SDI)和串行命令接口的串行协议(SCI)。VS1053b串行协议支持两种模式,分别是VS1002本地模式和VS1001兼容模式。VLSI公司建议用户使用VS1002本地模式。串行数据接口的串行协议(SDI)在VS1002本地模式下(SM_NEWMODE是1),字节同步是由XDCS完成的,可以任意定义数据(SDATA信号)在时钟信号DCLK的上升沿或下降沿上,字节传送可以设置为MSb(高位)在前或LSb(低位)在前,这取决于SCI_MODE中内容的定义。需要我们编程时在SCI_MODE寄存器进行选择。主机发送音频数据给VS1053b必须要在数据请求线DREQ变为高电平的时候才可以,DREQ变为高电平代表VS1053b的数据FIFO至少可以接受32字节的音频数据。注意发数据之前需要把数据片选拉为低电平。串行命令接口的串行协议(SCI)串行命令接口SCI的串行总线协议包括:一个指令字节、一个地址字节(寄存器地址)和一个16位的数据字。指令字节决定的是访问的方向,地址字节决定是操作哪个寄存器。每次读取操作或写入操作均可以访问一个寄存器。由于那些数据位是在SCK的上升沿读取的,所以用户只能在SCK的下降沿上更新数据。每个字节的MSb(高位)总是被首先发送。在整个传送操作的期间,XCS必须要保持为低电平。SCI操作方向由指令字节来定义。查阅VS1053芯片手册可知:表2.2SCI串行协议操作指令表指令名称操作码操作READ0b00000011读取数据WRITE0b00000010写入数据则:SCI写操作指令:0X02SCI读操作指令:0X03图2.2串行数据接口串行协议图为了统一SPI的时序,我们选择数据位是在SCK的上升沿有效,每个字节的MSb先发。查阅STM32中文手册知:位1CPOL:时钟极性(Clockpolarity)

0:空闲状态时,SCK保持低电平

1:空闲状态时,SCK保持高电平

注意:正在通信时不应更改此位。

不适用于I2S模式和SPITI模式位0CPHA:时钟相位(Clockphase)

0:从第一个时钟边沿开始采样数据

1:从第二个时钟边沿开始采样数据

注意:正在通信时不应更改此位。

不适用于I2S模式和SPITI模式则时钟空闲为低电平,数据采样从第一个时钟边沿开始。(就是SPI4种模式里面的模式0)图2.3串行命令读协议图图2.4串行命令读协议图解释图2.5串行命令写协议图图2.6串行命令写协议图解释 由上图知指令数据长度为8位。图2.7串行SPI时序图 表2.3SPI时序图注释符号最小最大单位tXCSS5nstSU0nstH2CLKI周期tZ0nstWL2CLKI周期tWH2CLKI周期tV2(+25ns)CLKI周期tXCSH1CLKI周期tXCS2CLKI周期tDIS10ns表2.4芯片推荐工作值参数符号最小典型最大单位工作环境温度-30+85℃模拟和数字地AGNDDGND0.0V模拟电源供电电压,REF=1.23VAVDD2.52.83.6V模拟电源供电电压,REF=1.65V2AVDD3.33.33.6V数字电源供电电压CVDD1.71.81.85VI/O电源供电电压IOVDD1.82.83.6V输入时钟频率3XTALI1212.28813MHz内部时钟频率CLKI1236.86455.3MHz内部时钟倍数41.0×3.0×4.5×主时钟周期占空比405060%由上两个表可知tWL和tWH占4个CLKI周期,又因为STM32内部时钟频率晶振为36.864MHz,则通信速度为36.864/4=9.2M2.4.3VS1053关键寄存器模式控制寄存器MODE表2.5SCI_MODE寄存器配置表位元名称功能值说明0SM_DIFF差分0

1正常的同相音频

左通道反相1SM_LAYER12允许MPEGlayersI&II0

1不允许

允许2SM_RESET软件复位0

1不用复位

复位3SM_CANCEL取消当前的文件解码0

1不取消

取消4SM_EARSPEAKER_LOEarSpeaker低设定0

1关闭

激活5SM_TESTS允许SDI测试0

1不允许

允许6SM_STREAM流模式0

1不是

是7SM_EARSPEAKER_HIEarSpeaker高设定0

1关闭

激活8SM_DACTDCLK的有效边沿0

1上升沿

下降沿9SM_SDIORDSDI位顺序0

1MSb在前

MSb在后10SM_SDISHARE共享SPI片选0

1不共享

共享11SM_SDINEWVS1002本地SPI模式0

1非本地模式

本地模式12SM_ADPCMADPCM录音激活0

1不激活

激活13‐-0

1正确的

错误的14SM_LINE1咪/线路1选择0

1MICP

LINE115SM_CLK_RANGE输入时钟范围0

112..13MHz

24..26MHz通过对VS1053手册上该表格后的各位解释说明进行分析,发现该寄存器仅第11位置1,其他置0,则该寄存器的置位方案为0X0400(设定SPI的一些特性)图2.8核心板所连接的解码板外部电路部分截选VS1053b通常运作在一个频率为12.288MHz基频的主时钟上。时钟可以通过外部的电路(连接到引脚XTALI)或通过内部的时钟晶振接口(连接到XTALI和XTALO引脚)来产生的。这个时钟用来给模拟部件确定最高的可用采样率。在12.288MHz下,最高到48000Hz的所有采样率都可用。时钟频率加乘数寄存器CLOCKF 通过查阅VS1053手册知该寄存器的设定频率主要会影响芯片能解码的采样率。查阅VS1053手册知:如果需要典型值,则内部乘法器值在复位之后必须设置为3.5x,等待DREQ升高之后,将数值0x9800写入CI_CLOCKF。将0x9800写入该寄存器能达到最优性能。音量控制寄存器VOL 通过查阅VS1053手册知该寄存器用于设定VS1053的音量大小。这个音量寄存器的高字节是控制左通道音量的,低字节是控制右通道音量的。对每个通道,数值在0..254的范围内设置可以实现在最大音量级别内的微调(步长0.5dB)。左通道数值是通过乘上256后再加到这个数值上的。所以,最大的音量是0、无声是0xFEFE。设置SCI_VOL为0xFFFF将会使模拟单元进入掉电模式(降低功耗)2.4.4解码器硬件复位VS1053有一个复位引脚,低电平有效。当XRESET信号被驱动到低电平,VS1053b将重置所有的内部状态和控制寄存器为它们的初始值。如果我们没有播放音乐,可以复位VS1053让它省电。在进行硬件复位(或上电)操作之后,DREQ将在低电平上停留最少22000个时钟周期,这对于运行在12.288MHz的VS1053b上来说,大约是1.8毫秒。随后用户应该在开始解码之前事先设置SCI_MODE、SCI_BASS、SCI_CLOCKF和SCI_VOL这几个基本软件寄存器。即复位后大概要等待1.8ms才能设置寄存器。2.4.5解码器软件复位在某些情况下,解码器需要通过软件来进行复位操作。软件复位是通过激活SCI_MODE寄存器中的SM_RESET位来实现的,在这之后需要等待最少2微秒后再去查询DREQ状态。DREQ将在低电平上停留最少22000个时钟周期,对于运行在12.288MHz的VS1053b上来说,大约是1.8毫秒。然后等DREQ上升变为高,就可以像平常那样继续播放了。软件复位并不会复位寄存器。软件应用:用于VS1053出现播放故障时,进行复位的。2.4.6音频通道选择器初始化通过阅读配套手册得知,因为本项目使用的开发板套件上面外接了一个74HC4052模拟通道选择器件,根据开发板上面的原理图我们可以知道VS1053的音频源是接到74HC4052的通道0。根据74HC4052的真值表可以知道我们需要把PD7和PB7都输出低电平。图2.9开发板音频源管理图表2.674HC4052的真值表Inputs‘‘ON’’ChannelsInhABXYHXXNoneNoneLLL0X0YLLH1X1YLHL2X2YLHH3X3Y2.5代码编写2.5.1解码器底层接口函数实现需要进行编写的VS1053底层函数有:1.IO口初始化函数2.SPI初始化函数3.SPI发送函数4.SPI接收函数5.SPI设定通信速度的函数6.VS1053SCI操作7.VS1053SDI操作 接下来将对以上七个部分的代码进行编写及部分简要说明。1.IO口初始化函数 首先进行时钟使能,然后对负责SPI的寄存器管脚置位、然后分别对PE6、PF7、PC13、PF6管脚置位。voidvs1053_port_init(void){RCC->APB2ENR|=(1<<2);//开PA时钟RCC->APB2ENR|=(1<<6);//开PE时钟RCC->APB2ENR|=(1<<4);//开PC时钟RCC->APB2ENR|=(1<<7);//开PF时钟 /*配置SPI1引脚*/ GPIOA->CRL&=~(0XFFFU<<5*4); GPIOA->CRL|=(0XB8BU<<5*4); GPIOA->ODR|=(1<<6);//XRESET--PE6通用推挽输出时钟2MGPIOE->CRL&=~(0XF<<6*4);GPIOE->CRL|=(0X2<<6*4);GPIOE->ODR|=(1<<6);//DREQPC13下拉输入GPIOC->CRH&=~(0XF<<(13-8)*4);GPIOC->CRH|=(0X8<<(13-8)*4); //XCSPF7通用推挽输出时钟2MGPIOF->CRL&=~(0XFU<<7*4);GPIOF->CRL|=(0X2U<<7*4);GPIOF->ODR|=(1<<7); //XDCSPF6通用推挽输出时钟2M GPIOF->CRL&=~(0XF<<6*4);GPIOF->CRL|=(0X2<<6*4);GPIOF->ODR|=(1<<6);}—————————————————————————————————————2.SPI初始化函数按照前文2.4.2进行的分析和对通过查阅芯片手册和原理图,可以了解到所需要进行的SPI配置为:voidvs1053_spi_init(void){/*配置SPI1的工作状态*/RCC->APB2ENR|=(1<<12);//设定波特率SPI1->CR1&=~(0x7<<3);SPI1->CR1|=(0x7<<3);//256分频72M/256//设定数据帧SPI1->CR1&=~(0x1<<11);SPI1->CR1&=~(0x1<<7);//设定工作模式SPI1->CR1&=~(0x1<<15);SPI1->CR1&=~(0x1<<10);//设定时序SPI1->CR1|=(0x1<<1);SPI1->CR1|=(0x1<<0);//设定SPI主/从机软件管理SPI1->CR1|=(0x1<<9);SPI1->CR1|=(0x1<<8); SPI1->CR1|=(0x1<<2);//使能SPISPI1->CR1|=(0x1<<6);}3.SPI发送函数voidvs1053_spi_send_byte(u8data){//等待前面的发送完成while(!(SPI1->SR&(1<<1)));//给数据DR寄存器SPI1->DR=data;//等待接收完成(无用的数据)while(!(SPI1->SR&(1<<0)));data=SPI1->DR;}4.SPI接收函数u8vs1053_spi_receive_byte(void){u8data;//等待前面的发送完成while(!(SPI1->SR&(1<<1)));//给数据DR寄存器SPI1->DR=0xff;//等待接收完成while(!(SPI1->SR&(1<<0)));data=SPI1->DR;returndata;}—————————————————————————————————————5.SPI设定通信速度的函数因为VS1053的寄存器操作的数据要比数据操作的数据要慢,不能用操作数据的速度操作它的寄存器,如果把操作数据的速度调到符合寄存器操作,会造成传输数据很慢。voidvs1053_spi_set_speed(u8speed){while(SPI1->SR&(1<<7));SPI1->CR1&=~(0x1<<6);SPI1->CR1&=~(0x7<<3);SPI1->CR1|=(speed<<3);//SPI1->CR1|=(0x1<<6);}—————————————————————————————————————6.VS1053SCI操作SCI操作:操作VS1053的寄存器一定要注意降低SPI的通信速度,操作完后可以把SPI速度调高。操作寄存器要确保XCS指令片选为低电平,XDCS数据片选为高电平。参考VS1053手册注意事项,得知由于tWL+tWH+tH是6×CLKI+25ns,所以SCI的最大读取速度是CLKI/7。 SCI操作速度:小于4M 寄存器操作需要用到寄存器地址,我们可以先把所有的寄存器地址定义处理。#defineVS1053_SPI_LOW4//SPI32分频72M/32=2.25M#defineVS1053_SPI_HIGHT2//SPI8分频72M/8=9M#defineVS1053_W_CMD 0x02//写操作指令#defineVS1053_R_CMD 0x03//读操作指令#defineSCI_MODE 0x00//寄存器地址SCI写寄存器voidvs1053_write_reg(u8addr,u16data)//将数据写进哪个寄存器里{ vs1053_spi_set_speed(VS1053_SPI_LOW); GPIOF->ODR|=(1<<6);//XDCS=1 GPIOF->ODR&=~(1<<7);//XCS=0 vs1053_spi_send_byte(VS1053_W_CMD); vs1053_spi_send_byte(addr); vs1053_spi_send_byte(data>>8); vs1053_spi_send_byte(data&0XFF); GPIOF->ODR|=(1<<7);//XCS=1 vs1053_spi_set_speed(VS1053_SPI_HIGHT);}SCI读寄存器u16vs1053_read_reg(u8addr){ u16temp; u8templ,temph; vs1053_spi_set_speed(VS1053_SPI_LOW); GPIOF->ODR|=(1<<6); GPIOF->ODR&=~(1<<7); vs1053_spi_send_byte(VS1053_R_CMD); vs1053_spi_send_byte(addr); temph=vs1053_spi_receive_byte(); templ=vs1053_spi_receive_byte(); GPIOF->ODR|=(1<<7); vs1053_spi_set_speed(VS1053_SPI_HIGHT); temp=temph<<8|templ; returntemp;}—————————————————————————————————————7.VS1053SDI操作SDI操作:主机必须要在数据请求线DREQ变为高电平的时候才可以发送音频数据给VS1053b,DREQ变为高电平代表VS1053b的数据FIFO至少可以接受32字节的音频数据。发数据之前需要把数据片选拉为低电平。编写时并没有判断数据请求线是否变为高电平,是因为我们在调用这个函数的时候才做判断SDI操作速度:小于9.2MSDI操作函数voidvs1053_write_fifo(u8*data){ u8i; GPIOF->ODR&=~(1<<6); for(i=0;i<32;i++) { vs1053_spi_send_byte(data[i]); } GPIOF->ODR|=(1<<6);}2.5.2解码器复位函数实现硬件复位 硬件复位操作的是PE6引脚,先将PE6拉成高电平,在将PE6复位回低电平,硬件复位完成后再把PE6拉高即完成硬件复位。硬件复位函数:voidvs1053_hard_reset(void){GPIOE->ODR|=(1<<6);delay_ms(10);GPIOE->ODR&=~(1<<6);delay_ms(10);GPIOE->ODR|=(1<<6);delay_ms(10);}软件复位软件复位是通过激活SCI_MODE寄存器中的SM_RESET位来实现的。先编写一段寄存器的写操作代码,编写时确保XCS拉低片选脚时XDCS保持高电平。由前可知SCI操作速度较慢,故编写SCI写操作代码时先将通信速度调低,待通信结束后将速度调回至告诉。读操作代码与写操作代码步骤大致相同,SPI的数据宽度为8位,故使用两个参数来接收SPI读取到的16位数据。操作寄存器必须整体操作,对于SCI_MODE寄存器的里的数据我们不清楚,所以要先把VS1053SCI_MODE寄存器的内容读出来,再把SM_RESET位置1,然后再把这个数写进寄存器。软件复位函数voidvs1053_soft_reset(void){u16temp;temp=vs1053_read_reg(SCI_MODE);temp|=1<<2;vs1053_write_reg(SCI_MODE,temp);delay_ms(2);}2.5.3配置寄存器使用前面步骤里编写好的寄存器写函数对SCI_MODE、SCI_CLOCKF、SCI_VOL分别进行置位即可。配置寄存器函数voidvs1053_init(void){//引脚初始化vs1053_port_init();//SPI初始化vs1053_spi_init();//硬件复位vs1053_hard_reset();//配置VS1053的工作状态vs1053_write_reg(SCI_MODE,0X0800);//配置VS1053最优的工作解码vs1053_write_reg(SCI_CLOCKF,0X9800);//设定默认的音量vs1053_write_reg(SCI_VOL,0X1E1E);}2.5.4音频通道选择器初始化使用上两步里编写好的寄存器写函数对PD7和PB7分别进行置位即可。音频通道选择器初始化函数voidhc4052_port_init(void){ //APD7BPB7 //1.开时钟A-2B-3C-4D-5E-6F-7 RCC->APB2ENR|=(1<<5);//开PD时钟 RCC->APB2ENR|=(1<<3);//开PB时钟 //2.配引脚功能 //APD7推挽输出时钟2M GPIOD->CRL&=~(0XFU<<7*4); GPIOD->CRL|=(0X2U<<7*4); GPIOD->ODR&=~(1<<7);//输出低电平 //BPB7推挽输出时钟2M GPIOB->CRL&=~(0XFU<<7*4); GPIOB->CRL|=(0X2U<<7*4); GPIOB->ODR&=~(1<<7);//输出低电平}2.5.5利用VS1053播放一首歌曲要知道什么时候才可以发送数据给VS1053,能不能发送数据给VS1053是由DREQ引脚进行反馈的,需要等到这个引脚变为高电平才能发送数据给VS1053,至少可以发送32个字节。发送数据给VS1053时需要注意将XDCS片选引脚拉为低电平。下面对该部分代码以注释方式进行思路描述。FR_OK=0u8mp3buff[2048];//2k大小的buffvoidvs1053_play_music(void){ FRESULTres; FILfp; UINTbr; u32cnt=0; res=f_open(&fp,"0:/讲不出再见-谭咏麟.mp3",FA_READ);//只读的方式打开一首歌 if(res!=FR_OK)while(1);//如果打开不成功 else { while(1)//一首歌数据很大,用while循环读数据 { res=f_read(&fp,mp3buff,sizeof(mp3buff),&br);//读取打开的fp文件,读取sizeof(mp3buff)字节,返回读了多少字节if(br==0)break;//读取文件完毕 if(res!=FR_OK)while(1);//读取文件失败 else { while(cnt<sizeof(mp3buff)) { if(GPIOC->IDR&(1<<13))//判断是否可以给数据VS1053,如果为高电平,可以给至少32个字节 {vs1053_write_fifo(&mp3buff[cnt]);//调用外部函数write_fifo对VS1053的fifo进行歌曲数据传入cnt=cnt+32; } else { OSTimeDlyHMSM(0,0,0,20);//MP3任务主动放CPU,否则其它地方用不了CPU } } cnt=0; } } }}2.6硬件测试 将MP3开发套件通过USB线连接至电脑进行供电,通过杜邦线及转换板、ST-LINK代码烧录器与电脑通过USB口相连进行通信,在KEIL软件中将开发套件配套的部分底层代码及自己编写的VS1053驱动代码烧录进套件中,能成功进入MP3界面并播放音乐。图2.10测试结果3

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论