📄 sta.c
字号:
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 + -