📄 vs1003.c
字号:
#include"config.h"
/******************************************************************
- 功能描述:向VS1003的功能寄存器中写入数据(一个字,即两个字节)
- 隶属模块:VS1003B模块
- 函数属性:外部,用户可调用
- 参数说明:addr是功能寄存器的地址
hdat是要写入的高字节
ldat是要写入的低字节
- 返回说明:无返回
******************************************************************/
void VS_Write_Reg(unsigned char addr,unsigned char hdat,unsigned char ldat)
{
//SET_VS_DREQ; //51单片机IO作输入时先置为1
while( (VS_PIN&(1<<VS_DREQ)) == 0); //VS1003的DREQ为高电平时才接收数据
CLR_VS_XCS; //打开片选,SCI有效,这样才能对功能寄存器进行读写
SPI_RW(0x02); //写入操作码0x02 00000010 (功能寄存器写操作)
SPI_RW(addr); //写入寄存器地址
SPI_RW(hdat); //写入高字节
SPI_RW(ldat); //写入低字节
SET_VS_XCS; //关闭片选,SCI无效
}
/******************************************************************
- 功能描述:从VS1003的功能寄存器中读取数据(一个字)
- 隶属模块:VS1003B模块
- 函数属性:外部,用户可调用
- 参数说明:addr是功能寄存器的地址
- 返回说明:返回从VS1003的功能寄存器中读到的值
******************************************************************/
unsigned int VS_Read_Reg(unsigned char addr)
{
unsigned int temp=0;
//SET_VS_DREQ;
while( (VS_PIN&(1<<VS_DREQ)) == 0); //VS1003的DREQ为高电平时才接收数据
CLR_VS_XCS; //打开片选,SCI有效
SPI_RW(0x03); //读出操作码0x03 00000011(功能寄存器读操作)
SPI_RW(addr); //写入寄存器地址
temp=SPI_RW(0xff); //读高字节
temp<<=8;
temp|=SPI_RW(0xff); //读取低字节,与高字节拼成一个字
SET_VS_XCS; //关闭片选,SCI无效
return temp; //返回读到的值
}
/******************************************************************
- 功能描述:VS1003软复位及初始化(设置时钟频率及音量)
- 隶属模块:VS1003B模块
- 函数属性:外部,用户可调用
- 参数说明:无
- 返回说明:无
******************************************************************/
void VS_Reset()
{
CLR_VS_XRESET;
_delay_ms(1000);
SET_VS_XRESET; //硬件复位,XRESET低电平有效
_delay_ms(1000);
VS_Write_Reg(0x00,0x08,0x04);//软件复位,向0号寄存器写入0x0804 SM_SDINEW为1 SM_RESET为1
VS_Write_Reg(0x03,0x98,0x00);//时钟设置,向3号寄存器写入0x9800 SC_MULT 为4 SC_ADD 为3 SC_FREQ为0
VS_Write_Reg(0x0b,0x00,0x00);//音量设置,左右声道均最大音量
CLR_VS_XDCS; //打开数据片选,注意此时XCS(片选)为高电平,SDI有效
SPI_RW(0); //写入数据,这里写入4个0,是无关数据,用来启动数据传输
SPI_RW(0);
SPI_RW(0);
SPI_RW(0);
SET_VS_XDCS; //关闭数据片选,SDI无效
}
/******************************************************************
- 功能描述:向VS1003写入一个字节的音频数据(即用于播放的数据)
注:调用前先将VS_XDCS置为0,打开数据片选
- 隶属模块:VS1003B模块
- 函数属性:外部,用户可调用
- 参数说明:dat是要写入的字节
- 返回说明:无
******************************************************************/
void VS_Send_Dat(unsigned char dat)
{
//SET_VS_DREQ;
while( (VS_PIN&(1<<VS_DREQ)) == 0); //VS1003的DREQ为高才能写入数据
SPI_RW(dat);//通过SPI向VS1003写入一个字节的音频数据
}
/******************************************************************
- 功能描述:向VS1003写入2048个0,用于清空VS1003的数据缓冲区
注:在播放完一个完整的音频(如一首完整的MP3)后,调用
此函数,清空VS1003数据缓冲区,为下面的音频数据(如下
一首MP3)作准备。
- 隶属模块:VS1003B模块
- 函数属性:外部,用户可调用
- 参数说明:无
- 返回说明:无
******************************************************************/
void VS_Flush_Buffer()
{
unsigned int i;
SET_VS_XDCS; //打开数据片选,即开启SDI传输
for(i=0;i<2048;i++)
{
VS_Send_Dat(0);
}
SET_VS_XDCS; //关闭数据片选
}
/******************************************************************
- 功能描述:正弦测试,这是测试VS1003芯片是否正常的有效手段!!
- 隶属模块:VS1003B模块
- 函数属性:外部,用户可调用
- 参数说明:x决定了正弦测试中产生的正弦波的频率,直接影响听到的
声音的频率
- 返回说明:无
******************************************************************/
void VS_sin_test(unsigned char x)
{
VS_Write_Reg(0x00,0x08,0x20);//启动测试,向0号寄存器写入0x0820 SM_SDINEW为1 SM_TEST为1
//SET_VS_DREQ;
while( (VS_PIN&(1<<VS_DREQ)) == 0); //等待DREQ变为高电平
CLR_VS_XDCS; //打开数据片选 SDI有效
SPI_RW(0x53);//写入以下8个字节,进入正弦测试
SPI_RW(0xef);
SPI_RW(0x6e);
SPI_RW(x); //参数x用来调整正弦测试中正弦波的频率 FsIdx (b7~b5):采样率表索引 S (b4~b0):正弦波的跃速 频率F=Fs X S / 128
SPI_RW(0); //比如x=126 (0b 011 11110) FsIdx=011=3 Fs=22050Hz S=11110=30 F=22050Hz X 30 /128 =5168 Hz
SPI_RW(0);
SPI_RW(0);
SPI_RW(0);
_delay_ms(60000); //这里延时一段时间,为了听到“正弦音”
SPI_RW(0x45);//写入以下8个字节,退出正弦测试
SPI_RW(0x78);
SPI_RW(0x69);
SPI_RW(0x74);
SPI_RW(0);
SPI_RW(0);
SPI_RW(0);
SPI_RW(0);
SET_VS_XDCS; //关闭数据片选 ,SDI无效
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -