工作环境(蓝色粗体字为特别注意内容)
1,硬件环境:VS1053解码芯片、STM32F103C8T6
2, 软件环境:Keil UV5
这两天刚刚放假,闲来无事折腾折腾VS1053,搞了两天终于调通了,在此记录一下,希望能够给迷茫的朋友提供点思路吧,电路图和程序我打包放到文章最后了,需要的朋友可以下载使用,改一下IO口就能工作。
秉着自己动手,丰衣足食的原则,动手设计了STM32最小系统和VS1053的电路图,并且手工做了PCB看看效果。先来看看VS1053的电路图,跟官方推荐的差不多。
板子做好后的效果如下:
一开始连好线,发现耳机一点声音都没有,测量12.288M晶振的两个引脚,发现没有任何波形,于是按压晶振,发现耳机有反应,怀疑是晶振有问题的原因,二话不说,换晶振,换了另外一个晶振之后发现耳机有反应了,发出断断续续的沙沙声,但是没听到滴滴的正弦波测试音。测量XIAL0(pin17)的波形,发现有波形了!
测量XIAL1(pin18)的波形 如下图所示:
波形是我把示波器表笔打到了10倍衰减之后测量得到的,不衰减的话接上表笔一瞬间信号就消失了,应该是表笔影响了测量信号的原因。既然信号出来了,说明晶振工作正常,按理说芯片基本上应该正常工作了。可是为什么只有沙沙声呢?仔细检查引脚,最终发现MISO和MOSI引脚接反了!换过来之后,正弦波的滴滴声终于出来了。。。
贴一下我的测试代码:
/******************** Pang ********************
* 文件名 :main.c
* 描述 :STM32F103C8T6 12M测试代码
* 库版本 :3.5
* 编译软件:KEIL4
* 作者 :Pang
LED- -> PB15
*****************************************************************/
#include "stm32f10x.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "IIC.h"
#include "vs_spi.h"
#include "math.h"
#include "led.h"
#include "vs1053.h"
void disableJTAG()
{
//开启AFIO 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
// 改变指定管脚的映射 GPIO_Remap_SWJ_Disable SWJ 完全禁用(JTAG+SW-DP)
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);
// 改变指定管脚的映射 GPIO_Remap_SWJ_JTAGDisable ,JTAG-DP 禁用 + SW-DP 使能
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
}
int main()
{
u16 i = 0;
SystemInit(); //系统时钟等初始化
delay_init(); //延时初始化
NVIC_Configuration();//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
disableJTAG();
uart_init(115200); //串口初始化为115200
LED_Init();
//I2C_GPIO_Config();
//SPI_init(256);
//VS1053初始化
VS_Init();
// VS_Sine_Test();
VS_Set_All();
while(1)
{
delay_ms(2000);
i = VS_Ram_Test();
VS_Sine_Test();
printf("ram:%x\r\n", i);
delay_ms(1000);
}
while(1)
{
LED_Flash();
printf("hello!\r\n");
delay_ms(2000);
}
}
但是读器件MODE和RAM的时候,发现VS1053读出来始终是0!测量MISO和MOSI引脚都有信号的。读不到数据但是能够发出正弦波说明MOSI引脚正常,于是把目标锁定在MISO(主机输入从机输出)引脚上。断开MISO引脚,检测STM32的MISO引脚,发现居然有信号!经测量发现该信号竟然和SCK信号一样!原因真是无语,STM32最小系统的MISO引脚和SCK引脚短路了。。。。
问题排除之后Mode和RAM都能够正常读出来了~
顺便提一下,STM32F103的SPI1引脚定义如下:
SCK -> PA5
MISO -> PA6
MOSI -> PA7
另外需要注意一点就是VS1053工作时序是DREQ为芯片工作状态引脚,高电平才处于就绪状态,如果是低电平则不要给芯片发送数据。所以通过测量该引脚的波形也可以判断芯片是否正常工作!所以通过测量该引脚的波形也可以判断芯片是否正常工作!