该如何使用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 初始化

推荐阅读

  据外媒报道,市场研究公司IDTechEx的技术分析师Na Jiao博士指出,电动汽车动力电池在退役后,其二次使用的潜力巨大。未来,二手电池可被通用用于静态及移动式储能设备中。   电池是最贵的一款电动车部件。当电池退役后,其电池容量保留率仍高达初始值的70%-80%。然而,退役电池的循环再利用成本,还会耗费大量的能量乃至环境污染。   如今,...
遥感测绘、电力巡检、农业植保、水下作业、物流运输等特殊高危行业面临着人力难以完成,危险性大、成本高的痛点,因此,随着技术不断发展,各行各业专用无人机应运而生。而视频超高清化与人工智能等技术的快速崛起更是将无人机推向了一个新高度。拥有视觉识别、语音识别和决策能力的高级智能无人机的强大功能将为使用人群带来全新的体验,为各个行业带来人...
射频识别(RFID)技术近年来在国内外得到了迅速发展。对于需要电池供电的便携式系统,功耗也越来越受到人们的重视。本文将具体阐述基于MSP430F2012和CC1100低功耗设计理念的双向主动式标签的软硬件实现方法。  低功耗设计  低功耗概述  功耗基本定义为能量消耗的速率,可分为瞬态功耗和平均功耗两类。两者意义不同,有不同的应用背景和优化策略,通...
9月9日上海市政府举行新闻发布会,市委常委、副市长吴清等领导介绍了《上海市先进制造业发展“十四五”规划》(以下简称《规划》)相关情况。《规划》中明确未来以集成电路、生物医药、人工智能三大先导产业为引领,大力发展电子信息、生命健康、汽车、高端装备、先进材料、时尚消费品六大重点产业,构建“3+6”新型产业体系,打造具有国际竞争力的高端产...

史海拾趣

问答坊 | AI 解惑

电话遥控到多网络遥控

多网络遥控,有几分发展前景?希望涉足这方面的大虾给予指教!…

查看全部问答∨

SIP2010信号与图像处理国际会议(Ei&ISTP index)征文

Signal and Image Processing (SIP 2010) Special Track within WiCOM2010                               CALL FOR PAPERS     ...…

查看全部问答∨

适用于电阻电桥传感器的高输入电阻传感放大器

本帖最后由 paulhyde 于 2014-9-15 09:18 编辑 电路的功能   本电路适用于电阻电桥电路(应变仪、半导体压力传感器等),其电压放大倍数取决于外接电阻RO,当RO=∞时,A=1,RO=0时可获得201倍的放大倍数。即使电桥电路失去平衡,如从零端注入电 ...…

查看全部问答∨

什么问题会造成单片机与pc通讯程序死掉

  请问各位大侠,什么问题会造成PC机端的VC串口通讯程序死掉了。 这个程序是用VC编的,同时和多个单片机通讯,波特率是57600。 出现的问题是VC程序无规律地死掉,死后用任务管理器都无法关闭。 详细说明请看我在VC板块发的帖子:http: ...…

查看全部问答∨

wince6.0+6410 flash 分区问题

最近在研究用ce6.0+6410定制系统,打算把flash分成两个区,一个存放系统镜像文件等, 剩下的空间用作存储设备,存放应用程序等。目前按照以下的代码修改后,存在一些问题, 例如:系统启动后,只是加载整个flash作为一个分区(表明分区不成功), ...…

查看全部问答∨

WINCE编译内核时报错

编译内核NK时报如下错误 BUILD: [01:0000000131:ERRORE] NMAKE :  U1073: don\'t know how to make \'D:\\WINCE500\\public\\COMMON\\OAK\\lib\\x86\\retail\\ehcd.def\' BUILD: [01:0000000133:ERRORE] NMAKE.EXE   -i -c ...…

查看全部问答∨

寻使用过AT926x系类ARM内置看门狗的高手

在网上查了很多资料,AT926x系类的ARM内置看门狗基本上很少用,都推荐使用外部看门狗,我尝试了好多天使用内置的看门狗来监控自己的应用程序,但都没有找到切入点,十分不甘心,向大家学习。 先把我的尝试简单介绍一下: Kernel\\Watchdog目录下 ...…

查看全部问答∨

用directshow做camera处理,但我从Transform的IMediaSample *pIn取出来的图像就是花屏,,请问是为什么?怎么办?难道这个手机

用directshow做camera处理,但我从Transform的IMediaSample *pIn取出来的图像就是花屏,,请问是为什么?怎么办?难道这个手机不能用directshow?…

查看全部问答∨

经典C语言书籍【中文版】

本帖最后由 paulhyde 于 2014-9-15 09:00 编辑 经典C语言书籍【中文版】  …

查看全部问答∨

真正的智能内存清理

有用得着的。请下载!…

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

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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