⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sta.c

📁 51控制STA013实现MP3音频解码
💻 C
📖 第 1 页 / 共 3 页
字号:
    return schFst;
}

/***********************************************************************************
函数:STA_ReadReg()
功能:读STA013内部寄存器
参数:
      uchReg:寄存器
返回:寄存器uchReg中的内容
************************************************************************************/

unsigned char STA_ReadReg(unsigned char uchReg)
{
	unsigned char uchValue;

	unsigned char uchErrCount = 10;
	while(uchErrCount--)
	{
	   if(I2C_RcvStr(STA_I2C_DEV, uchReg, 1, &uchValue)==0)
	      continue;
       return uchValue;
	   break;
	}
}

/***********************************************************************************
函数:STA_WriteReg()
功能:读STA013内部寄存器
参数:
      uchReg:寄存器
      uchValue:要写入的值
返回:
************************************************************************************/
//写寄存器
void STA_WriteReg(unsigned char uchReg, unsigned char uchValue)
{
   	unsigned char uchErrCount = 10;
        while(uchErrCount --)
	{
	   if(I2C_SendStr(STA_I2C_DEV, uchReg, 1,&uchValue)==0)
	      continue;
	   break;
    }
}

/***********************************************************************************
函数:STA_DownloadUpdate()
功能:向STA013写入配置文件
参数:
返回:
************************************************************************************/
void STA_DownloadUpdate()
{
	unsigned int i=0;
	unsigned char uchReg, uchValue;
	uchReg = STA013_UpdateData[i++];
	uchValue = STA013_UpdateData[i++];
	//结束标志"0xFF"
	while( (uchReg != 0xff) )
	{
		STA_WriteReg(uchReg, uchValue );
                if(uchReg == 0x10)
		{
		   Delay_ms(50);
		}
		uchReg = STA013_UpdateData[i++];
		uchValue =STA013_UpdateData[i++];

	}
}

/***********************************************************************************
函数:STA_SetTone()
功能:设置STA013播放的音调音质
参数:
      bassEnh:
      bassFreq:
      trebleEnh:
      trebleFreq
返回:
************************************************************************************/
void STA_SetTone(signed char schBassEnh, unsigned int uiBassFreq, signed char schTrebleEnh, unsigned int uiTrebleFreq)
{
	//设置低音增益
	STA_WriteReg(STA_REG_BASS_FREQUENCY_LOW,  (uiBassFreq   ) & 0xFF );
	STA_WriteReg(STA_REG_BASS_FREQUENCY_HIGH, (uiBassFreq>>8) & 0xFF );

	//注意界限
	schBassEnh = MIN(schBassEnh,MAX_BASS_ENHANCE);
	schBassEnh = MAX(schBassEnh,MIN_BASS_ENHANCE);
	STA_WriteReg(STA_REG_BASS_ENHANCE, schBassEnh);

	//设置高音增益
	STA_WriteReg(STA_REG_TREBLE_FREQUENCY_LOW,  (uiTrebleFreq   ) & 0xFF );
	STA_WriteReg(STA_REG_TREBLE_FREQUENCY_HIGH, (uiTrebleFreq>>8) & 0xFF );

	//注意界限
	schTrebleEnh = MIN(schTrebleEnh,MAX_TREBLE_ENHANCE);
	schTrebleEnh = MAX(schTrebleEnh,MIN_TREBLE_ENHANCE);
	STA_WriteReg(STA_REG_TREBLE_ENHANCE, schTrebleEnh);

	//
	STA_WriteReg( STA_REG_TONE_ATTEN, MAX(schBassEnh,schTrebleEnh));
}

/***********************************************************************************
函数:STA_StartDecoder()
功能:配置STA013并开始解压
参数:
返回:
************************************************************************************/
void STA_StartDecoder()
{
        unsigned int i=0;
	unsigned char uchReg, uchValue;
	uchReg = STA013_UpdateData[i++];
	uchValue = STA013_UpdateData[i++];

        //软件复位
	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);
        /*
	for(i = 0;i < 32;)
        {
		uchReg   = config_PLL[i];
		uchValue = config_PLL[i+1];
                i += 2;
         } */

	//配置等
	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);
}

/***********************************************************************************
函数:STA_Init()
功能:STA013初始化
参数:
返回:
************************************************************************************/
unsigned char STA_Init(void)
{
	//复位
	STA_Reset();

	//识别STA013
	if(STA_ReadReg(STA_REG_IDENT) != STA_IDENT)
	{
		return 0;
	}
	//加载配置文件
        STA_DownloadUpdate();
        //配置config_PLL

	//开始解压
	STA_StartDecoder();
	return 1;
}
/***********************************************************************************
函数:STA_SetVolume()
功能:设置音量
参数:
      uchVolume:
      schBalance:
返回:
************************************************************************************/
void STA_SetVolume(unsigned char uchVolume, signed char schBalance)
{
	char chAttenL, chAttenR;

	if( schBalance > 0)
	{	// balance to the left, attenuate right
		chAttenL= (100 - uchVolume);
		chAttenR = (100 - uchVolume) - (schBalance);
	}
	else
	{	// balance to the right, attenuate left
		chAttenL = (100 - uchVolume) + (schBalance);
		chAttenR = (100 - uchVolume);
	}
	// respect limits
	chAttenL = MIN(chAttenL ,MAX_VOLUME_ATTENUATION);
	chAttenL = MAX(chAttenL ,MIN_VOLUME_ATTENUATION);
	chAttenR = MIN(chAttenR ,MAX_VOLUME_ATTENUATION);
	chAttenR = MAX(chAttenR ,MIN_VOLUME_ATTENUATION);

	// set volume
	STA_WriteReg(STA_REG_DLA, chAttenL);
	STA_WriteReg(STA_REG_DLB, MAX_VOLUME_ATTENUATION);
	STA_WriteReg(STA_REG_DRA, chAttenR);
	STA_WriteReg(STA_REG_DRB, MAX_VOLUME_ATTENUATION);
}
/***********************************************************************************
函数:STA_SetTimbre()
功能:设置音色
参数:
      uchVolume:
      schBalance:
返回:
************************************************************************************/
/*
void STA_SetTimbre(unsigned char uchVol,unsigned char uchTimbre)
{
        switch(uchTimbre)
        {
         case STA_TIMBRE_METAL: //金属色
              STA_WriteReg(STA_REG_TREBLE_FREQUENCY_LOW, 0x40);
              STA_WriteReg(STA_REG_TREBLE_FREQUENCY_HIGH,0x1f); //10khz
              //if(STA013_Mode == CHIP_ADPCMPLAY)
              STA_WriteReg(STA_REG_TREBLE_ENHANCE,15 - uchVol);
              STA_WriteReg(STA_REG_BASS_FREQUENCY_LOW,   0xfa); //250hz
              STA_WriteReg(STA_REG_BASS_FREQUENCY_HIGH,  0);
              //if(sta013_mode == ADPCMPLAY)
              STA_WriteReg(STA_REG_BASS_ENHANCE,12 - uchVol);
              break;
         case STA_TIMBRE_BASS: //重低音
              STA_WriteReg(STA_REG_TREBLE_FREQUENCY_LOW, 0xa0);
              STA_WriteReg(STA_REG_TREBLE_FREQUENCY_HIGH,0x0f); //4khz
              //if(STA013_Mode == CHIP_ADPCMPLAY)
              STA_WriteReg(STA_REG_TREBLE_ENHANCE, 0);

              STA_WriteReg(STA_REG_BASS_FREQUENCY_LOW,   0x7d); //125hz
              STA_WriteReg(STA_REG_BASS_FREQUENCY_HIGH,  0);
              //if(sta013_mode == ADPCMPLAY)
              STA_WriteReg(STA_REG_BASS_ENHANCE,8 - uchVol/2);
              break;
         case STA_TIMBRE_LOCAL: //现场
              STA_WriteReg(STA_REG_TREBLE_FREQUENCY_LOW, 0xa0);
              STA_WriteReg(STA_REG_TREBLE_FREQUENCY_HIGH,0x0f); //4khz
              //if(STA013_Mode == CHIP_ADPCMPLAY)
              STA_WriteReg(STA_REG_TREBLE_ENHANCE,8 - uchVol/2);
              STA_WriteReg(STA_REG_BASS_FREQUENCY_LOW,   0x7d); //125hz
              STA_WriteReg(STA_REG_BASS_FREQUENCY_HIGH,  0);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -