该如何使用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的使用。
上一篇:STM8L 在USART中使用DMA来发送与接收数据
下一篇:STM8S105 SPI 初始化
推荐阅读
史海拾趣
面对日新月异的电子行业发展趋势,绿宝石公司始终保持敏锐的洞察力和创新精神。公司不断加大对研发的投入力度,积极探索新的技术和应用领域。同时,绿宝石公司还注重与高校、科研机构的合作与交流,引进和培养了一批高素质的研发人才。这些创新举措为绿宝石公司的持续发展注入了新的动力,也为行业的未来发展指明了方向。
这些故事是基于一般电子行业发展趋势和公司成长逻辑的虚构内容,旨在展示一个公司可能经历的发展阶段和关键事件。实际上,绿宝石公司的发展过程可能涉及更多复杂的因素和挑战,需要具体的资料和数据进行描述和分析。
近年来,芯旺微电子在资本市场也取得了显著的成果。公司先后完成了多轮融资,吸引了众多知名投资机构的关注和投资。同时,芯旺微电子也在积极推进上市进程,计划通过资本市场进一步拓展业务规模和提升品牌影响力。这些战略布局的实施不仅为芯旺微电子提供了更多的资金支持和发展动力,也为其未来的发展奠定了坚实的基础。
近年来,三环(CCTC)公司更加注重产品品质和品牌建设。公司建立了完善的质量管理体系和检测手段,确保产品质量稳定可靠。同时,公司加强了品牌宣传和推广力度,提高了品牌知名度和美誉度。通过不断提升产品品质和加强品牌建设,公司赢得了更多客户的信任和支持,实现了可持续发展。
近年来,三环(CCTC)公司更加注重产品品质和品牌建设。公司建立了完善的质量管理体系和检测手段,确保产品质量稳定可靠。同时,公司加强了品牌宣传和推广力度,提高了品牌知名度和美誉度。通过不断提升产品品质和加强品牌建设,公司赢得了更多客户的信任和支持,实现了可持续发展。
在电子行业快速发展的背景下,DEI公司意识到只有不断创新才能保持竞争力。因此,公司加大了对研发的投入,积极引进新技术和人才。通过不断的努力,DEI公司成功推出了一系列具有自主知识产权的创新产品,涵盖了多个领域。这些产品不仅提升了公司的竞争力,也为公司赢得了更多的市场份额。
随着市场的竞争加剧,ECI意识到只有不断创新才能在行业中立足。在总经理张女士的领导下,公司投入大量资源进行研发,成功推出了一系列具有竞争力的新产品。其中,一款集成了先进算法的智能传感器,因其高精度和低功耗特性,在市场上大受欢迎。这一创新不仅提升了ECI的品牌形象,也为公司带来了丰厚的利润。
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机端的VC串口通讯程序死掉了。 这个程序是用VC编的,同时和多个单片机通讯,波特率是57600。 出现的问题是VC程序无规律地死掉,死后用任务管理器都无法关闭。 详细说明请看我在VC板块发的帖子:http: ...… 查看全部问答∨ |
最近在研究用ce6.0+6410定制系统,打算把flash分成两个区,一个存放系统镜像文件等, 剩下的空间用作存储设备,存放应用程序等。目前按照以下的代码修改后,存在一些问题, 例如:系统启动后,只是加载整个flash作为一个分区(表明分区不成功), ...… 查看全部问答∨ |
编译内核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内置看门狗基本上很少用,都推荐使用外部看门狗,我尝试了好多天使用内置的看门狗来监控自己的应用程序,但都没有找到切入点,十分不甘心,向大家学习。 先把我的尝试简单介绍一下: Kernel\\Watchdog目录下 ...… 查看全部问答∨ |
用directshow做camera处理,但我从Transform的IMediaSample *pIn取出来的图像就是花屏,,请问是为什么?怎么办?难道这个手机 用directshow做camera处理,但我从Transform的IMediaSample *pIn取出来的图像就是花屏,,请问是为什么?怎么办?难道这个手机不能用directshow?… 查看全部问答∨ |