/*
* MP3模块测试程序
*
* 用途:MP3模块测试程序
* vs1003 的硬件测试程序,主控芯片为STC12LE5A60S2
* 其他的微处理器(带SPI接口的)只需稍加修改即可适用
* 对于不带硬SPI接口的微处理器可以用IO进行SPI的时序模拟
*
* 作者 日期 备注
* Huafeng Lin 20010/09/10 新增
* Huafeng Lin 20010/09/10 修改
*
*/
//针对SD卡读写板调整引脚
#include <avr/io.h>
#include "vs1003h.h"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define bool bit
#define true 1
#define flase 0
#define uint8 unsigned char
//#define PORT PORTA
#define MP3_XRESET 0
#define MP3_XCS 1
#define MP3_XDCS 2
#define MP3_DREQ 3
#define c_SPI_SI 4
#define c_SPI_SO 5
#define CLK 6
#define MP3_DREQset (PORTA|=(1<<(MP3_DREQ)))
#define MP3_DREQclr (PORTA&=(~(1<<(MP3_DREQ))))
#define Mp3PutInReset (PORTA&=(~(1<<(MP3_XRESET ))))
#define Mp3ReleaseFromReset (PORTA|=(1<<(MP3_XRESET)))
#define Mp3SelectControl (PORTA&=(~(1<<(MP3_XCS))))
#define Mp3DeselectControl (PORTA|=(1<<(MP3_XCS)))
#define Mp3SelectData (PORTA&=(~(1<<(MP3_XDCS))))
#define Mp3DeselectData (PORTA|=(1<<(MP3_XDCS)))
#define SI_High (PORTA|=(1<<(c_SPI_SI)))
#define SI_Low (PORTA&=(~(1<<(c_SPI_SI))))
#define SO_High (PORTA|=(1<<(c_SPI_SO)))
#define SO_Low (PORTA&=(~(1<<(c_SPI_SO))))
#define CLK_High (PORTA|=(1<<(CLK)))
#define CLK_Low (PORTA&=(~(1<<(CLK))))
void wait(unsigned char ucDelayCount)
{
uchar ucTempCount;
uchar uci;
for(ucTempCount=0; ucTempCount<ucDelayCount; ucTempCount++)
{
// uci = 200; //Err
// uci = 250; //OK
uci = 230;
while(uci--)
{
;
}
}
}
/**********************************************************/
/* 函数名称 : SPIPutChar */
/* 函数功能 : 通过SPI发送一个字节的数据 */
/* 参数 : 待发送的字节数据 */
/* 返回值 : 无 */
/*--------------------------------------------------------*/
void SPIPutChar(unsigned char ucSendData)
{
//S0SPDR = c;
//while((S0SPSR & 0x80) == 0); //等待SPI将数据发送完毕
// SPDR = ucSendData;
//while (!(SPSR & 0x80));
uchar ucCount;
uchar ucMaskCode;
ucMaskCode = 0x80;
for(ucCount=0; ucCount<8; ucCount++)
{
CLK_Low;
if(ucMaskCode & ucSendData)
{
SI_High;
}
else
{
SI_Low;
}
CLK_High;
ucMaskCode >>= 1;
}
}
/*************************************************************/
/* 函数名称 : Mp3WriteRegister */
/* 函数功能 : 写vs1003寄存器 */
/* 参数 : 寄存器地址,待写数据的高8位,待写数据的低8位 */
/* 返回值 : 无 */
/*-----------------------------------------------------------*/
void Mp3WriteRegister(unsigned char addressbyte, unsigned char highbyte, unsigned char lowbyte)
{
//Mp3DeselectData();
MP3_DREQset;
while (MP3_DREQ == 0);
Mp3SelectControl;//XCS = 0
SPIPutChar(0x02); //发送写寄存器命令
SPIPutChar(addressbyte); //发送寄存器的地址
SPIPutChar(highbyte); //发送待写数据的高8位
SPIPutChar(lowbyte); //发送待写数据的低8位
Mp3DeselectControl; //XCS=1
}
/**********************************************************/
/* 函数名称 : Mp3Reset */
/* 函数功能 : vs1003硬件复位 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*--------------------------------------------------------*/
void Mp3Reset(void)
{
Mp3PutInReset;//xReset = 0 复位vs1003
wait(200);//延时100ms
SPIPutChar(0xff);//发送一个字节的无效数据,启动SPI传输
Mp3DeselectControl; //xCS = 1
Mp3DeselectData; //xDCS = 1
Mp3ReleaseFromReset; //xRESET = 1
wait(200);
Mp3WriteRegister (0x00, 0x08, 0x04); //软件复位
wait(200); //延时100ms
MP3_DREQset;
while (MP3_DREQ == 0);
Mp3WriteRegister(0x03, 0x98, 0x00);//设置vs1003的时钟,3倍频
wait(20); //延时100ms
Mp3WriteRegister (0x05, 0xBB, 0x81); //采样率48k,立体声
wait(20); //延时100ms
Mp3WriteRegister(0x02, 0x00, 0x55);//设置重音
wait(20); //延时100ms
Mp3SetVolume(50,50);//设置音量
wait(5); //延时1ms
//延时100ms
//向vs1003发送4个字节无效数据,用以启动SPI发送
SPIPutChar(0);
SPIPutChar(0);
SPIPutChar(0);
SPIPutChar(0);
}
void VS1003B_WriteCMD(unsigned char addr, unsigned int dat)
{
/*
VS1003B_XDCS_H();
VS1003B_XCS_L();
VS1003B_WriteByte(0x02);
//delay_Nus(20);
VS1003B_WriteByte(addr);
VS1003B_WriteByte(dat>>8);
VS1003B_WriteByte(dat);
//delay_Nus(200);
VS1003B_XCS_H();
*/
Mp3WriteRegister(addr,dat>>8,dat);
}
void VS1003B_SoftReset()
{
VS1003B_WriteCMD(0x00,0x0804);//写复位
// VS1003B_Delay(0xffff);//延时,至少1.35ms
wait(2);
}
int CheckVS1003B_DRQ(void)
{
int bResult;
bResult =MP3_DREQ;
return(bResult);
}
/***********************************************************/
/* 函数名称 : VsSineTest */
/* 函数功能 : vs1003正弦测试,将该函数放在while循环中, */
/* 如果能持续听到一高一低的声音,证明测试通过 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*---------------------------------------------------------*/
void VsSineTest(void)
{
Mp3PutInReset; //xReset = 0 复位vs1003
wait(200); //延时100ms
SPIPutChar(0xff);//发送一个字节的无效数据,启动SPI传输
Mp3DeselectControl; //XCS=1
Mp3DeselectData; //XDCS=1
Mp3ReleaseFromReset; //xReset = 1
wait(200);
Mp3SetVolume(50,50);
Mp3WriteRegister(0x00,0x08,0x20);//进入vs1003的测试模式
while (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);
wait(250);
wait(250);
Mp3DeselectData;//程序执行到这里后应该能从耳机听到一个单一频率的声音
//退出正弦测试
Mp3SelectData;
SPIPutChar(0x45);
SPIPutChar(0x78);
SPIPutChar(0x69);
SPIPutChar(0x74);
SPIPutChar(0x00);
SPIPutChar(0x00);
SPIPutChar(0x00);
SPIPutChar(0x00);
// wait(500);
wait(250);
wait(250);
Mp3DeselectData;
//再次进入正弦测试并设置n值为0x44,即将正弦波的频率设置为另外的值
Mp3SelectData;
SPIPutChar(0x53);
SPIPutChar(0xef);
SPIPutChar(0x6e);
SPIPutChar(0x44);
SPIPutChar(0x00);
SPIPutChar(0x00);
SPIPutChar(0x00);
SPIPutChar(0x00);
// wait(500);
wait(250);
wait(250);
Mp3DeselectData;
//退出正弦测试
Mp3SelectData;
SPIPutChar(0x45);
SPIPutChar(0x78);
SPIPutChar(0x69);
SPIPutChar(0x74);
SPIPutChar(0x00);
SPIPutChar(0x00);
SPIPutChar(0x00);
SPIPutChar(0x00);
// wait(500);
wait(250);
wait(250);
Mp3DeselectData;
}
/*
void open_mp3()
{
int i=0;
Mp3Reset();
MP3_XDCS=0;
while(1)
{
MP3_DREQ=1;
while(!MP3_DREQ);
SPIPutChar(MusicData[i]);
i++;
}
}
*/
|