📄 vs1003.c
字号:
//文件名:vs1003.c
//功能:vs1003 的底层驱动程序,主控芯片为LPC21xx;
// 其他的微处理器(带SPI接口的)只需稍加修改即可适用;
// 对于不带硬SPI接口的微处理器可以用IO进行SPI的时序模拟
#include "vs1003.h"
#include "..\SPI\spi.h"
/**********************************************************/
/* 函数名称 : MSCI_Init */
/* 函数功能 : 初始化SPI接口,设置为主机。 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*--------------------------------------------------------*/
void MSCI_Init(void)
{
PINSEL0 = (PINSEL0 & (~(0xFF << 8))) | (0x15 << 8); //选择 SPI
S0SPCCR = 0x10; // SPI 时钟设置
S0SPCR = (0 << 3) | // CPHA = 0,
(0 << 4) | // CPOL = 0,
(1 << 5) | // MSTR = 1,
(0 << 6) | // LSBF = 0,
(0 << 7); // SPIE = 1,
}
/**********************************************************/
/* 函数名称 : InitPortVS1003 */
/* 函数功能 : MCU与vs1003接口的初始化 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*--------------------------------------------------------*/
void InitPortVS1003(void)
{
FIO0DIR &= 0xFFFFFFFF & (~(uint32)MP3_DREQ); //其他接口线的设置,其中dreq 为输入口
FIO0DIR |= MP3_XRESET | MP3_XCS | MP3_XDCS;//xRESET,xCS,xDS均为输出口
FIO0SET |= MP3_XRESET | MP3_XCS | MP3_XDCS;//xRESET,xCS,xDS默认输出高电平
}
/**********************************************************/
/* 函数名称 : SPIPutChar */
/* 函数功能 : 通过SPI发送一个字节的数据 */
/* 参数 : 待发送的字节数据 */
/* 返回值 : 无 */
/*--------------------------------------------------------*/
void SPIPutChar(uint8 c)
{
SPI_SEND_BYTE = c;
SPIWait(); //等待SPI将数据发送完毕
}
/**********************************************************/
/* 函数名称 : Mp3SoftReset */
/* 函数功能 : vs1003软件复位 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*--------------------------------------------------------*/
void Mp3SoftReset(void)
{
uint8 temp;
Mp3WriteRegister (SCI_MODE, 0x08, 0x04); //软件复位
OSTimeDly(OS_TICKS_PER_SEC / 100); //延时1ms
DREQWait(); //等待软件复位结束
Mp3WriteRegister(SCI_CLOCKF, 0x98, 0x00); //设置vs1003的时钟,3倍频
Mp3WriteRegister (SCI_AUDATA, 0xBB, 0x81); //采样率48k,立体声
Mp3WriteRegister(SCI_BASS, 0x00, 0x55); //设置重音
Mp3SetVolume(0x00, 0x00); //设置音量
OSTimeDly(OS_TICKS_PER_SEC / 100); //延时1ms
//向vs1003发送4个字节无效数据,用以启动SPI发送
SPIStart();
Mp3SelectData();
SPIRW(&temp, 0);
SPIRW(&temp, 0);
SPIRW(&temp, 0);
SPIRW(&temp, 0);
Mp3DeselectData();
SPIEnd();
}
/**********************************************************/
/* 函数名称 : Mp3Reset */
/* 函数功能 : vs1003硬件复位 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*--------------------------------------------------------*/
void Mp3Reset(void)
{
uint8 temp;
Mp3PutInReset();//xReset = 0 复位vs1003
OSTimeDly(OS_TICKS_PER_SEC / 10);//延时100ms
SPIStart();
SPIRW(&temp, 0xFF);//发送一个字节的无效数据,启动SPI传输
Mp3DeselectControl(); //xCS = 1
Mp3DeselectData(); //xDCS = 1
SPIEnd();
Mp3ReleaseFromReset(); //xRESET = 1
OSTimeDly(OS_TICKS_PER_SEC / 10); //延时100ms
DREQWait(); //等待DREQ为高
OSTimeDly(OS_TICKS_PER_SEC / 10); //延时100ms
Mp3SetVolume(0xFE, 0xFE);
Mp3SoftReset();//vs1003软复位
}
/***********************************************************/
/* 函数名称 : VsSineTest */
/* 函数功能 : vs1003正弦测试,将该函数放在while循环中, */
/* 如果能持续听到一高一低的声音,证明测试通过 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*---------------------------------------------------------*/
void VsSineTest(void)
{
uint8 temp;
Mp3PutInReset(); //xReset = 0 复位vs1003
OSTimeDly(OS_TICKS_PER_SEC / 10); //延时100ms
SPIStart();
SPIRW(&temp, 0xFF);//发送一个字节的无效数据,启动SPI传输
Mp3DeselectControl();
Mp3DeselectData();
SPIEnd();
Mp3ReleaseFromReset();
OSTimeDly(OS_TICKS_PER_SEC / 10);;
Mp3WriteRegister(SCI_MODE,0x08,0x20);//进入vs1003的测试模式
DREQWait(); //等待DREQ为高
//向vs1003发送正弦测试命令:0x53 0xef 0x6e n 0x00 0x00 0x00 0x00
//其中n = 0x24, 设定vs1003所产生的正弦波的频率值,具体计算方法见vs1003的datasheet
SPIStart();
Mp3SelectData(); //xDCS = 1,选择vs1003的数据接口
SPIRW(&temp, 0x53);
SPIRW(&temp, 0xEF);
SPIRW(&temp, 0x6E);
SPIRW(&temp, 0x24);
SPIRW(&temp, 0x00);
SPIRW(&temp, 0x00);
SPIRW(&temp, 0x00);
SPIRW(&temp, 0x00);
Mp3DeselectData();//程序执行到这里后应该能从耳机听到一个单一频率的声音
SPIEnd();
OSTimeDly(OS_TICKS_PER_SEC / 2);;
//退出正弦测试
SPIStart();
Mp3SelectData();
SPIRW(&temp, 0x45);
SPIRW(&temp, 0x78);
SPIRW(&temp, 0x69);
SPIRW(&temp, 0x74);
SPIRW(&temp, 0x00);
SPIRW(&temp, 0x00);
SPIRW(&temp, 0x00);
SPIRW(&temp, 0x00);
Mp3DeselectData();
SPIEnd();
OSTimeDly(OS_TICKS_PER_SEC / 2);
//再次进入正弦测试并设置n值为0x44,即将正弦波的频率设置为另外的值
SPIStart();
Mp3SelectData();
SPIRW(&temp, 0x53);
SPIRW(&temp, 0xEF);
SPIRW(&temp, 0x6E);
SPIRW(&temp, 0x44);
SPIRW(&temp, 0x00);
SPIRW(&temp, 0x00);
SPIRW(&temp, 0x00);
SPIRW(&temp, 0x00);
Mp3DeselectData();
SPIEnd();
OSTimeDly(OS_TICKS_PER_SEC / 2);
//退出正弦测试
SPIStart();
Mp3SelectData();
SPIRW(&temp, 0x45);
SPIRW(&temp, 0x78);
SPIRW(&temp, 0x69);
SPIRW(&temp, 0x74);
SPIRW(&temp, 0x00);
SPIRW(&temp, 0x00);
SPIRW(&temp, 0x00);
SPIRW(&temp, 0x00);
Mp3DeselectData();
SPIEnd();
OSTimeDly(OS_TICKS_PER_SEC / 2);
}
/*************************************************************/
/* 函数名称 : Mp3WriteRegister */
/* 函数功能 : 写vs1003寄存器 */
/* 参数 : 寄存器地址,待写数据的高8位,待写数据的低8位 */
/* 返回值 : 无 */
/*-----------------------------------------------------------*/
void Mp3WriteRegister(uint8 addressbyte, uint8 highbyte, uint8 lowbyte)
{
uint8 temp;
SPIStart();
Mp3DeselectData();
Mp3SelectControl(); //XCS = 0
SPIRW(&temp, VS_WRITE_COMMAND); //发送写寄存器命令
SPIRW(&temp, addressbyte); //发送寄存器的地址
SPIRW(&temp, highbyte); //发送待写数据的高8位
SPIRW(&temp, lowbyte); //发送待写数据的低8位
Mp3DeselectControl();
SPIEnd();
}
/*************************************************************/
/* 函数名称 : Mp3ReadRegister */
/* 函数功能 : 写vs1003寄存器 */
/* 参数 : 寄存器地址 */
/* 返回值 : vs1003的16位寄存器的值 */
/*-----------------------------------------------------------*/
uint16 Mp3ReadRegister(uint8 addressbyte)
{
uint8 temp;
uint16 resultvalue = 0;
SPIStart();
Mp3DeselectData();
Mp3SelectControl(); //XCS = 0
SPIRW(&temp, VS_READ_COMMAND); //发送读寄存器命令
SPIRW(&temp, (addressbyte)); //发送寄存器的地址
SPIRW(&temp, 0xFF); //发送读时钟
resultvalue = temp << 8; //读取高8位数据
SPIRW(&temp, 0xFF); //发送读时钟
resultvalue |= temp; //读取低8位数据
Mp3DeselectControl();
SPIEnd();
return (resultvalue); //返回16位寄存器的值
}
void LoadPatch(){
uint16 i;
for (i=0; i < CODELEN; i++) {
Mp3WriteRegister(atab[i], dtab[i]>>8, dtab[i]&0xFF);
}
OSTimeDly(OS_TICKS_PER_SEC / 100);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -