该如何使用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 初始化
推荐阅读
史海拾趣
迪一电子公司成立于2006年,最初只是一家规模较小的半导体电子元器件制造企业。在创业初期,公司面临着资金紧张、技术落后和市场竞争激烈等多重困难。然而,创始人李政坚信半导体行业的发展潜力,带领团队不断研发新产品,提高产品质量,逐渐在市场上赢得了一席之地。
面对电子行业快速变化的市场环境和日益激烈的竞争态势,GStek始终保持清醒的头脑和敏锐的洞察力。公司密切关注行业动态和技术发展趋势,及时调整战略方向和产品布局。同时,GStek还注重内部管理和团队建设,不断提升员工的综合素质和专业技能。这些努力使得GStek能够在复杂多变的市场环境中保持稳健的发展态势,为实现其成为全球主要电源管理IC设计公司的愿景而不断努力。
1995年,Philips Semiconductors收购了Mikron Graz,这一事件标志着EM Microelectronic-Marin与Philips在半导体领域的深度合作。此后,两家公司共同推动了RFID(射频识别)技术的发展,使其逐渐成为电子行业中不可或缺的一部分。EM Microelectronic-Marin凭借其在低功耗技术方面的优势,为RFID技术提供了强有力的支持。
随着5G技术的商用化,微波通信市场迎来了新的发展机遇。为了满足市场需求,FEI Microwave Inc公司迅速调整研发策略,加大投入力度,成功研发出了一系列针对5G应用的微波通信产品。这些产品以其高性能、高可靠性和高性价比迅速在市场上获得了认可,为FEI Microwave Inc公司赢得了更多的市场份额。
在寻求更广泛的市场应用和技术合作方面,Everspin与Quicklogic Corporation签订了分包协议。根据协议,Quicklogic将其部分开发服务分包给Everspin,共同推进战略辐射加固现场可编程门阵列原型项目的开发。这一合作不仅展示了Everspin在电子行业中的技术实力和市场影响力,也为其未来的发展开辟了新的道路。
以上五个故事概述了Everspin Technologies公司在电子行业中发展起来的关键历程和成就。这些故事展示了Everspin在MRAM技术领域的领先地位、创新能力和市场应用方面的成功。
Chiplus深知企业管理对于公司发展的重要性。因此,公司建立了一套完善的管理体系,注重人才培养和团队建设。公司定期举办内部培训和技术交流活动,提升员工的专业技能和综合素质。同时,Chiplus还积极引进外部优秀人才,为公司的持续发展注入新的活力。
深圳市南源电子科技有限公司 芯片解密/单片机解密/IC解密/PLD解密/CPLD解密: (慎重声明:仅限合法研究用途) 单片机(MCU)解密、IC解密 、PLD解密、CPLD解密、鉴定芯片型号;成功率高,周期短,费用合理. 大量供应PIC/EMC兼容IC,性能稳定, ...… 查看全部问答∨ |
|
请推荐一款嵌入式开发板子,可以移植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 N-MOS的D极在线路板上为何会有烧黑的痕迹,而且该MOS管用万用表量测还是好的, 这应该是个利用电感 升压的电路,输入是+12v ,输出为-52v左右,是共Voip电压使用的, 电感LV4=6.8uH +/-20% -4.5A ...… 查看全部问答∨ |
STM32有三种休眠模式:SLEEP、STOP、STANDBY;休眠层次依次加深,功耗越来越低。SLEEP 模式最容易使用,任何中断或事件都可以唤醒CPU。但低功耗的表现不尽如意。STANDBY 模式下对于实时采集系统来说,几乎没法用。STOP 模式怎么 ...… 查看全部问答∨ |
想把数据分块存储在Flash中,想单独对Flsh中某一部分进行擦除和写入,而不是对整个业擦除。 看了Flash.c文件中的选择擦除函数,没看懂什么意思,这个函数没有指定擦除地址竟然能实现擦 ...… 查看全部问答∨ |
MSP430F149与24LC02B I2C通讯,存储电机脉冲数据,每次动作结束的时候存储一次,用写进去再读出来的方法验证数据是否存储成功,当存储成功时,指示灯亮,不成功时,while循环再次写读指示灯闪烁。问题是:读写成功的机会是随机的,有时候能读写成功 ...… 查看全部问答∨ |