您的位置 首页 ADAS

根据stm32的MP3播放器调试经历

在调试vs1003之前就已经翻阅过vs1003的datasheet(数据手册);基本上懂了其通讯原理,和一些基本设置。在调试的时候只是拿网上找的代码,

在调试vs1003之前就现已翻阅过vs1003的datasheet(数据手册);底子上懂了其通讯原理,和一些底子设置。

在调试的时分仅仅拿网上找的代码,做了相应的修正(接口改为我自己的,功用改为我自己想要的功用),这样仅仅为了快速测验我的vs1003模块能不能用,当然这首先是要你能了解其代码,要不然是第一次调试你也不知道是程序有错仍是硬件有错。在确认程序没错之后,我就能够确认假如没有作用,那肯定是我的解码模块不可。测验经过之后我就能够定心的运用我自己的解码模块。接下来的程序我就能够依据自己想要的渐渐来写。

第一次写程序进去就听到耳机里输出了很高的鸣叫声,这是由于我把正弦测验(vs1003自带的一种测验,这样就能很快确认你的vs1003是否能作业)频率调的很高 所以声响很尖,被吓了一次。第2次就把它改小了一点,嘟的一声,呵呵适当激动,这说明我的vs1003能够用(s1003十分软弱 很简单坏 又贵又不好买)

正弦测验成功之后我就开端想给vs1003发送MP3音频数据 看能不能解码放出声响来

我开端的主意是经过winhex软件翻开检查MP3代码然后复制出来作为一个数组发给vs1003。这个数据要贮存在我的单片机的程序贮存区里,还好我的单片机程序贮存区够大有64K。这样多的MP3代码也只能够听到一点点声响,作用肯定是无法领会的道。公然 ,在耳机里只听到吱~的一声就没了 底子没用

之后我就想把sd卡加进来,让MCU一边从sd里读取MP3数据,再一边发送到vs1003里面去解码,这样就能够一向把一首MP3的数据悉数发送到vs1003进行解码。所以我先复制了一个码率比较低的MP3,由于单片机的速度究竟很慢 从sd卡里读取数据然后又要发送给vs1003解码 先找一个码率比较低的MP3做测验这是正确的挑选。

开端组合程序,编写相应的主函数,通电测验。没有任何反响,串口调试(假如读写sd正常能够从串口接纳到sd卡的第0扇区数据(逻辑扇区)这是我程序特意设定的,为了便利看出sd是否在作业)也接纳不到任何数据 ,确认sd卡未启用。我认为sd卡的读写又出问题了 ,拿之前做好的sd测验程序从头测验,也没有数据输出,很晕。

不经意间我发现当我拔掉解码模块sd卡读写正常,找到这一重关键之后,我开端剖析问题。

由于我的sd卡和vs1003与MCU的通讯方法都是spi。而我的MCU只需一个硬件spi,所以都统一衔接到一起了 仅仅经过不同的片选让它们轮番运用spi。惋惜的是这样不可。经过屡次实验,猜测,也在网上寻求答案(未果)。终究我自己搞了解了,是应为我用的MCU为5V器材,为了能跟vs1003、sd卡正常通讯 ,我把MCU的spi口设置成为开漏方式,让后加3.3v的上拉。这样我的单片机spi口最大电压也只能是3.3v了。不过一起开漏方式让它的驱动才能变得很弱,无法一起接两个spi通讯模块~~~

所以我把sd卡的接口换到P0口选用软件模仿spi读取数据,这样一来,呵呵串口能够看到接纳到数据了随之耳机里传来了久别的音乐,不过声响很乱,就像快进相同。仍是很振奋 ,究竟是能出声响了。

为什么声响会乱掉,这个时分开端找问题,一向花了我两天的时刻,vs1003的datasheet看了一遍又一遍 ,敢肯定我的程序肯定是没错。那便是硬件了。

剖析它的原理开端查问题,看看是那步错了。

vs1003解码MP3数据,你只需把正确的MP3数据传送给它,它就能自动识别你的MP3是多少码率的,然后经过必定的解码速率进行解码。这个时分就有疑问了,已然解码的速率确认了,为了能流通的播映出音乐来,你给vs1003发送MP3数据的速率有必要跟它解码的速率相同,那怎样去确保这两个速度相同呢?假如送给vs1003的数据过快,那咱们能够加延时让它相同,那这时分又出问题了,莫非每一首不同码率的歌都要去加个延时吗(这儿是按发送数据永远比解码速率快的状况来剖析),这样肯定是不合理的。不必忧虑,vs1003为用户预备了0.5k的数据缓冲区做为音频数据的缓冲,这就如同一个漏斗相同,0.5k空间就像漏斗的容量,你只需确保漏斗里面一直有东西,那么漏斗底下就一直有东西流出,坚持接连。你给漏斗加料的速度无所谓,只需你别让漏斗里面为空就行。vs1003是相同的为了解码正常,播映流通,你只需确保数据缓冲区里一直有数据作为待解码目标,这样就能够放出流通的音乐来。这儿又有问题了,咱们怎样确认数据缓冲区里到低有没有数据,或者是还有多少,怎样操控发送数据。vs1003也帮你考虑到这一点了,所以他专门设定了一个中断脚DREQ,当DREQ变高时,外部能够至少为vs1003发送 32字节的数据(这是SDI数据,还有一种SCI数据,这儿不说了),为了确保播映流通。当vs1003收到32字节的数据之后他的DREQ脚变为低,此刻能够暂时不往里面发送数据,假如数据缓冲区内少于32字节的有用数据,那么vs1003将DREQ置为高电平,此刻需求往里面发送数据(关于DREQ脚的改变,网上有贰言,这是我个人的了解)。这儿你会发现,我之前不是说数据缓冲区是0.5k,为什么每次才32个数据就能够了。vs1003仅仅设置了一个32byte为规范,当然 你能够当在检测到DREQ脚变高时,往里面一次性发送少于(这是有必要的)0.5k的字节,然后再去检测DREQ的状况,当再次变高时 你就能够再往里面发送那么多数据,是能够的。32byte仅仅一个最低规范。个人了解~~

按这个寻到问题的本源~~~我的DREQ没有在作业,屏蔽了他 播映跟本没变,所以说,我的MCU无法判别vs1003的数据区是否满了 是否需求新数据,这儿仅仅一股脑的往vs1003里灌数据

所以导致我的音乐播映不正常,丈量初始化之后的vs1003的DREQ脚,发现居然呈现1.8v,不高不低,处于含糊状况。

确认DREQ脚不能作业,网上寻求答案,对我的状况都没用。之后又翻到pcb图上去,发现一个很重要的当地未衔接,便是当用spi形式给vs1003发送数据的时分,其串口RX有必要接到IOVDD.

还有一个test脚要接到IOVDD。到此刻现已是11点54分,立刻要熄灯了。

总算找到一个可行性的问题。

今日一大早,我把那条线补上去,初始化vs1003一测DREQ脚为3.3(高)。很是激动,DREQ能够作业了,那么音乐播映就能够了,哈哈。下载程序测验。

全部OK!!!!

至此我很激动,写下这篇心历以作留念

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/adas/257143.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部