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

📄 aic23_lib.c

📁 ADV7181B视频解码设置和控制实验 FreeDev Digital Application Board采用了ADI公司的 ADV7181B视频解码芯片。控制接口使用I2C
💻 C
字号:
/***************************************************
模块说明      :TLV320AIC23操作库文件
作    者      :柳军胜
公    司      :杭州自由电子科技
            :http://www.freefpga.com
电   话       :0571-85084089
修    改      :
日期时间      :20060523
说    明      :
            TLV320AIC23各类控制函数
****************************************************/
#include <alt_types.h>
#include <tlv320aic23.h>
#include <i2c_master.h>

// 寄存器控制值保存
static alt_u16 liv;
static alt_u16 riv;
static alt_u16 lhpv;
static alt_u16 rhpv;
static alt_u16 ap;
static alt_u16 dp;
static alt_u16 pd;
static alt_u16 dif;
static alt_u16 sr;

/*********************************************
函数名:write_I2c_Aic23
功  能:写TVL320AIC23音频芯片控制寄存器
输  入:外设地址,设备地址,字节地址
返  回: 
备  注:通过I2C控制总线写AIC23控制寄存器
       使用了I2C库的相关函数。
**********************************************/
int write_I2C_Aic23(alt_u8 slaveAddr,alt_u16 data)
{
    alt_u8 uc;
    int iRet;
       
    iRet=start_write_waitack(slaveAddr);
    if(iRet<0)
      return -1;
    
    //write B15-B8
    uc=(data & 0xff00)>>8;
    iRet=write_waitack(uc);
    if(iRet<0)
      return -2;  
       
    //write B7-B0 
    uc=(data & 0x00ff);
    iRet=write_waitack_stop(uc);
    if(iRet<0)
      return -3;
       
    return 0;
  }

/*********************************************
函数名:aic23_reset
功  能:TLV320AIC23音频芯片复位函数
输  入:
返  回: 
备  注:
      软件复位
**********************************************/
int aic23_reset()
{
  int iRet;

  iRet=write_I2C_Aic23(0x34,CTRL_DATA(AIC23_RST,0));
  if(iRet<0){
    printf("复位AIC23错误\n");
    return -1;
  }
  
  return 0;
}

/*********************************************
函数名:aic23_analog_bypass
功  能:TLV320AIC23音频芯片模拟电路旁路实验函数
输  入:
返  回: 
备  注:
      TLV320AIC23支持模拟信号旁路,LINE IN可以通过
      控制寄存器旁路到LINE OUT和HEADPHONE OUT,在旁路
      状态,我们可以测试数字化增益调整,侧音增益调整,还
      可以测试HEADPHONE放大增益调整。
**********************************************/

int aic23_analog_bypass_test()
{
  int iRet;
  
  aic23_reset();
  
  liv=CTRL_DATA(AIC23_LIV, AIC23_LIV_LIV0_MSK|\
                           AIC23_LIV_LIV1_MSK|\
                           AIC23_LIV_LIV2_MSK|\
                           AIC23_LIV_LIV3_MSK|\
                           AIC23_LIV_LIV4_MSK);
  iRet=write_I2C_Aic23(0x34,liv);
  if(iRet<0){
    printf("写left line input volume control error\n");
  }
  
  riv=CTRL_DATA(AIC23_RIV, AIC23_RIV_RIV0_MSK|\
                           AIC23_RIV_RIV1_MSK|\
                           AIC23_RIV_RIV2_MSK|\
                           AIC23_RIV_RIV3_MSK|\
                           AIC23_RIV_RIV4_MSK);
  iRet=write_I2C_Aic23(0x34,riv);
  if(iRet<0){
    printf("写right line input volume control error\n");
  }
  
  ap=CTRL_DATA(AIC23_AP,AIC23_AP_MICM_MSK|\
                         AIC23_AP_BYP_MSK);
  //旁路、关闭DAC、关闭MIC 
  iRet=write_I2C_Aic23(0x34,ap);
  if(iRet<0){
    printf("写analog Audio Path Control error\n");
  }
  
  //address 0000111 Power Down Control
  pd=CTRL_DATA(AIC23_PD,AIC23_PD_MIC_MSK|\
                         AIC23_PD_ADC_MSK|\
                         AIC23_PD_DAC_MSK);
  iRet=write_I2C_Aic23(0x34,pd);
  if(iRet<0){
    printf("写Power Down Control error\n");
  }
  
  return 0;
}

/*********************************************
函数名:aic23_normal_setup
功  能:TLV320AIC23音频芯片常规设置函数
输  入:
返  回: 
备  注:
     开启LINE,ADC,DAC,DSP数据格式,USB采样设置模式
     12M MCLK。
**********************************************/
int aic23_normal_setup()
{
  int iRet;
  char ch;
  unsigned short int reg;
 
  aic23_reset();
  
  liv=CTRL_DATA( AIC23_LIV, AIC23_LIV_LIV0_MSK|\
                            AIC23_LIV_LIV1_MSK|\
                            AIC23_LIV_LIV2_MSK|\
                            AIC23_LIV_LIV3_MSK|\
                            AIC23_LIV_LIV4_MSK);
  iRet=write_I2C_Aic23(0x34,liv);
  if(iRet<0){
    printf("写left line input volume control error\n");
  }
  
  riv=CTRL_DATA( AIC23_RIV, AIC23_RIV_RIV0_MSK|\
                            AIC23_RIV_RIV1_MSK|\
                            AIC23_RIV_RIV2_MSK|\
                            AIC23_RIV_RIV3_MSK|\
                            AIC23_RIV_RIV4_MSK);
  iRet=write_I2C_Aic23(0x34,riv);
  if(iRet<0){
    printf("写right line input volume control error\n");
  }
 
  ap=CTRL_DATA( AIC23_AP,  AIC23_AP_MICM_MSK|\
                          AIC23_AP_DAC_MSK);
  iRet=write_I2C_Aic23(0x34,ap);//0812
  if(iRet<0){
    printf("写analog Audio Path Control error\n");
  }
  
  dp=CTRL_DATA(AIC23_DP, 0);
  iRet=write_I2C_Aic23(0x34,dp);
  if(iRet<0){
    printf("写analog Audio Path Control error\n");
  }
 
  pd=CTRL_DATA(AIC23_PD,AIC23_PD_MIC_MSK); 
  iRet=write_I2C_Aic23(0x34,pd);//0c02
  if(iRet<0){
    printf("写Power Down Control error\n");
  }
  
  dif=CTRL_DATA(AIC23_DIF, AIC23_DIF_FOR0_MSK|\
                           AIC23_DIF_FOR1_MSK|\
                           AIC23_DIF_LRP_MSK|\
                           AIC23_DIF_MS_MSK);
  iRet=write_I2C_Aic23(0x34,dif);//0x0e53
  if(iRet<0){
    printf("写Digital Audio Interface Control error\n");
  }
  
  //ch=ShowSelect( "选择96K采样率?y OR n",'y','n' );
  if(ch=='y'){
    // MCLK、MCLK、96kHz、USB Mode
    sr=CTRL_DATA(AIC23_SR,AIC23_SR_USBNORMAL_MSK|\
                           AIC23_SR_SR0_MSK|\
                           AIC23_SR_SR1_MSK|\
                           AIC23_SR_SR2_MSK);     
  }else{
    //ch=ShowSelect( "选择48K采样率?y OR n",'y','n' );
    if(ch=='y'){
      // MCLK、MCLK、48kHz、USB Mode 
      sr=CTRL_DATA(AIC23_SR,AIC23_SR_USBNORMAL_MSK);       
    }else{
      //ch=ShowSelect( "选择8K采样率?y OR n",'y','n' );
      if(ch=='y'){
        // 8khz,USB Mode 
        sr=CTRL_DATA(AIC23_SR,AIC23_SR_USBNORMAL_MSK|\
                           AIC23_SR_SR0_MSK|\
                           AIC23_SR_SR1_MSK); 
      } else
        reg=0x1001;
    }
  }
  iRet=write_I2C_Aic23(0x34,sr);    
  if(iRet<0){
    printf("写Sample rate Control error\n");
  }
  
  reg=CTRL_DATA(AIC23_DIA,AIC23_DIA_ACT_MSK);
  iRet=write_I2C_Aic23(0x34,reg);
  if(iRet<0){
    printf("写Sample rate Control error\n");
  }
 
  return 0;
}


/*********************************************
函数名:livc
功  能:左声道线路增益控制
输  入:声道增益控制值:11111~0000(+12db~-34db)
返  回:0 sucesses -1 error 
备  注:10111=0db
**********************************************/
int livc(unsigned char value)
{
  int iRet;
  alt_u16 reg;
  
  reg=value&0x1f;
  liv=liv&(~0x1f);
  liv=liv|reg; 
 
  iRet=write_I2C_Aic23(0x34,liv);
  if(iRet<0){
    printf("写left line input volume control error\n");
    return -1;
  }
  return 0; 
}

/*********************************************
函数名:rivc
功  能:右声道线路增益控制
输  入:右道增益控制值:11111~0000(+12db~-34db)
返  回:0 sucesses -1 error 
备  注:10111=0db
**********************************************/
int rivc(unsigned char value)
{
  int iRet;
  alt_u16 reg;
  
  reg=value&0x1f;
  riv=riv&(~0x1f);
  riv=riv|reg; 
 
  iRet=write_I2C_Aic23(0x34,riv);
  if(iRet<0){
    printf("写right line input volume control error\n");
    return -1;
  }
  return 0; 
}

/*********************************************
函数名:lim
功  能:左声道线路静音控制
输  入:
返  回:0 sucesses -1 error 
备  注:
**********************************************/
int lim()
{
  int iRet;
  liv=liv|AIC23_LIV_LIM_MSK; 
 
  iRet=write_I2C_Aic23(0x34,liv);
  if(iRet<0){
    printf("写left line input volume control error\n");
    return -1;
  }
  return 0; 
}

/*********************************************
函数名:rim
功  能:右声道线路静音控制
输  入:
返  回:0 sucesses -1 error 
备  注:
**********************************************/
int rim()
{
  int iRet;
  riv=riv|AIC23_RIV_RIM_MSK; 
 
  iRet=write_I2C_Aic23(0x34,riv);
  if(iRet<0){
    printf("写left line input volume control error\n");
    return -1;
  }
  return 0; 
}


/*********************************************
函数名:lhpv
功  能:左声道耳机增益控制
输  入:声道增益控制值:1111111~0000000(+6db~-73db)
返  回:0 sucesses -1 error 
备  注:1111001=0db
**********************************************/
int lhpvc(unsigned char value)
{
  int iRet;
  alt_u16 reg;
  
  reg=value&0x7f;
  lhpv=lhpv&(~0x7f);
  lhpv=lhpv|reg; 
 
  iRet=write_I2C_Aic23(0x34,lhpv);
  if(iRet<0){
    printf("写left headphone out volume control error\n");
    return -1;
  }
  return 0; 
}

/*********************************************
函数名:rhpv
功  能:左声道耳机增益控制
输  入:声道增益控制值:1111111~0000000(+6db~-73db)
返  回:0 sucesses -1 error 
备  注:1111001=0db
**********************************************/
int rhpvc(unsigned char value)
{
  int iRet;
  alt_u16 reg;
  
  reg=value&0x7f;
  rhpv=rhpv&(~0x7f);
  rhpv=rhpv|reg; 
 
  iRet=write_I2C_Aic23(0x34,rhpv);
  if(iRet<0){
    printf("写right headphone out volume control error\n");
    return -1;
  }
  return 0; 
}





⌨️ 快捷键说明

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