历史上的今天

今天是:2024年09月10日(星期二)

正在发生

2018年09月10日 | STM8L151 使用硬件SPI驱动VS1003B MP3解码芯片

发布者:Yudie 来源: eefocus关键字:STM8L151  SPI  驱动VS1003B  解码芯片 手机看文章 扫描二维码
随时随地手机看文章

该如何使用STM8L的硬件SPI去驱动VS1003B?

这个问题分两部分来思考,一是STM8L的SPI部分该如何配置以及与VS1003B相连的控制管脚该如何配置,二是关于VS1003B的时序以及指令使用。

由于STM8L的SPI部分与VS1003B的SPI部分进行相互通信,先看看VS1003B的SPI特性,才能对STM8L进行配置。

在VS1003B中SPI模式定义如下:

其中XDCS为发送MP3数据是的芯片控制管脚,XCS为发送VS1003B指令的控制管脚,在手册中亦有对SPI通信速度的说明,见下图:


上图中CLKI在手册中为:36.864Mhz

故上面SPI的通信速率在6.144MHz-9.216MHz之间,但在本例中根据6.144MHz来配置,在STM8L中主频最高为16MHz,故可以4分频得到4M的SPI速率,但在实际测试中,发现4分频后通信有时会失败,于是改为8分频降低通信速率,故SPI以及VS1003的控制管脚的配置如下:


CLK_PeripheralClockConfig(CLK_Peripheral_SPI1, ENABLE);

//SPI_CLOCK:PB5, SPI_MOSI: PB6, SPI_MISO: PB7

GPIO_Init(GPIOB, GPIO_Pin_5, GPIO_Mode_Out_PP_High_Fast);

GPIO_Init(GPIOB, GPIO_Pin_6, GPIO_Mode_Out_PP_High_Fast);

//主机模式,配置为输入

GPIO_Init(GPIOB, GPIO_Pin_7, GPIO_Mode_In_PU_No_IT);

/* 初始化SPI */

SPI_Init(SPI1, SPI_FirstBit_MSB, SPI_BaudRatePrescaler_8, SPI_Mode_Master,\

SPI_CPOL_Low, SPI_CPHA_1Edge, \

SPI_Direction_2Lines_FullDuplex, SPI_NSS_Soft, 0x07);

SPI_Cmd(SPI1, ENABLE); /* 使能SPI */  

    /* 输入 */

GPIO_Init(VS_1003_DREQ_PORT, VS_1003_DREQ_PIN, GPIO_Mode_In_PU_No_IT);

GPIO_Init(VS_1003_XRST_PORT, VS_1003_XRST_PIN, GPIO_Mode_Out_PP_High_Fast);

    /* 推挽输出 */

GPIO_Init(VS_1003_XDCS_PORT, VS_1003_XDCS_PIN, GPIO_Mode_Out_PP_High_Fast);

    /* 推挽输出 */

GPIO_Init(VS_1003_XCS_PORT, VS_1003_XCS_PIN, GPIO_Mode_Out_PP_High_Fast);

当数据总线传送的是指令数据时,此时的通信协议在VS1003B中称为SCI,该协议的发送时序图如下:


根据上面这个时序图,SCI的Read函数如下面所示:

uint8_t VS1003_ReadByte(void)

{

    /* Loop while DR register in not emplty */

 while (SPI_GetFlagStatus(SPI1, SPI_FLAG_TXE) == RESET);

 /* Send byte through the SPI1 peripheral */

 SPI_SendData(SPI1, 0);

 /* Wait to receive a byte */

 while (SPI_GetFlagStatus(SPI1, SPI_FLAG_RXNE) == RESET);

 /* Return the byte read from the SPI bus */

return SPI_ReceiveData(SPI1);                

}

uint16_t VS1003_ReadRegister(uint8_t addressbyte)

{

uint16_t resultvalue = 0;

XDCS_SET(1);          

XCS_SET(0);              

VS1003_WriteByte(VS_READ_COMMAND);                   //发送读寄存器命令

VS1003_WriteByte((addressbyte));                 //发送寄存器的地址

resultvalue = (uint16_t)(VS1003_ReadByte() << 8);   //读取高8位数据

resultvalue |= VS1003_ReadByte();                     //读取低8位数据

XCS_SET(1);                      

return resultvalue;//返回16位寄存器的值                                 

}

SCI 写的时序如下图:


根据该时序图,SCI的Write函数如下:

uint8_t VS1003_WriteByte( uint8_t byte )

{

  /* Loop while DR register in not emplty */

 while (SPI_GetFlagStatus(SPI1, SPI_FLAG_TXE) == RESET);

 /* Send byte through the SPI1 peripheral */

 SPI_SendData(SPI1, byte);

 /* Wait to receive a byte */

 while (SPI_GetFlagStatus(SPI1, SPI_FLAG_RXNE) == RESET);

 /* Return the byte read from the SPI bus */

return SPI_ReceiveData(SPI1);  

void VS1003_WriteRegister(uint8_t addressbyte, uint8_t highbyte, uint8_t lowbyte)

{

XDCS_SET(1);  //拉高XDCS电平

XCS_SET(0);   //拉低XCS电平   

VS1003_WriteByte( VS_WRITE_COMMAND );//发送写指令字节

VS1003_WriteByte( addressbyte );//发送地址字节

VS1003_WriteByte( highbyte ); //发送数据字的高字节

VS1003_WriteByte( lowbyte ); //发送数据字的低字节

XCS_SET(1); //拉高XCS电平    

}

接下来对VS1003B进行初始化操作:


void VS1003_Init(void)

{

uint8_t BassEnhanceValue = 0x00;      // 低音值先初始化为0

uint8_t TrebleEnhanceValue = 0x00;      // 高音值先初始化为0

RST_SET(0);            

Delayms( 10 );                         // 10ms

VS1003_WriteByte(0xff);                   // 发送一个字节的无效数据,启动SPI传输

XDCS_SET(1);        

XCS_SET(1);          

RST_SET(1);            

Delayus( 1000 );            

  VS1003_WriteRegister( SPI_MODE,0x08,0x00);   // 进入VS1003的播放模式

VS1003_WriteRegister(3, 0x98, 0x00);      // 设置vs1003的时钟,3倍频

VS1003_WriteRegister(5, 0xBB, 0x81);      // 采样率48k,立体声

VS1003_WriteRegister(SPI_BASS, TrebleEnhanceValue, BassEnhanceValue);// 设置重低音

VS1003_WriteRegister(0x0b,0x00,0x00);                               // VS1003 音量

Delayus( 1000 );

while( DREQ == 0 );          // 等待DREQ为高  表示能够接受音乐数据输入

}

在VS1003B中有几种测试模式,如Sine Test、Pin Test、Memory Test,下面就贴一个Sine Test的函数:


void VS1003_TestSIN(void)

{

VS1003_WriteRegister(SCI_MODE, 0x08, 0x20);

while( DREQ == 0);

XDCS_SET(0);

VS1003_WriteByte(0x53);

VS1003_WriteByte(0xef);

VS1003_WriteByte(0x6e);

VS1003_WriteByte(0x44);

VS1003_WriteByte(0x00);

VS1003_WriteByte(0x00);

VS1003_WriteByte(0x00);

VS1003_WriteByte(0x00);

XDCS_SET(1);

XDCS_SET(0);

VS1003_WriteByte(0x45);

VS1003_WriteByte(0x78);

VS1003_WriteByte(0x69);

VS1003_WriteByte(0x74);

VS1003_WriteByte(0x00);

VS1003_WriteByte(0x00);

VS1003_WriteByte(0x00);

VS1003_WriteByte(0x00);

XDCS_SET(1);

while( DREQ == 0);

}

到这里,如果正弦测试正常通过,那么基本上完成了对VS1003B的使用。


关键字:STM8L151  SPI  驱动VS1003B  解码芯片 引用地址:STM8L151 使用硬件SPI驱动VS1003B MP3解码芯片

上一篇:STM8L 在USART中使用DMA来发送与接收数据
下一篇:STM8S105 SPI 初始化

推荐阅读

  参考消息网9月10日报道 台媒称,大陆半导体产业尽管在尖端制程技术还与发达国家有一段差距,但近几年来的快速发展仍有目共睹。据恒大研究院最新发表的研究报告指出,大陆集成电路的产销金额年增率近25%,半导体产业发展迅猛,第三次产业转移的趋势正在向大陆靠拢。  据台湾《旺报》9月7日报道,恒大研究院指出,就现阶段的半导体产业发展来看,2017...
随着金融科技迅猛发展,软银愿景基金正加快相应的产业投资布局。 根据报道,软银集团旗下的愿景基金在公开市场面临极大挑战,已投资的新创公司上市后表现将影响到该公司1000亿美元的投资是否能够成功,且CEO孙正义或许要重新规划未来愿景基金的投资重点。愿景基金投资的金额及速度都十分快,目前已经花费超过700亿美元的金额投资新创公司,大部分受惠公司...
在过去的两年里,EDA领域发生着一件需要引起重视但似乎没人关注的动向:硬件验证工具(基本上是硬件仿真和基于FPGA的原型验证)的收入超过了HDL或RTL Simulation的收入。ESD联盟每季度发布的统计报告显示,从1995年到2018年,HDL Simulation的收入一直超过硬件仿真工具1亿美元左右。然而这一情况在2018年开始逆转,并于2019年,硬件仿真工具销售额超过了...
淘汰某些车辆上的前向雷达,这听起来可能比较难接受,但汽车制造商有理由这么做。 虽然前端雷达作为ADAS系统的基础部件有众多好处,但有充分的理由表明,在可以避免的情况下,取掉前向雷达显然可以节省硬件成本和重量。其优势在于不仅可以节省传感器本身,还可以节省与传感器相关的支架、线束、电源和其他支出。这样做简化了包装,释放了格栅的中间部分,...

史海拾趣

问答坊 | AI 解惑

单片机解密,芯片解密PCB抄板,烧录IC

深圳市南源电子科技有限公司 芯片解密/单片机解密/IC解密/PLD解密/CPLD解密: (慎重声明:仅限合法研究用途) 单片机(MCU)解密、IC解密 、PLD解密、CPLD解密、鉴定芯片型号;成功率高,周期短,费用合理. 大量供应PIC/EMC兼容IC,性能稳定, ...…

查看全部问答∨

红外发光二极管的接收头主要用什么?

红外发光二极管的接收头主要用什么?外发光二极管又是用什么样的二极管? [ 本帖最后由 冷枫yj 于 2009-5-15 10:37 编辑 ]…

查看全部问答∨

wince 5.0 如何加载touch驱动

各位大侠,我在wince5.0的PB中搞了好久加载touch驱动就是没有搞出来,各位帮帮忙了,告诉小女子怎么加载?…

查看全部问答∨

想买一块嵌入式开发板,大家有什么好的建议?

请推荐一款嵌入式开发板子,可以移植uclinux,wince,arm 平台的,其他平台也ok了.基本的 usb device .LCD 触摸屏的最好 了,LAN interface.....大家有什么好介绍..…

查看全部问答∨

vs2005下安装platform builder插件后设置winceroot问题

先安装好vs2005,再装上Embedded CE 6.0   用vs2005建立Platform Builder for CE 6.0工程时,提示要先设置好 WINCEROOT才能使用。 请问高人,怎么设置WINCEROOT?? 十分感谢 …

查看全部问答∨

请问QV2 D极为何会发黑,而且QV2零件还是好的

请教各位大侠以下问题:  以下图中QV2 N-MOS的D极在线路板上为何会有烧黑的痕迹,而且该MOS管用万用表量测还是好的, 这应该是个利用电感 升压的电路,输入是+12v ,输出为-52v左右,是共Voip电压使用的, 电感LV4=6.8uH +/-20% -4.5A ...…

查看全部问答∨

发现SM32的STOP休眠模式很难适用实时低功耗应用!

STM32有三种休眠模式:SLEEP、STOP、STANDBY;休眠层次依次加深,功耗越来越低。SLEEP 模式最容易使用,任何中断或事件都可以唤醒CPU。但低功耗的表现不尽如意。STANDBY 模式下对于实时采集系统来说,几乎没法用。STOP 模式怎么 ...…

查看全部问答∨

请教,怎样对STM32FARM中Flash的某一位擦除?

    想把数据分块存储在Flash中,想单独对Flsh中某一部分进行擦除和写入,而不是对整个业擦除。     看了Flash.c文件中的选择擦除函数,没看懂什么意思,这个函数没有指定擦除地址竟然能实现擦 ...…

查看全部问答∨

24LC02B有时候不能读写

MSP430F149与24LC02B I2C通讯,存储电机脉冲数据,每次动作结束的时候存储一次,用写进去再读出来的方法验证数据是否存储成功,当存储成功时,指示灯亮,不成功时,while循环再次写读指示灯闪烁。问题是:读写成功的机会是随机的,有时候能读写成功 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved