📄 vs1003.c
字号:
#define IN_VS1003
#include "User.h"
#define SPI_EN 1
extern OS_EVENT *VS_Operation;
extern OS_EVENT *Uart0_Receive_data;
INT8U VS_OP;
INT32U ReadFlen;
INT8U LVolume=20,RVolume=20;
INT8U BassEnhanceValue=0x00,TrebleEnhanceValue=0x00;
extern INT8U MP3Handle;
/**********************************************************/
/* 函数名称 : SPI_Init */
/* 函数功能 : 初始化SPI接口,设置为主机。 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*--------------------------------------------------------*/
void SPI_Init(void)
{
#if SPI_EN > 0
PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00001500; //选择 SPI
S0SPCR = (0x00 << 3) | // CPHA = 0,
(0x00 << 4) | // CPOL = 0,
(0x01 << 5) | // MSTR = 1,SPI 处于主模式
(0x00 << 6) | // LSBF = 0,SPI据传输MSB(bit7)在先
(0x00 << 7); // SPIE = 0,SPI中断禁止
S0SPCCR = 8; //SPI 时钟预分频(PCLK/8)
#else
IODIR0 |= SCLK | MOSI ;
IODIR0 &= (~ MISO);
#endif
}
/**********************************************************/
/* 函数名称 : InitPortVS1003 */
/* 函数功能 : MCU与vs1003接口的初始化 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*--------------------------------------------------------*/
void InitPortVS1003(void)
{
SPI_Init();//SPI口的初始化
SPI_SendData(0xff);
IODIR0 &=(~ MP3_DREQ); //其他接口线的设置,其中dreq 为输入口
IODIR0 |= MP3_XRESET | MP3_XCS | MP3_XDCS;//xRESET,xCS,xDS均为输出口
IOSET0 |= MP3_XRESET | MP3_XCS | MP3_XDCS;//xRESET,xCS,xDS默认输出高电平
}
/**********************************************************/
/* 函数名称 : SPI_SendData */
/* 函数功能 : 通过SPI发送一个字节的数据并接收一字节 */
/* 参数 : 待发送的字节数据 */
/* 返回值 : 接收到的数据 */
/*--------------------------------------------------------*/
INT8U SPI_SendData(INT8U data)
{
#if SPI_EN == 0
INT8U i,j,temp,rev_data;
temp = data;
for(i = 0; i <= 7; i++)
{
IO0SET |= SCLK;
if(temp & 0x80)
IO0SET |= MOSI;
else
IO0CLR |= MOSI;
rev_data <<=1;
if(IO0PIN & MISO)
rev_data |= 0x01;
else
rev_data &= 0xFE;
for(j=8;j>0;j--);
IO0CLR |= SCLK;
for(j=8;j>0;j--);
temp <<= 1;
}
IO0SET |= SCLK;
return(rev_data) ;
#else
S0SPDR = data;
while((S0SPSR & 0x80) == 0); //等待SPI将数据发送完毕
return(S0SPDR);
#endif
}
/**********************************************************/
/* 函数名称 : Mp3SetVolume */
/* 函数功能 : 设置左右声道音量 */
/* 参数 : leftchannel-左声道 rightchannel-右声道 */
/* 返回值 : 无 */
/*--------------------------------------------------------*/
void Mp3SetVolume(INT8U leftchannel,INT8U rightchannel)
{
Mp3WriteRegister(SPI_VOL,(leftchannel),(rightchannel));
}
/**********************************************************/
/* 函数名称 : Mp3SoftReset */
/* 函数功能 : vs1003软件复位 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*--------------------------------------------------------*/
void Mp3SoftReset(void)
{
Mp3WriteRegister (SPI_MODE, 0x08, 0x04); //软件复位
OSTimeDly(OS_TICKS_PER_SEC/100); //延时10ms
while (IOPIN0 & MP3_DREQ == 0); //等待软件复位结束
Mp3WriteRegister(SPI_CLOCKF, 0x98, 0x00);//设置vs1003的时钟,3倍频
Mp3WriteRegister (SPI_AUDATA, 0xBB, 0x81); //采样率48k,立体声
Mp3WriteRegister(SPI_BASS, TrebleEnhanceValue, BassEnhanceValue);//设置重音
Mp3SetVolume(LVolume,RVolume);//设置音量
OSTimeDly(OS_TICKS_PER_SEC/100); //延时10ms
//向vs1003发送4个字节无效数据,用以启动SPI发送
Mp3SelectData();
SPI_SendData(0);
SPI_SendData(0);
SPI_SendData(0);
SPI_SendData(0);
Mp3DeselectData();
}
/**********************************************************/
/* 函数名称 : Mp3Reset */
/* 函数功能 : vs1003硬件复位 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*--------------------------------------------------------*/
void Mp3Reset(void)
{
Mp3PutInReset();//xReset = 0 复位vs1003
OSTimeDly(OS_TICKS_PER_SEC/100);//延时10ms
Mp3DeselectControl(); //xCS = 1
Mp3DeselectData(); //xDCS = 1
Mp3ReleaseFromReset(); //xRESET = 1
OSTimeDly(OS_TICKS_PER_SEC/100);//延时10ms
while (IOPIN0 & MP3_DREQ == 0);//等待DREQ为高
OSTimeDly(OS_TICKS_PER_SEC/10);//延时100ms
Mp3SoftReset();//vs1003软复位
}
/*************************************************************/
/* 函数名称 : Mp3WriteRegister */
/* 函数功能 : 写vs1003寄存器 */
/* 参数 : 寄存器地址,待写数据的高8位,待写数据的低8位 */
/* 返回值 : 无 */
/*-----------------------------------------------------------*/
void Mp3WriteRegister(INT8U addressbyte, INT8U highbyte, INT8U lowbyte)
{
Mp3DeselectData();
Mp3SelectControl();//XCS = 0
SPI_SendData(VS_WRITE_COMMAND); //发送写寄存器命令
SPI_SendData(addressbyte); //发送寄存器的地址
SPI_SendData(highbyte); //发送待写数据的高8位
SPI_SendData(lowbyte); //发送待写数据的低8位
Mp3DeselectControl();
}
/*************************************************************/
/* 函数名称 : Mp3ReadRegister */
/* 函数功能 : 写vs1003寄存器 */
/* 参数 : 寄存器地址 */
/* 返回值 : vs1003的16位寄存器的值 */
/*-----------------------------------------------------------*/
INT16U Mp3ReadRegister(INT8U addressbyte)
{
INT16U resultvalue = 0;
Mp3DeselectData();
Mp3SelectControl();//XCS = 0
SPI_SendData(VS_READ_COMMAND); //发送读寄存器命令
SPI_SendData((addressbyte));//发送寄存器的地址
resultvalue = (INT16U)(SPI_SendData(0xff) << 8);//读取高8位数据
resultvalue |= SPI_SendData(0xff); //读取低8位数据
Mp3DeselectControl();
return resultvalue; //返回16位寄存器的值
}
/***********************************************************/
/* 函数名称 : VsSineTest */
/* 函数功能 : vs1003正弦测试,将该函数放在while循环中, */
/* 如果能持续听到一高一低的声音,证明测试通过 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*---------------------------------------------------------*/
void VsSineTest(void)
{
Mp3PutInReset(); //xReset = 0 复位vs1003
OSTimeDly(OS_TICKS_PER_SEC/10); //延时100ms
SPI_SendData(0xff);//发送一个字节的无效数据,启动SPI传输
Mp3DeselectControl();
Mp3DeselectData();
Mp3ReleaseFromReset();
OSTimeDly(OS_TICKS_PER_SEC/10);
Mp3WriteRegister(SPI_MODE,0x08,0x20);//进入vs1003的测试模式
while (IO0PIN & MP3_DREQ == 0); //等待DREQ为高
Mp3SelectData(); //xDCS = 0,选择vs1003的数据接口
//向vs1003发送正弦测试命令:0x53 0xef 0x6e n 0x00 0x00 0x00 0x00
//其中n = 0x24, 设定vs1003所产生的正弦波的频率值,具体计算方法见vs1003的datasheet
SPI_SendData(0x53);
SPI_SendData(0xef);
SPI_SendData(0x6e);
SPI_SendData(0x24);
SPI_SendData(0x00);
SPI_SendData(0x00);
SPI_SendData(0x00);
SPI_SendData(0x00);
OSTimeDly(OS_TICKS_PER_SEC/2);
Mp3DeselectData();//程序执行到这里后应该能从个单一频率的声音
//退出正弦测试
Mp3SelectData();
SPI_SendData(0x45);
SPI_SendData(0x78);
SPI_SendData(0x69);
SPI_SendData(0x74);
SPI_SendData(0x00);
SPI_SendData(0x00);
SPI_SendData(0x00);
SPI_SendData(0x00);
OSTimeDly(OS_TICKS_PER_SEC/2);
Mp3DeselectData();
//再次进入正弦测试并设置n值为0x44,即将正弦波的频率设置为另外的值
Mp3SelectData();
SPI_SendData(0x53);
SPI_SendData(0xef);
SPI_SendData(0x6e);
SPI_SendData(0x44);
SPI_SendData(0x00);
SPI_SendData(0x00);
SPI_SendData(0x00);
SPI_SendData(0x00);
OSTimeDly(OS_TICKS_PER_SEC/2);
Mp3DeselectData();
//退出正弦测试
Mp3SelectData();
SPI_SendData(0x45);
SPI_SendData(0x78);
SPI_SendData(0x69);
SPI_SendData(0x74);
SPI_SendData(0x00);
SPI_SendData(0x00);
SPI_SendData(0x00);
SPI_SendData(0x00);
OSTimeDly(OS_TICKS_PER_SEC/2);
Mp3DeselectData();
}
void VS_Drive(INT8U Cammand)
{
INT8U temp;
INT16U i;
switch(Cammand)
{
case MP3CMD_Play:
if(IO0PIN & MP3_DREQ)
{
Mp3SelectData();
temp = ReadFileByte();
SPI_SendData(temp);
Mp3DeselectData();
ReadFlen += 1;
}
break;
case MP3CMD_Stop:
for(i=0; i < 2048;)
{
if(IO0PIN & MP3_DREQ)
{
Mp3SelectData();
SPI_SendData(0);
Mp3DeselectData();
i++;
}
}
MP3Handle = 0;
Mp3SoftReset();
break;
case MP3CMD_InitVS1003:
InitPortVS1003();
Mp3Reset();
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -