VS1053的应用其实非常简单,基本的步骤如下:
1. 编写好SPI总线驱动代码;
2. 编写好VS1053初始化代码;
3. 编写正弦波测试代码;
4. 内存测试代码。
完成以上几个步骤后就可以进行MP3解码了。
/**************************************************************************************
* FunctionName: VS1053SineTest()
* Description : 正弦波测试
* EntryParameter: freq - 测试频率 0x24,0x44等
* ReturnValue : None
**************************************************************************************/
void VS1053SineTest(uint8 freq)
{
uint8 i;
uint8 test[] = {0x53, 0xEF, 0x6E, 0x24, 0x00, 0x00, 0x00, 0x00}; // 向vs发送正弦测试命令
uint8 back[] = {0x45, 0x78, 0x69, 0x74, 0x00, 0x00, 0x00, 0x00}; // 向vs发送退出测试命令
VS_XRESET_CLR(); // xreset = 0
VS1053_Delay(100);
SSP1Send(0xFF); // 发送一个字节的无效数据,启动SPI传输
VS_CS_SET(); // cs = 1
VS_XDCS_SET(); // xdcs = 1
VS_XRESET_SET(); // xreset = 1
VS1053_Delay(100);
VS1053WriteReg(VS_SCI_MODE, 0x0820); // enter vs1003 test model
while (VS_DREQ_PIN() == 0); // wait for DREQ Highlevel
GPIOSetValue(1, 2, 0); // xdcs = 0
test[3] = freq; // 写入频率
for (i=0; i<8; i++)
{
VS1053WriteData(test
); // 程序执行到这里后应该能从耳机听到一个单一频率的声音
}
VS_XDCS_SET(); // xdcs = 1
VS1053_Delay(100000);
GPIOSetValue(1, 2, 0); // xdcs = 0
for (i=0; i<8; i++)
{
VS1053WriteData(back); // 退出正弦测试
}
VS_XDCS_SET(); // xdcs = 1
VS1053_Delay(200);
}
/**************************************************************************************
* FunctionName: VS1053RamTest()
* Description : 内存测试,0x8000表示测试完成,0x83FF表示完好
* EntryParameter: None
* ReturnValue : 完好返回0,否则返回1
**************************************************************************************/
uint8 VS1053RamTest(void)
{
uint16 res = 0x0000;
uint8 i;
uint8 test[] = {0x4D, 0xEA, 0x6D, 0x54, 0x00, 0x00, 0x00, 0x00}; //
VS_XRESET_CLR(); // xreset = 0
VS1053_Delay(100);
SSP1Send(0xFF);
VS_CS_SET(); // cs = 1
VS_XDCS_SET(); // xdcs = 1
VS_XRESET_SET(); // xreset = 1
VS1053_Delay(100);
VS1053WriteReg(VS_SCI_MODE, 0x0820); // Allow SCI tests
while (VS_DREQ_PIN() == 0); // wait for DREQ Highlevel
//After this sequence wait for 1100000 clock cycles.
//The result can be read from the SCI register SCL_HDATA0
GPIOSetValue(1, 2, 0); // xdcs = 0
for (i=0; i<8; i++)
{
VS1053WriteData(test); // 写入测试代码
}
VS_XDCS_SET(); // xdcs = 1
VS1053_Delay(10000);
res = VS1053ReadReg(VS_SCI_HDAT0); // 如果得到的值为0x83FF,则表明完好。
return ((res == 0x83FF) ? 0: 1); // 返回测试结果
}
/**************************************************************************************
* FunctionName: VS1053Play()
* Description : MP3播放
* EntryParameter: None
* ReturnValue : None
**************************************************************************************/
uint8 VS1053Play(uint8 *mp3File)
{
uint8 i, key = 0, pauseFlag = 0;
uint16 k;
FATFS fs; /*Work area (file system object) for logical drive*/
FIL file; /*file objects*/
UINT br; /*File R/W count*/
FRESULT res;
/*Register a work area for logical drive 0*/
f_mount(0, &fs);
/*Create file*/
res = f_open(&file, (const TCHAR *)mp3File, FA_OPEN_EXISTING|FA_READ);
if (res == FR_OK)
{
while (1)
{
res = f_read(&file, MMCBuf, 512, &br);
k = 0;
do
{
if (VS_DREQ_PIN() == 1) // 判断VS是否空闲
{
for (i=0; i<32; i++)
{
VS1053WriteData(MMCBuf[k++]); // 发送MP3数据
}
}
} while (k < 511);
if ((res != FR_OK) || (br < 512)) // 判断数据是否读完
{
break;
}
}
}
/*Close all files*/
f_close(&file); // 关闭文件,必须和f_open函数成对出现
/*Unregister a work area before discard it*/
f_mount(0, 0);
return key; // 返回
}
VS1053的应用其实非常简单,基本的步骤如下:
1. 编写好SPI总线驱动代码;
2. 编写好VS1053初始化代码;
3. 编写正弦波测试代码;
4. 内存测试代码。
完成以上几个步骤后就可以进行MP3解码了。
/**************************************************************************************
* FunctionName: VS1053SineTest()
* Description : 正弦波测试
* EntryParameter: freq - 测试频率 0x24,0x44等
* ReturnValue : None
**************************************************************************************/
void VS1053SineTest(uint8 freq)
{
uint8 i;
uint8 test[] = {0x53, 0xEF, 0x6E, 0x24, 0x00, 0x00, 0x00, 0x00}; // 向vs发送正弦测试命令
uint8 back[] = {0x45, 0x78, 0x69, 0x74, 0x00, 0x00, 0x00, 0x00}; // 向vs发送退出测试命令
VS_XRESET_CLR(); // xreset = 0
VS1053_Delay(100);
SSP1Send(0xFF); // 发送一个字节的无效数据,启动SPI传输
VS_CS_SET(); // cs = 1
VS_XDCS_SET(); // xdcs = 1
VS_XRESET_SET(); // xreset = 1
VS1053_Delay(100);
VS1053WriteReg(VS_SCI_MODE, 0x0820); // enter vs1003 test model
while (VS_DREQ_PIN() == 0); // wait for DREQ Highlevel
GPIOSetValue(1, 2, 0); // xdcs = 0
test[3] = freq; // 写入频率
for (i=0; i<8; i++)
{
VS1053WriteData(test); // 程序执行到这里后应该能从耳机听到一个单一频率的声音
}
VS_XDCS_SET(); // xdcs = 1
VS1053_Delay(100000);
GPIOSetValue(1, 2, 0); // xdcs = 0
for (i=0; i<8; i++)
{
VS1053WriteData(back); // 退出正弦测试
}
VS_XDCS_SET(); // xdcs = 1
VS1053_Delay(200);
}
/**************************************************************************************
* FunctionName: VS1053RamTest()
* Description : 内存测试,0x8000表示测试完成,0x83FF表示完好
* EntryParameter: None
* ReturnValue : 完好返回0,否则返回1
**************************************************************************************/
uint8 VS1053RamTest(void)
{
uint16 res = 0x0000;
uint8 i;
uint8 test[] = {0x4D, 0xEA, 0x6D, 0x54, 0x00, 0x00, 0x00, 0x00}; //
VS_XRESET_CLR(); // xreset = 0
VS1053_Delay(100);
SSP1Send(0xFF);
VS_CS_SET(); // cs = 1
VS_XDCS_SET(); // xdcs = 1
VS_XRESET_SET(); // xreset = 1
VS1053_Delay(100);
VS1053WriteReg(VS_SCI_MODE, 0x0820); // Allow SCI tests
while (VS_DREQ_PIN() == 0); // wait for DREQ Highlevel
//After this sequence wait for 1100000 clock cycles.
//The result can be read from the SCI register SCL_HDATA0
GPIOSetValue(1, 2, 0); // xdcs = 0
for (i=0; i<8; i++)
{
VS1053WriteData(test); // 写入测试代码
}
VS_XDCS_SET(); // xdcs = 1
VS1053_Delay(10000);
res = VS1053ReadReg(VS_SCI_HDAT0); // 如果得到的值为0x83FF,则表明完好。
return ((res == 0x83FF) ? 0: 1); // 返回测试结果
}
/**************************************************************************************
* FunctionName: VS1053Play()
* Description : MP3播放
* EntryParameter: None
* ReturnValue : None
**************************************************************************************/
uint8 VS1053Play(uint8 *mp3File)
{
uint8 i, key = 0, pauseFlag = 0;
uint16 k;
FATFS fs; /*Work area (file system object) for logical drive*/
FIL file; /*file objects*/
UINT br; /*File R/W count*/
FRESULT res;
/*Register a work area for logical drive 0*/
f_mount(0, &fs);
/*Create file*/
res = f_open(&file, (const TCHAR *)mp3File, FA_OPEN_EXISTING|FA_READ);
if (res == FR_OK)
{
while (1)
{
res = f_read(&file, MMCBuf, 512, &br);
k = 0;
do
{
if (VS_DREQ_PIN() == 1) // 判断VS是否空闲
{
for (i=0; i<32; i++)
{
VS1053WriteData(MMCBuf[k++]); // 发送MP3数据
}
}
} while (k < 511);
if ((res != FR_OK) || (br < 512)) // 判断数据是否读完
{
break;
}
}
}
/*Close all files*/
f_close(&file); // 关闭文件,必须和f_open函数成对出现
/*Unregister a work area before discard it*/
f_mount(0, 0);
return key; // 返回
}
举报