//返回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]; } } }
//读取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; }
//设定音效 //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); //设定模式 }
//切歌 //通过此函数切歌,不会出现切换“噪声” 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(); //软复位 } }
//////////////////////////////////////////////////////////////////////////////// //软复位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); }
//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.; }
//得到mp3的播放时间n sec //返回值:解码时长 u16 VS_Get_DecodeTime(void) { u16 dt = 0; dt = VS_RD_Reg(SPI_DECODE_TIME); return dt; }