📄 myfution.c
字号:
/**************************************************************
* ARMSYS-P, LiYuTai elec.
*
* MMC Card functions
************************************************************/
#include "myfution.h"
#define MP3_ADDRESS 0xc090000 //存放音乐的起始地址
// unsigned char *MP3Buf;
volatile unsigned int MP3Size=0;
int dataLen;
extern int which_int;
extern int download_addr;
extern EnvParams Env;
//extern int data_len;
/*************************************************************/
// MMC Init function
//
// - flushes card receive buffer
// - selects card
// - sends the reset command
// - sends the initialization command, waits for card ready
// - queries card status
/*************************************************************/
void myfution(void)
{
// while(1)
// {
// Led_Display(0x01);
// Delay(1000);
// Led_Display(0x02);
// Delay(1000);
InitPortVS1003();
// Mp3Reset();
// VsSineTest();
Mp3Play();
// test_1011();
// }
}
//文件名:vs1003.c
//功能:vs1003 的底层驱动程序,主控芯片为LPC2103;
// 其他的微处理器(带SPI接口的)只需稍加修改即可适用;
// 对于不带硬SPI接口的微处理器可以用IO进行SPI的时序模拟
// 更多代码敬请访问www.icdev.com.cn
// #include "vs1003.h"
// #include "timer.h"
extern long volatile timeval; //用于延时的全局变量
/**********************************************************/
/* 函数名称 : SoftDelay100ns */
/* 函数功能 : 延时100NS。 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*--------------------------------------------------------*/
void SoftDelay100ns(int ns)
{
int i,j;
for(i=0;i<ns;i++)
{
for(j=0;j<25;j++); //50还可以听出原声;25还可以,但有间断;
}
}
/**********************************************************/
/* 函数名称 : InitPortVS1003 */
/* 函数功能 : MCU与vs1003接口的初始化 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*--------------------------------------------------------*/
void InitPortVS1003(void)
{
// IODIR &= 0xfffeffff; //其他接口线的设置,其中dreq 为输入口
// IODIR |= MP3_XRESET | MP3_XCS | MP3_XDCS;//xRESET,xCS,xDS均为输出口
// IOSET |= MP3_XRESET | MP3_XCS | MP3_XDCS;//xRESET,xCS,xDS默认输出高电平
rPDATD= 0xff;
rPCOND= 0x1115;
rPUPD = 0x0;
}
/**********************************************************/
/* 函数名称 : SPIPutChar */
/* 函数功能 : 通过SPI发送一个字节的数据 */
/* 参数 : 待发送的字节数据 */
/* 返回值 : 无 */
/*--------------------------------------------------------*/
void SPIPutChar(unsigned char c)
{
// S0SPDR = c;
// while((S0SPSR & 0x80) == 0); //等待SPI将数据发送完毕
int i,j;
for(i=0;i<8;i++)
{
MP3_SCLK_L;
// _NOP();
// SoftDelay100ns(1);
for(j=0;j<10;j++);
//delay
if(c&0X80)
{
MP3_SI_H;
}
else
{
MP3_SI_L;
}
c=c<<1;
MP3_SCLK_H;
for(j=0;j<10;j++); //20 不错,可以播放速率300K的歌
// SoftDelay100ns(1);
// _NOP();
//delay
}
MP3_SI_H;
//delay
}
/**********************************************************/
/* 函数名称 : SPIReadChar */
/* 函数功能 : 通过SPI读取一个字节的数据 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*--------------------------------------------------------*/
unsigned short SPIReadChar(void)
{
// S0SPDR = c;
// while((S0SPSR & 0x80) == 0); //等待SPI将数据发送完毕
int i;
unsigned short c;
for(i=0;i<8;i++)
{
c=c<<1;
MP3_SCLK_H;
SoftDelay100ns(1);
if(MP3_SO_IN!=0)
{
c|=0x01;
}
else
{
c&=~0x01;
}
MP3_SCLK_L;
SoftDelay100ns(1);
}
c&=0x00ff;
return (c);
}
/**********************************************************/
/* 函数名称 : Mp3SoftReset */
/* 函数功能 : vs1003软件复位 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*--------------------------------------------------------*/
void Mp3SoftReset(void)
{
Mp3WriteRegister (SPI_MODE, 0x08, 0x04); //软件复位
Delay(10); //延时1ms
while (MP3_DREQ_IN == 0); //等待软件复位结束
Mp3WriteRegister(SPI_CLOCKF, 0x98, 0x00);//设置vs1003的时钟,3倍频
Mp3WriteRegister (SPI_AUDATA, 0xBB, 0x81); //采样率48k,立体声
// Mp3WriteRegister(SPI_BASS, 0x00, 0x55);//设置重音
Mp3WriteRegister(SPI_BASS, 0x02, 0x75);
// vs1011_cmd_write(0x02,0X75); //BASS
Mp3SetVolume(10,10); //Mp3SetVolume(20,20);//设置音量
Delay(10); //延时1ms
//向vs1003发送4个字节无效数据,用以启动SPI发送
Mp3SelectData();
SoftDelay100ns(1);
SPIPutChar(0);
SPIPutChar(0);
SPIPutChar(0);
SPIPutChar(0);
SoftDelay100ns(1);
Mp3DeselectData();
}
/**********************************************************/
/* 函数名称 : Mp3Reset */
/* 函数功能 : vs1003硬件复位 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*--------------------------------------------------------*/
void Mp3Reset(void)
{
Mp3PutInReset();//xReset = 0 复位vs1003
Delay(1000);//延时100ms
// SPIPutCharWithoutWaiting(0xff);//发送一个字节的无效数据,启动SPI传输
Mp3DeselectControl(); //xCS = 1
SoftDelay100ns(1);
Mp3DeselectData(); //xDCS = 1
SoftDelay100ns(1);
Mp3ReleaseFromReset(); //xRESET = 1
Delay(1000); //延时100ms
while (MP3_DREQ_IN == 0);//等待DREQ为高
Delay(1000); //延时100ms
Mp3SetVolume(10,10);
Mp3SoftReset();//vs1003软复位
}
/***********************************************************/
/* 函数名称 : VsSineTest */
/* 函数功能 : vs1003正弦测试,将该函数放在while循环中, */
/* 如果能持续听到一高一低的声音,证明测试通过 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*---------------------------------------------------------*/
void VsSineTest(void)
{
Mp3PutInReset(); //xReset = 0 复位vs1003
Delay(1000); //延时100ms
SPIPutChar(0xff);//发送一个字节的无效数据,启动SPI传输
Mp3DeselectControl();
SoftDelay100ns(1);
Mp3DeselectData();
SoftDelay100ns(1);
Mp3ReleaseFromReset();
Delay(1000);
Mp3WriteRegister(SPI_MODE,0x08,0x20);//进入vs1003的测试模式
while (MP3_DREQ_IN == 0); //等待DREQ为高
Mp3SelectData(); //xDCS = 0,选择vs1003的数据接口
SoftDelay100ns(1);
//向vs1003发送正弦测试命令:0x53 0xef 0x6e n 0x00 0x00 0x00 0x00
//其中n = 0x24, 设定vs1003所产生的正弦波的频率值,具体计算方法见vs1003的datasheet
SPIPutChar(0x53);
SPIPutChar(0xef);
SPIPutChar(0x6e);
SPIPutChar(0x3f);
SPIPutChar(0x00);
SPIPutChar(0x00);
SPIPutChar(0x00);
SPIPutChar(0x00);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -