📄 vs1003.c
字号:
//文件名:vs1003.c
//功能:vs1003 的底层驱动程序,主控芯片为LPC213x;
// 其他的微处理器(带SPI接口的)只需稍加修改即可适用;
// 对于不带硬SPI接口的微处理器可以用IO进行SPI的时序模拟
// 更多代码敬请访问www.icdev.com.cn
#include "vs1003.h"
#include "timer.h"
extern long volatile timeval; //用于延时的全局变量
/**********************************************************/
/* 函数名称 : MSPI_Init */
/* 函数功能 : 初始化SPI接口,设置为主机。 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*--------------------------------------------------------*/
void MSPI_Init(void)
{
PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00005500; //选择 SPI
S0SPCCR = 0x08; // SPI 时钟设置
S0SPCR = (0 << 3) | // CPHA = 0,
(0 << 4) | // CPOL = 0,
(1 << 5) | // MSTR = 1,
(0 << 6) | // LSBF = 0,
(0 << 7); // SPIE = 0,
}
/**********************************************************/
/* 函数名称 : InitPortVS1003 */
/* 函数功能 : MCU与vs1003接口的初始化 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*--------------------------------------------------------*/
void InitPortVS1003(void)
{
MSPI_Init();//SPI口的初始化
IO0DIR &= 0xbfffffff; //其他接口线的设置,其中dreq 为输入口
IO0DIR |= MP3_XRESET | MP3_XCS | MP3_XDCS;//xRESET,xCS,xDS均为输出口
IO0SET |= MP3_XRESET | MP3_XCS | MP3_XDCS;//xRESET,xCS,xDS默认输出高电平
}
/**********************************************************/
/* 函数名称 : SPIPutChar */
/* 函数功能 : 通过SPI发送一个字节的数据 */
/* 参数 : 待发送的字节数据 */
/* 返回值 : 无 */
/*--------------------------------------------------------*/
void SPIPutChar(unsigned char c)
{
S0SPDR = c;
while((S0SPSR & 0x80) == 0); //等待SPI将数据发送完毕
}
/**********************************************************/
/* 函数名称 : Mp3SoftReset */
/* 函数功能 : vs1003软件复位 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*--------------------------------------------------------*/
void Mp3SoftReset(void)
{
Mp3WriteRegister (SPI_MODE, 0x08, 0x04); //软件复位
wait(1); //延时1ms
while (IO0PIN & MP3_DREQ == 0); //等待软件复位结束
Mp3WriteRegister(SPI_CLOCKF, 0x98, 0x00);//设置vs1003的时钟,3倍频
Mp3WriteRegister (SPI_AUDATA, 0xBB, 0x81); //采样率48k,立体声
Mp3WriteRegister(SPI_BASS, 0x00, 0x55);//设置重音
Mp3SetVolume(20,20);//设置音量
wait(1); //延时1ms
//向vs1003发送4个字节无效数据,用以启动SPI发送
Mp3SelectData();
SPIPutChar(0);
SPIPutChar(0);
SPIPutChar(0);
SPIPutChar(0);
Mp3DeselectData();
}
/**********************************************************/
/* 函数名称 : Mp3Reset */
/* 函数功能 : vs1003硬件复位 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*--------------------------------------------------------*/
void Mp3Reset(void)
{
Mp3PutInReset();//xReset = 0 复位vs1003
wait(100);//延时100ms
SPIPutCharWithoutWaiting(0xff);//发送一个字节的无效数据,启动SPI传输
Mp3DeselectControl(); //xCS = 1
Mp3DeselectData(); //xDCS = 1
Mp3ReleaseFromReset(); //xRESET = 1
wait(100); //延时100ms
while (IO0PIN & MP3_DREQ == 0);//等待DREQ为高
wait(100); //延时100ms
Mp3SetVolume(10,10);
Mp3SoftReset();//vs1003软复位
}
/***********************************************************/
/* 函数名称 : VsSineTest */
/* 函数功能 : vs1003正弦测试,将该函数放在while循环中, */
/* 如果能持续听到一高一低的声音,证明测试通过 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*---------------------------------------------------------*/
void VsSineTest(void)
{
Mp3PutInReset(); //xReset = 0 复位vs1003
wait(100); //延时100ms
SPIPutChar(0xff);//发送一个字节的无效数据,启动SPI传输
Mp3DeselectControl();
Mp3DeselectData();
Mp3ReleaseFromReset();
wait(100);
Mp3WriteRegister(SPI_MODE,0x08,0x20);//进入vs1003的测试模式
while (IO0PIN & MP3_DREQ == 0); //等待DREQ为高
Mp3SelectData(); //xDCS = 1,选择vs1003的数据接口
//向vs1003发送正弦测试命令:0x53 0xef 0x6e n 0x00 0x00 0x00 0x00
//其中n = 0x24, 设定vs1003所产生的正弦波的频率值,具体计算方法见vs1003的datasheet
SPIPutChar(0x53);
SPIPutChar(0xef);
SPIPutChar(0x6e);
SPIPutChar(0x24);
SPIPutChar(0x00);
SPIPutChar(0x00);
SPIPutChar(0x00);
SPIPutChar(0x00);
wait(500);
Mp3DeselectData();//程序执行到这里后应该能从耳机听到一个单一频率的声音
//退出正弦测试
Mp3SelectData();
SPIPutChar(0x45);
SPIPutChar(0x78);
SPIPutChar(0x69);
SPIPutChar(0x74);
SPIPutChar(0x00);
SPIPutChar(0x00);
SPIPutChar(0x00);
SPIPutChar(0x00);
wait(500);
Mp3DeselectData();
//再次进入正弦测试并设置n值为0x44,即将正弦波的频率设置为另外的值
Mp3SelectData();
SPIPutChar(0x53);
SPIPutChar(0xef);
SPIPutChar(0x6e);
SPIPutChar(0x44);
SPIPutChar(0x00);
SPIPutChar(0x00);
SPIPutChar(0x00);
SPIPutChar(0x00);
wait(500);
Mp3DeselectData();
//退出正弦测试
Mp3SelectData();
SPIPutChar(0x45);
SPIPutChar(0x78);
SPIPutChar(0x69);
SPIPutChar(0x74);
SPIPutChar(0x00);
SPIPutChar(0x00);
SPIPutChar(0x00);
SPIPutChar(0x00);
wait(500);
Mp3DeselectData();
}
/*************************************************************/
/* 函数名称 : Mp3WriteRegister */
/* 函数功能 : 写vs1003寄存器 */
/* 参数 : 寄存器地址,待写数据的高8位,待写数据的低8位 */
/* 返回值 : 无 */
/*-----------------------------------------------------------*/
void Mp3WriteRegister(unsigned char addressbyte, unsigned char highbyte, unsigned char lowbyte)
{
Mp3DeselectData();
Mp3SelectControl();//XCS = 0
SPIPutChar(VS_WRITE_COMMAND); //发送写寄存器命令
SPIPutChar(addressbyte); //发送寄存器的地址
SPIPutChar(highbyte); //发送待写数据的高8位
SPIPutChar(lowbyte); //发送待写数据的低8位
Mp3DeselectControl();
}
/*************************************************************/
/* 函数名称 : Mp3ReadRegister */
/* 函数功能 : 写vs1003寄存器 */
/* 参数 : 寄存器地址 */
/* 返回值 : vs1003的16位寄存器的值 */
/*-----------------------------------------------------------*/
unsigned int Mp3ReadRegister(unsigned char addressbyte)
{
unsigned int resultvalue = 0;
Mp3DeselectData();
Mp3SelectControl();//XCS = 0
SPIPutChar(VS_READ_COMMAND); //发送读寄存器命令
SPIPutChar((addressbyte)); //发送寄存器的地址
SPIPutChar(0xff); //发送读时钟
resultvalue = (SPI_RESULT_BYTE) << 8;//读取高8位数据
SPIPutChar(0xff); //发送读时钟
resultvalue |= (SPI_RESULT_BYTE); //读取低8位数据
Mp3DeselectControl();
return resultvalue; //返回16位寄存器的值
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -