⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vs1003.c

📁 FATFS(10.4).rar
💻 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 + -