Esempio n. 1
0
//返回Kbps的大小
//返回值:得到的码率
u16 VS_Get_HeadInfo(void)
{
    unsigned int HEAD0;
    unsigned int HEAD1;
    HEAD0 = VS_RD_Reg(SPI_HDAT0);
    HEAD1 = VS_RD_Reg(SPI_HDAT1);
    //printf("(H0,H1):%x,%x\n",HEAD0,HEAD1);
    switch (HEAD1)
    {
    case 0x7665://WAV格式
    case 0X4D54://MIDI格式
    case 0X4154://AAC_ADTS
    case 0X4144://AAC_ADIF
    case 0X4D34://AAC_MP4/M4A
    case 0X4F67://OGG
    case 0X574D://WMA格式
    case 0X664C://FLAC格式
    {
        ////printf("HEAD0:%d\n",HEAD0);
        HEAD1 = HEAD0 * 2 / 25; //相当于*8/100
        if ((HEAD1 % 10) > 5)return HEAD1 / 10 + 1; //对小数点第一位四舍五入
        else return HEAD1 / 10;
    }
    default://MP3格式,仅做了阶层III的表
    {
        HEAD1 >>= 3;
        HEAD1 = HEAD1 & 0x03;
        if (HEAD1 == 3)HEAD1 = 1;
        else HEAD1 = 0;
        return bitrate[HEAD1][HEAD0 >> 12];
    }
    }
}
Esempio n. 2
0
//读取VS10xx的RAM
//addr:RAM地址
//返回值:读到的值
u16 VS_WRAM_Read(u16 addr)
{
    u16 res;
    VS_WR_Cmd(SPI_WRAMADDR, addr);
    res = VS_RD_Reg(SPI_WRAM);
    return res;
}
Esempio n. 3
0
//设定音效
//eft:0,关闭;1,最小;2,中等;3,最大.
void VS_Set_Effect(u8 eft)
{
    u16 temp;
    temp = VS_RD_Reg(SPI_MODE); //读取SPI_MODE的内容
    if (eft & 0X01)temp |= 1 << 4; //设定LO
    else temp &= ~(1 << 5);     //取消LO
    if (eft & 0X02)temp |= 1 << 7; //设定HO
    else temp &= ~(1 << 7);     //取消HO
    VS_WR_Cmd(SPI_MODE, temp);  //设定模式
}
Esempio n. 4
0
//切歌
//通过此函数切歌,不会出现切换“噪声”				
void VS_Restart_Play(void) {
	u16 temp;
	u16 i;
	u8 n;
	u8 vsbuf[32];
	for (n = 0; n < 32; n++)
		vsbuf[n] = 0;  //清零
	temp = VS_RD_Reg(SPI_MODE);	//读取SPI_MODE的内容
	temp |= 1 << 3;					//设置SM_CANCEL位
	temp |= 1 << 2;					//设置SM_LAYER12位,允许播放MP1,MP2
	VS_WR_Cmd(SPI_MODE, temp);	//设置取消当前解码指令
	for (i = 0; i < 2048;)			//发送2048个0,期间读取SM_CANCEL位.如果为0,则表示已经取消了当前解码
			{
		if (VS_Send_MusicData(vsbuf) == 0)			//每发送32个字节后检测一次
				{
			i += 32;						//发送了32个字节
			temp = VS_RD_Reg(SPI_MODE);	//读取SPI_MODE的内容
			if ((temp & (1 << 3)) == 0)
				break;	//成功取消了
		}
	}
	if (i < 2048)	//SM_CANCEL正常
			{
		temp = VS_Get_EndFillByte() & 0xff;	//读取填充字节
		for (n = 0; n < 32; n++)
			vsbuf[n] = temp;	//填充字节放入数组
		for (i = 0; i < 2052;) {
			if (VS_Send_MusicData(vsbuf) == 0)
				i += 32;	//填充	  
		}
	}
	else
		VS_Soft_Reset();  	//SM_CANCEL不成功,坏情况,需要软复位 	  
	temp = VS_RD_Reg(SPI_HDAT0);
	temp += VS_RD_Reg(SPI_HDAT1);
	if (temp)					//软复位,还是没有成功取消,放杀手锏,硬复位
	{
		VS_HD_Reset();		   	//硬复位
		VS_Soft_Reset();  		//软复位 
	}
}
Esempio n. 5
0
////////////////////////////////////////////////////////////////////////////////
//软复位VS10XX
void VS_Soft_Reset(void)
{
    u8 retry = 0;
    while (VS_DQ == 0); //等待软件复位结束
    VS_SPI_ReadWriteByte(0Xff);//启动传输
    retry = 0;
    while (VS_RD_Reg(SPI_MODE) != 0x0800) // 软件复位,新模式
    {
        VS_WR_Cmd(SPI_MODE, 0x0804); // 软件复位,新模式
        delay_ms(2);//等待至少1.35ms
        if (retry++ > 100)break;
    }
    while (VS_DQ == 0); //等待软件复位结束
    retry = 0;
    while (VS_RD_Reg(SPI_CLOCKF) != 0X9800) //设置VS10XX的时钟,3倍频 ,1.5xADD
    {
        VS_WR_Cmd(SPI_CLOCKF, 0X9800); //设置VS10XX的时钟,3倍频 ,1.5xADD
        if (retry++ > 100)break;
    }
    delay_ms(20);
}
Esempio n. 6
0
//ram 测试
//返回值:RAM测试结果
// VS1003如果得到的值为0x807F,则表明完好;VS1053为0X83FF.
u16 VS_Ram_Test(void)
{
    VS_HD_Reset();
    VS_WR_Cmd(SPI_MODE, 0x0820); // 进入VS10XX的测试模式
    while (VS_DQ == 0); // 等待DREQ为高
    VS_SPI_SpeedLow();//低速
    VS_XDCS_L;                // xDCS_H,选择VS10XX的数据接口
    VS_SPI_ReadWriteByte(0x4d);
    VS_SPI_ReadWriteByte(0xea);
    VS_SPI_ReadWriteByte(0x6d);
    VS_SPI_ReadWriteByte(0x54);
    VS_SPI_ReadWriteByte(0x00);
    VS_SPI_ReadWriteByte(0x00);
    VS_SPI_ReadWriteByte(0x00);
    VS_SPI_ReadWriteByte(0x00);
    delay_ms(150);
    VS_XDCS_H;
    return VS_RD_Reg(SPI_HDAT0);// VS1003如果得到的值为0x807F,则表明完好;VS1053为0X83FF.;
}
Esempio n. 7
0
//得到mp3的播放时间n sec
//返回值:解码时长
u16 VS_Get_DecodeTime(void)
{
    u16 dt = 0;
    dt = VS_RD_Reg(SPI_DECODE_TIME);
    return dt;
}