基于stm32的MP3播放器调试经验

发布者:PositiveVibes最新更新时间:2015-09-21 来源: eefocus关键字:stm32  MP3  播放器调试 手机看文章 扫描二维码
随时随地手机看文章
在调试vs1003之前就已经翻阅过vs1003的datasheet(数据手册);基本上懂了其通讯原理,和一些基本设置。

在调试的时候只是拿网上找的代码,做了相应的修改(接口改为我自己的,功能改为我自己想要的功能),这样只是为了快速测试我的vs1003模块能不能用,当然这首先是要你能理解其代码,要不然是第一次调试你也不知道是程序有错还是硬件有错。在确定程序没错之后,我就可以确定如果没有效果,那肯定是我的解码模块不行。测试通过之后我就可以放心的使用我自己的解码模块。接下来的程序我就可以根据自己想要的慢慢来写。

第一次写程序进去就听到耳机里输出了很高的鸣叫声,这是因为我把正弦测试(vs1003自带的一种测试,这样就能很快确定你的vs1003是否能工作)频率调的很高 所以声音很尖,被吓了一次。第二次就把它改小了一点,嘟的一声,呵呵相当激动,这说明我的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!!!!

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

关键字:stm32  MP3  播放器调试 引用地址:基于stm32的MP3播放器调试经验

上一篇:vs1003播放MP3卡的问题
下一篇:将FATFS移植STM32RBT6遇到的挂载不成功和返回值问题(2)

推荐阅读最新更新时间:2024-03-16 14:32

STM32 控制4位共阳数码管输出计数
用到GPIO口 PA0~PA11共12个引脚 先上原理图 因为是共阳所以12,9,8,6为电源输入,其他引脚均为接地,所以对于芯片来说12,9,8,6高位输出,其他设定为低位即可。 //设定下GPIO口 void GPIO_Num_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE); GPIO_InitStructure.GPI
[单片机]
<font color='red'>STM32</font> 控制4位共阳数码管输出计数
STM32 调试 24L01 心得
大部分使用STM32开发nrf24L01的用户基本都是照搬常见的几个开发板的源代码,在这里我做一些总结: 1.源代码中在while(1)的循环中有 NRF24L01_TX_Mode();或NRF24L01_RX_Mode();类似这样的代码,因为源码中需要检测按键以便切换的不同的模式,对于正常使用来讲,都是发送接收方确定了的,所有,只需要一次即可,没必要放到while中。 2.接收方和发送方的ADDRESS必须一致,这一点尤为重要。 3.发射的通道即频率必须一致,这个好理解。速率,数据长度,也要一致! 4.接收方无论是在中断中接收还是在while中接收,接收后必须清掉FIFO寄存器,否则会出现发送1-3次就不能正确发送的现象。
[单片机]
stm32---DAC
DAC即数字模拟转换器,它可以将数字信 号转换为模拟信号。 它的功能与 ADC 相反。在常见的数字信号系统中,大部分传 感器信号被转化成电压信号,而 ADC 把电压模拟信号转换成易于计算机存储、 处理的数字编码,由计算机处理完成后,再由 DAC 输出电压模拟信号,该电压 模拟信号常常用来驱动某些执行器件,使人类易于感知。如音频信号的采集及还 原就是这样一个过程。 触发方式 前面是定时器TIM,中间是外部中断9,后面是软件触发 dac.c #include dac.h void DAC1_Init() { GPIO_InitTypeDef GPIO_InitStructure; DAC_InitTyp
[单片机]
STM32系统头文件之数据类型定义u8 u16哪里来的
初学STM32编程时,经常见到数据类型定义的符号:u8、u16等,51都是自己定义数据类型的简写符号,STM32是哪里定义的呢?今天没事就看了看系统头文件,数据类型的定义在其中的3个头文件里: (1)stdint.h(摘取定义部分) /* * 'signed' is redundant below, except for 'signed char' and if * the typedef is used to declare a bitfield. */ /* 7.18.1.1 */ /* exact-width signed integer types */ t
[单片机]
STM32HAL库ADC实验(二)——连续采样模式打印电压值
int main(void) { /* USER CODE BEGIN 1 */ uint16_t adcData; float voltage; /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /*
[单片机]
STM32HAL库ADC实验(二)——连续采样模式打印电压值
闪存式MP3的小故障及其解决办法
闪存式MP3(指具备MP3播放功能的闪存)的价格相对较低,因此它的用户数量众多。我们在使用它的过程中难免会遇到故障,如果是产品自身的严重故障,还是要交给经销商或厂家来处理。但是一些小的故障,自己解决会节约很多时间。下面介绍一下笔者所遇到过的一些问题,也许对大家有所帮助:    一、不能开机   可能的故障原因有:   1.电池没有电。   2.电池放置的时候正、负两极颠倒,这种情况应立即解决,长时间地颠倒正、负两极会对MP3内部电路造成损害。   3.有杂物隔在按钮与电路板之间。这种情况,在清除杂物的时候要注意,小心不要损坏电路板上很小的一些元件,而且要注意产品的保修期。切忌将外壳强行打开,这样有可能损坏外壳,既影响美
[模拟电子]
STM32的数据类型基础介绍
首先说一下编程过程中几个步骤吧 第一,选择一门语言,C语言或汇编语言,嵌入式编程一般目前流行还是C,这个需要基础与时间 第二读懂了解 MCU的寄存器各寄存器的功能,尤其是一些IO口设置,各模块时钟设置比如定时器,I2C,同步异步串口,PWM等等,以前的话51的话没有这样设置。而现在MCU基本上各模块时钟都分开了。这个可以看官方数据说明书就可以了。 其实程的目的就是设置一系列寄存器.并根据你设计程序流程去执行它,期间可能加入了你设计好的一些算法,和数学公式。进行计算,或执行。 第三,你有一块你的实验板就如这次STM32推的F429,你还需要下载程序的编程器。就是把编译器编译好的代码下载到你的目标实验板上,不过ST推的多数
[单片机]
<font color='red'>STM32</font>的数据类型基础介绍
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved