📄 sta013.c
字号:
u8 sta_ReadReg(u8 reg){ u8 data; sta_ReadDevice(STA_I2C_DEV, reg, 1, &data); return data;}//写寄存器void sta_WriteReg(u8 reg, u8 data){ i2cSend(STA_I2C_DEV, reg, 1, &data);}//写配置文件void sta_DownloadUpdate(void){ u16 i; u8 reg, data; i=0; reg = PRG_RDB(STA013_UpdateData + i++); data = PRG_RDB(STA013_UpdateData + i++); //结束标志"0xFF" while( (reg != 0xff) ) { sta_WriteReg(reg, data); reg = PRG_RDB(STA013_UpdateData + i++); data = PRG_RDB(STA013_UpdateData + i++); }}//设置音调void sta_SetTone(s8 bassEnh, u16 bassFreq, s8 trebleEnh, u16 trebleFreq){ //设置低音增益 sta_WriteReg(STA_REG_BASS_FREQUENCY_LOW, (bassFreq ) & 0xFF ); sta_WriteReg(STA_REG_BASS_FREQUENCY_HIGH, (bassFreq>>8) & 0xFF ); //注意界限 bassEnh = MIN(bassEnh,MAX_BASS_ENHANCE); bassEnh = MAX(bassEnh,MIN_BASS_ENHANCE); sta_WriteReg(STA_REG_BASS_ENHANCE, bassEnh); //设置高音增益 sta_WriteReg(STA_REG_TREBLE_FREQUENCY_LOW, (trebleFreq ) & 0xFF ); sta_WriteReg(STA_REG_TREBLE_FREQUENCY_HIGH, (trebleFreq>>8) & 0xFF ); //注意界限 trebleEnh = MIN(trebleEnh,MAX_TREBLE_ENHANCE); trebleEnh = MAX(trebleEnh,MIN_TREBLE_ENHANCE); sta_WriteReg(STA_REG_TREBLE_ENHANCE, trebleEnh); // sta_WriteReg( STA_REG_TONE_ATTEN, MAX(bassEnh,trebleEnh) );}//配置STA013并开始解压void sta_StartDecoder(void){ //软件复位 sta_WriteReg(STA_REG_SOFT_RESET, 0x01); sta_WriteReg(STA_REG_SOFT_RESET, 0x00); //静音与配置DAC输出 sta_WriteReg(STA_REG_MUTE, 0x01); sta_WriteReg(STA_REG_PCMDIVIDER, 0x01); // 32-bit mode, O_FAC = 256 sta_WriteReg(STA_REG_PCMCONF, 0x31); // 18-bit mode & more //配置PLL sta_WriteReg(STA_REG_PLLFRAC_441_H, 0x67); sta_WriteReg(STA_REG_PLLFRAC_441_L, 0x77); sta_WriteReg(STA_REG_PLLFRAC_H, 0xbb); sta_WriteReg(STA_REG_PLLFRAC_L, 0x3a); sta_WriteReg(STA_REG_MFSDF_441, 0x10); sta_WriteReg(STA_REG_MFSDF, 0x0F); //配置界面等 sta_WriteReg(STA_REG_PLLCTL_2, 0x0C); sta_WriteReg(STA_REG_PLLCTL_3, 0x00); sta_WriteReg(STA_REG_PLLCTL_1, 0xA1); sta_WriteReg(STA_REG_SCLK_POL, 0x00); // data sampled on rising edge sta_WriteReg(STA_REG_REQ_POL, 0x01); // REQ line active high sta_WriteReg(STA_REG_DATA_REQ_ENABLE, 0x04); sta_WriteReg(STA_REG_PLLCTL_1, 0xA1); //设置音调 sta_SetTone(0, 0, 0, 0); //STA013开始运行 sta_WriteReg(STA_REG_RUN, 0x01); sta_WriteReg(STA_REG_PLAY, 0x01); sta_WriteReg(STA_REG_MUTE, 0x00);}//STA013初始化u8 sta_Init(void){ //复位 sta_Reset(); //识别STA013 if(sta_ReadReg(STA_REG_IDENT) != STA_IDENT) { return FALSE; } //配置STA013 sta_DownloadUpdate(); //开始解压 sta_StartDecoder(); return TRUE;}//停止解压void sta_StopDecoder(void){ //静音 sta_WriteReg(STA_REG_MUTE, 0x01); //软件复位 sta_WriteReg(STA_REG_SOFT_RESET, 0x01); sta_WriteReg(STA_REG_SOFT_RESET, 0x00);}//暂停解压void sta_PauseDecoder(void){ //静音 sta_WriteReg(STA_REG_MUTE, 0x01); //停止 sta_WriteReg(STA_REG_PLAY, 0x00);}//恢复解压void sta_ResumeDecoder(void){ //开始解压 sta_WriteReg(STA_REG_PLAY, 0x01); //放音 sta_WriteReg(STA_REG_MUTE, 0x00);}//获取MP3信息void sta_GetMP3Info(u16 *bitrate, u8 *sampFreq, u8 *mode){ u8 headL, headM, headH; u8 mpegID, bitrateIndex, sampFreqIndex; // get the MP3 header info headH = sta_ReadReg(STA_REG_HEAD_H); headM = sta_ReadReg(STA_REG_HEAD_M); headL = sta_ReadReg(STA_REG_HEAD_L); // IDex:ID is in head[20:19] // 00 - MPEG2.5 // 01 - reserved // 10 - MPEG2 // 11 - MPEG1 mpegID = (headH & 0x18)>>3; // sampling frequency is in head[11:10] sampFreqIndex = ((headM & 0x0C)>>2) | (mpegID<<2); // bitrate index is in head[15:12] bitrateIndex = ((headM & 0xF0)>>4) | ((mpegID & 0x01)<<4); //bitrateIndex = ((headM & 0xF0)>>4) | (1<<4); // mode is in head[7:6] // 00 - stereo // 01 - joint stereo // 10 - dual channel // 11 - single channel (mono) *mode = (headL & 0xC0)>>6; *bitrate = 2 * PRG_RDB( MP3_Bitrates + bitrateIndex ); *sampFreq = PRG_RDB( MP3_SamplingFrequencies + sampFreqIndex );/* header = (unsigned long)sta_ReadReg(STA_REG_HEAD_H) << 16 | (unsigned long)sta_ReadReg(STA_REG_HEAD_M) << 8 | (unsigned long)sta_ReadReg(STA_REG_HEAD_L);// hdr->word = l;// hdr->emphasis = l & 0x03;// hdr->isOriginal = (l >> 2) & 0x01;// hdr->isCopyrighted = (l >> 3) & 0x01;// hdr->modeExtension = (l >> 4) & 0x03;// hdr->mode = (l >> 6) & 0x03;// hdr->private = (l >> 8) & 0x01;// hdr->padding = (l >> 9) & 0x01;// hdr->frequencyIndex = (l >> 10) & 0x03;// hdr->bitrateIndex = (l >> 12) & 0x0f;// hdr->protection = (l >> 16) & 0x01;// hdr->layer = (l >> 17) & 0x03;// hdr->ID = (l >> 19) & 0x01;// hdr->ID_ex = (l >> 20) & 0x01;*/}u16 sta_GetAverageBitrate(void){ return (2 * sta_ReadReg(STA_REG_AVERAGE_BITRATE));}void sta_SetVolume(u8 volume, s8 balance){ char attenL, attenR; // volume is expected as 0-100 value // Note: // #define MIN_VOLUME_ATTENUATION 0 // #define MAX_VOLUME_ATTENUATION 96 if( balance > 0) { // balance to the left, attenuate right attenL = (100 - volume); attenR = (100 - volume) - (balance); } else { // balance to the right, attenuate left attenL = (100 - volume) + (balance); attenR = (100 - volume); } // respect limits attenL = MIN(attenL,MAX_VOLUME_ATTENUATION); attenL = MAX(attenL,MIN_VOLUME_ATTENUATION); attenR = MIN(attenR,MAX_VOLUME_ATTENUATION); attenR = MAX(attenR,MIN_VOLUME_ATTENUATION); // set volume sta_WriteReg(STA_REG_DLA, attenL); sta_WriteReg(STA_REG_DLB, MAX_VOLUME_ATTENUATION); sta_WriteReg(STA_REG_DRA, attenR); sta_WriteReg(STA_REG_DRB, MAX_VOLUME_ATTENUATION);}//检测STA013的REQu8 sta_Demand(void){ return bit_is_set(STA_REQ_IN, STA_REQ);}//发送MP3数据到STA013void sta_SendToDecoder(u16 len){ u16 pt = 0; s8 j; u8 done = 1; u8 mdata; while(done) { while(sta_Demand()) { mdata = PRG_RDB(mp3_data + pt); //用软串口传送// for(j = 7; j >= 0; j--)// {// cbi(STA_SCK_OUT, STA_SCK);// if((mdata >> j) & 1) sbi(STA_SDI_OUT, STA_SDI);// else cbi(STA_SDI_OUT, STA_SDI);// sbi(STA_SCK_OUT, STA_SCK);// } //用SPI传送 spiSendByte(mdata); pt++; len--; if(len == 0) { done = 0; break; } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -