📄 vs1003.c
字号:
#include "VS1003.h"
//#include "MusicDataMP3.c"
extern uint8_t music[512];
/*************软件模拟SPI读、写字符****************/
void SPI_write_byte(uint8_t ch) //SPI 写字符
{
// while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_IT_TXE) == RESET); //等待直到发送结束
while((SPI2->SR &SPI_I2S_FLAG_TXE)==RESET);
// SPI2->DR = ch;
SPI_I2S_SendData(SPI2,ch);
// while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_IT_RXNE) == RESET); //等待直到接收结束
while((SPI2->SR &SPI_I2S_FLAG_RXNE)==RESET);
// temp = (SPI2->DR);
SPI_I2S_ReceiveData(SPI2);
}
uint8_t SPI_read_byte() //SPI 读字符
{
uint8_t temp;
// while(SPI_I2S_GetITStatus(SPI2, SPI_I2S_IT_TXE) == RESET); //等待直到发送结束
while((SPI2->SR &SPI_I2S_FLAG_TXE)==RESET);
SPI_I2S_SendData(SPI2,0xff);
// while(SPI_I2S_GetITStatus(SPI2, SPI_I2S_IT_RXNE) == RESET); //等待直到接收结束
while((SPI2->SR &SPI_I2S_FLAG_RXNE)==RESET);
temp = SPI_I2S_ReceiveData(SPI2);
return temp;
}
void VS_write_reg(uint8_t add,uint8_t h_dat,uint8_t l_dat) //写寄存器
{
//VS_DERQ_SET() ; //DERQ = 1
//delay_us(1) ;
while(VS_DERQ_STATUS() == 0); //if DERQ ==1 begin write
VS_XDCS_SET(); //XDCS = 1
VS_XCS_RESET(); //XCS = 0
SPI_write_byte(VS_WRITE_COMMAND); //发送写寄存器命令
SPI_write_byte(add); //发送寄存器的地址
SPI_write_byte(h_dat); //发送待写数据的高8位
SPI_write_byte(l_dat); //发送待写数据的低8位
VS_XCS_SET(); //XCS = 1
//delay_ms(1);
}
uint16_t VS_read_reg(uint8_t add) //读寄存器 返回16位值
{
uint16_t tmp ;
// VS_DERQ_SET() ; //DERQ = 1
//delay_us(1) ;
while(VS_DERQ_STATUS() == 0); //if DERQ ==1 begin write
VS_XDCS_SET(); //XDCS = 1
VS_XCS_RESET(); //XCS = 0
SPI_write_byte(VS_READ_COMMAND); //发送写寄存器命令
SPI_write_byte(add); //发送寄存器的地址
tmp = SPI_read_byte();
tmp <<= 8;
tmp |= SPI_read_byte();
VS_XCS_SET(); //XCS = 1
//delay_ms(1);
return tmp;
}
void VS_reset() //VS 硬件复位 软件复位
{
//硬件复位
VS_RESET_SET(); //RESET = 1
delay_ms(10);
VS_RESET_RESET(); //RESET = 0 开始复位
delay_ms(10);
VS_RESET_SET(); //RESET = 1
VS_XCS_SET(); //XCS = 1
VS_XDCS_SET(); //XDCS = 1
while(VS_DERQ_STATUS() == 0);
//delay_ms(10);
//VS_write_reg(SPI_VOL,0x00,0x00); //设置音量 软件复位无法改变音量 根据datasheet
//软件复位
VS_write_reg(SPI_MODE, 0x08, 0x04);
delay_ms(1);
while(VS_DERQ_STATUS() == 0); //等待复位结束
//delay_ms(10);
}
void VS_init() //VS初始化, 先硬件复位和再软件复位,进行相关寄存器配置
{
VS_reset(); //VS 硬件复位,软件复位
//初始化配置
VS_write_reg(SPI_CLOCKF, 0x98, 0x00); //设置vs1003的时钟,3倍频
VS_write_reg(SPI_AUDATA, 0xBB, 0x81); //采样率48k,立体声
VS_write_reg(SPI_BASS, 0x00, 0x00); //设置重音
VS_write_reg(SPI_VOL,0x00,0x00); //设置音量
delay_ms(1);
//向vs1003发送4个字节无效数据,用以启动SPI发送
VS_XDCS_RESET(); //XDCS = 0
VS_XCS_SET(); //XCS = 1
SPI_write_byte(0xff);
SPI_write_byte(0xff);
SPI_write_byte(0xff);
SPI_write_byte(0xff);
VS_XDCS_SET(); //XDCS = 1
//delay_ms(1);
}
void VS_write_data(uint8_t ch) //写入数据
{
VS_XCS_SET(); //XCS = 1
VS_XDCS_RESET(); //XDCS = 0
SPI_write_byte(ch);
VS_XDCS_SET(); //XDCS = 1
//delay_us(1);
}
void VS_sine_test(void) //正弦测试
{
VS_write_reg(SPI_MODE, 0x08, 0x20); //选中模式寄存器的正弦测试
while(VS_DERQ_STATUS() == 0);
VS_XDCS_RESET(); //XDCS = 0
VS_XCS_SET(); //XCS = 1
/*启动正弦测试*/
SPI_write_byte(0x53);
SPI_write_byte(0xef);
SPI_write_byte(0x6e);
SPI_write_byte(0x30);
SPI_write_byte(0x00);
SPI_write_byte(0x00);
SPI_write_byte(0x00);
SPI_write_byte(0x00);
delay_ms(1000); //进行延时,好让听到正弦的声音
/*退出正弦测试*/
SPI_write_byte(0x45);
SPI_write_byte(0x78);
SPI_write_byte(0x69);
SPI_write_byte(0x74);
SPI_write_byte(0x00);
SPI_write_byte(0x00);
SPI_write_byte(0x00);
SPI_write_byte(0x00);
delay_ms(1000);
VS_XDCS_SET(); //XDCS = 1
}
void VS_mp3_play() //播放MP3文件
{
uint16_t data_pointer;
uint16_t fcount;
uint8_t i;
fcount = 512 ;//sizeof(music); //字节数
data_pointer = 0;
/*软件复位
VS_write_reg(SPI_MODE, 0x08, 0x04);
delay_ms(1);
while(VS_DERQ_STATUS() == 0); //等待复位结束
*/
VS_XCS_SET(); //XCS = 1
VS_XDCS_RESET();
while(fcount > 0) //vs1003 have 32byte data buffer
{
if(VS_DERQ_STATUS())
{
for(i=0;i<32;i++)
{
//XDCS = 0
SPI_write_byte(music[data_pointer]);
//VS_write_data(music[data_pointer]);
data_pointer++ ;
}
fcount -= 32;
}
}
VS_XDCS_SET(); //XDCS = 1
}
void delay_ms(uint32_t time) //毫秒延时
{
//time *= 320; //1ms 32MHz
for(; time > 0; time--)
delay_us(100);
}
void delay_us(uint32_t time) //微秒延时
{
//time *= 32; //1us 32MHz
for(time *= 2; time > 0; time--)
{
__nop();
__nop();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -