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

📄 codecs.c

📁 2.4G无线音箱的接收程序,采用ATMEGA8单片机和STS公司的无线模块完成
💻 C
📖 第 1 页 / 共 2 页
字号:

	
	if (Use_SPDIF) I2C_error += Set_WM8731(9, 0x00); /* Deactivate interface */
	else           I2C_error += Set_WM8731(9, 0x01); /* Activate interface */

	#ifdef VOLUME_DARR
		I2C_error += Set_WM8731(2, MAX_VOLUME >> 1);
		I2C_error += Set_WM8731(3, MAX_VOLUME >> 1);
	#else
		I2C_error += Set_WM8731(2, START_UP_VOLUME >> 1);
		I2C_error += Set_WM8731(3, START_UP_VOLUME >> 1);
	#endif /* VOLUME_DARR */

	return (I2C_error);
}

//==============================================================================================

/*******************/
/*** VOLUME_DARR ***/
/*******************/

void SetVolume_DARR80(unsigned char Left_Right, unsigned char Volume)
{
  /* volume control on DARR is from 0 to 128 ,
  that is why the volume is increased with one*/

	if (Left_Right == 0) I2C_Write_Byte(AVOW_ADDR, (Volume >> 1)+1);
	if (Left_Right == 1) I2C_Write_Byte(AVOX_ADDR, (Volume >> 1)+1);
	#ifdef USE_DUAL_CODEC
		if (Left_Right == 2) I2C_Write_Byte(AVOY_ADDR, (Volume >> 1)+1);
		if (Left_Right == 3) I2C_Write_Byte(AVOZ_ADDR, (Volume >> 1)+1);
	#endif /* END USE_DUAL_CODEC */
}

//==============================================================================================

/********************/
/*** CODEC_CS4251 ***/
/********************/

unsigned char Config_Codec_CS4251(void)
{

    unsigned char I2C_error = 0;

#ifdef CODEC_CS4251

    CODEC_RESET(0);           /* Reset */
    Wait_For_mSec(10);        /* Ensure a steady-state reset */
    CODEC_RESET(1);           /* Remove reset */

    Set_CS4251(0x02, 0x01);   /* PDN = 1 Powerdown for Software Mode within 10 ms  */

    /* Software mode audio settings when PDN = 1 */
#ifdef PCB_PNP80_HEADSET
//no use allan
// Use DAC and ADC for headset
    Set_CS4251(0x03, 0x21);   /* No Auto | Single Speed | MICB | MICA | MICBIAS | (LSB) MCLK/DIV2 */

// Use DAC only for headphone
//    Set_CS4251(0x03, 0x2F);   /* No Auto | Single Speed | PDN_MICB | PDN_MICA | PDN_MICBIAS | (LSB) MCLK/DIV2 */

    Set_CS4251(0x04, 0x4C);   /* I2S Master | DAC = I2S format | ADC = I2S format | DIGMIX = Off | MICMIX = Off */

#else // Universal Transceiver
// Software Mode (default for Nack)
//    Set_CS4251(0x03, 0x2F);   /* No Auto | Single Speed | PDN_MICB | PDN_MICA | PDN_MICBIAS | (LSB) MCLK/DIV2 */
// Software Mode (default for Ack)
    Set_CS4251(0x03, 0x21);   /* No Auto | Single Speed | MICB | MICA | MICBIAS | (LSB) MCLK/DIV2 */
// Default Hardware Mode (Auto)
//    Set_CS4251(0x03, 0xAE);   /* Auto | Single Speed | PDN_MICB | PDN_MICA | PDN_MICBIAS | (LSB) No MCLK/DIV2 */

    Set_CS4251(0x04, 0x0C);   /* I2S Slave | DAC = I2S format | ADC = I2S format | DIGMIX = Off | MICMIX = Off  */

#endif

    Set_CS4251(0x02, 0x00);   /* PDN = 0 */
//      Set_CS4251(0x02, 0x1E); /* Powerdown PGA and ADC */

    /* Required DAC settings */
    Set_CS4251(0x08, 0x73);   /* HP_GAIN = default G = 0.6047 (not in dB) | DAC_SNGVOL = On | DACMuteB | DACMuteA */
    Set_CS4251(0x09, 0x41);   /* DATA_SEL = 01 Signal Processing Engine to DAC | Zero Crossing */

    Set_CS4251(0x10, 0x00);   /* MUTE_PCM_MIXA = Off | 0dB */
    Set_CS4251(0x11, 0x00);   /* MUTE_PCM_MIXB = Off | 0dB */

    Set_CS4251(0x16, Volume_Memory);   /* AOUTA Volume = user setting*/
    Set_CS4251(0x17, Volume_Memory);   /* AOUTB Volume = user setting if not using DAC_SNGVOL */

    /* For improved DAC audio performance */
    Set_CS4251(0x14, 0x19);   /* Treble Corner Freq = 15kHz | Bass Corner Freq = 50Hz | Tone Control = On */
    Set_CS4251(0x21, 0x50);   /* Charge Pump Freq = 438kHz */
    /* For default DAC audio performance */
//    Set_CS4251(0x14, 0x00);   /* Tone Control = Off */
//    Set_CS4251(0x21, 0xF0);   /* Charge Pump Freq = 180kHz */

    /* Already DAC default */
//    Set_CS4251(0x12, 0x00);   /* Beep 260.87Hz | On time 86ms */
//    Set_CS4251(0x13, 0x00);   /* Beep off time 1.23 seconds | Beep Volume 0dB */
//    Set_CS4251(0x15, 0x88);   /* 0dB Treble Gain | 0dB Bass Gain */
//    Set_CS4251(0x18, 0x00);   /* PCMA = L | PCMB = R | ADCA = L | ADCB = R */
//    Set_CS4251(0x19, 0x00);   /* 0dB Max Threshold | 0dB Max Cushion Threshold | Limiter Soft Ramp = Off | Limiter Zero Cross = Off */
//    Set_CS4251(0x1A, 0x7F);   /* Limit = Off */

    /* Required ADC settings */
    Set_CS4251(0x06, 0xA5);   /* ADCB_HPF_EN | ADCA_HPF_EN | ZCROSSB | ZCROSSA */
    Set_CS4251(0x1D, 0x00); /* Fastest Release */
    Set_CS4251(0x1E, 0x1C); /* ALC Threshold Max = 0dB | Min = -30dB */
    Set_CS4251(0x1F, 0xC0); /* NG_ALL = On | NG_EN = On | -64dB Threshold | 50ms delay */

    /* Already ADC default */
//    Set_CS4251(0x0A, 0x00); /* ALCA_SRDIS = Off | ALCA_ZCDIS = Off | 0dB PGAA_VOL */
//    Set_CS4251(0x0B, 0x00); /* ALCB_SRDIS = Off | ALCB_ZCDIS = Off | 0dB PGAB_VOL */
//    Set_CS4251(0x0C, 0x00); /* 0dB ADCA_ATT */
//    Set_CS4251(0x0D, 0x00); /* 0dB ADCB_ATT */
//    Set_CS4251(0x1C, 0x00); /* ALC_ENB = Off | ALC_ENA = Off | Fastest Attack */

    Set_CS4251(0x08, 0x70);   /* HP_GAIN = default G = 0.6047 (not in dB) | DAC_SNGVOL = On | DACMuteB = Off | DACMuteA = Off */

    if (Use_ModuleMode==CU)
    {
#ifndef LINE_IN
        if (Use_Application<4)
        {
            /* For CU Nack */
            Set_CS4251(0x03, 0x2F);   /* No Auto | Single Speed | PDN_MICB | PDN_MICA | PDN_MICBIAS | (LSB) MCLK/DIV2 */
            //Set_CS4251(0x05, 0xE0);   /* ADC_SNGVOL | ADCB_DBOOST | ADCA_DBOOST | MICB_BOOST=Off | MICA_BOOST=Off */
            Set_CS4251(0x05, 0x80);   /* ADC_SNGVOL | MICB_BOOST=Off | MICA_BOOST=Off */
            Set_CS4251(0x07, 0x00);   /* AIN1B->PGAB | AIN1A->PGAA */
        }
        else
        {
            /* For CU Headset */
            Set_CS4251(0x03, 0x21);   /* No Auto | Single Speed | MICB | MICA | MICBIAS | (LSB) MCLK/DIV2 */
            /* Note: ADC_DBOOST must be turned off to eliminate distortion in mic in */

            Set_CS4251(0x02, 0x00); /* Poweron PGA and ADC */
            //Set_CS4251(0x05, 0x83); /* ADC_SNGVOL | ADCB_DBOOST=Off | ADCA_DBOOST=Off | MICB_BOOST | MICA_BOOST */
            Set_CS4251(0x05, 0x80);   /* ADC_SNGVOL | MICB_BOOST=Off | MICA_BOOST=Off */
            Set_CS4251(0x07, 0xF0); /* AIN3B->PGAB | AIN3A->PGAB +32/16dB */
            Set_CS4251(0x18, 0xA0); /* L+R/2 | L+R/2 | L | R */

        }
#else
            Set_CS4251(0x03, 0x2F);   /* No Auto | Single Speed | PDN_MICB | PDN_MICA | PDN_MICBIAS | (LSB) MCLK/DIV2 */
            //Set_CS4251(0x05, 0xE0);   /* ADC_SNGVOL | ADCB_DBOOST | ADCA_DBOOST | MICB_BOOST=Off | MICA_BOOST=Off */
            Set_CS4251(0x05, 0x80);   /* ADC_SNGVOL | MICB_BOOST=Off | MICA_BOOST=Off */
            Set_CS4251(0x07, 0x00);   /* AIN1B->PGAB | AIN1A->PGAA */
#endif

    }
#endif /*CODEC_CS4251*/
	return (I2C_error);
}

/********************/
/*** CODEC_CS4251 ***/
/********************/
unsigned char Set_CS4251(unsigned char address, int data)
{
	unsigned char I2C_error = 0;

    i2cSlaveAddress	= 0x94;               /* CS4251 I2C Address + Write */
    I2C_error = I2C_Write_Byte(address, data);
    i2cSlaveAddress = I2C_SLAVE_ADDRESS;  /* Restore DARR80 I2C slave address */

	return (I2C_error);
}

void SetVolume_CS4251(unsigned char Left_Right, unsigned char Volume)
{

    if (Volume < 52) Volume = 52; /* Set 52 as Min -102dB */
    /* 255 is Max -0.5dB. 24 is Headphone Gain Max +12dB but not used due to distortion */
      Set_CS4251(0x16, Volume); /* Left on AOUTA */
//    Set_CS4251(0x17, Volume); /* Right on AOUTB if DAC_SNGVOL not used */

#if 0
    if (Volume < 25) Volume = 25; /* 25 is Min -51.5dB */
    /* 255 is Max -0.5dB. 24 is Headphone Gain Max +12dB but not used due to distortion */
    Volume &= 0x7F; /* PCM Mute Off */
    Set_CS4251(0x10, Volume);
    Set_CS4251(0x11, Volume);
#endif
}

void SetInVolume_CS4251(unsigned char Left_Right, unsigned char Volume)
{
    SetVolume_CS4251(Left_Right, Volume);
}













/********************/
/*** CODEC_CS4341 ***/
/********************/

unsigned char Config_Codec_CS4341(void)
{

    unsigned char I2C_error = 0;

#ifdef CODEC_CS4341
    CODEC_RESET(0);           /* Reset */
    Wait_For_mSec(10);        /* Ensure a steady-state reset */
    CODEC_RESET(1);           /* Remove reset */

	//REG01	     7          6         5         4         3         2          1       0
	// 		AMUTE | DIF2 | DIF1 | DIF0 | DEM1 | DEM0 | POR | PDN
    Set_CS4341(0x01, 0x01);   /* PDN = 1 POR=0, Powerdown for Software Mode within 10 ms  */

	//REG00 	 7				  6 			  5 			   4				3			   2				 1				  0
	//		   Reserved | Reserved | Reserved | Reserved | Reserved | Reserved | MCLKDIV | Reserved | 
	Set_CS4341(0x00, 0x02);   /* MCLK/DIV2 */			

	//REG01     7          6         5         4         3         2          1       0
	// 		AMUTE | DIF2 | DIF1 | DIF0 | DEM1 | DEM0 | POR | PDN
	Set_CS4341(0x01, 0x93);   /* AMUTE Disable | I2S up 24 bit,32xFS internal SCLK	*/

	//REG02    7	     6            5                4            3             2            1             0
	//           A=B | Soft | Zero Cross | ATAPI4 | ATAPI3 | ATAPI2 | ATAPI1 | ATAPI0 | 
    Set_CS4341(0x02, 0xA9);   /* A=B, Zero Crossing , AOUTA=aL AOUTB=bR  */

#ifdef CODEC_CS4341
		if((PINB && 0x02)==0)	//Mute DAC////mute key active  //PB1=0; mute
			{
				Set_CS4341(0x03, 0x80 ); /* Allan Add	Left on AOUTA */
				Set_CS4341(0x04, 0x80 ); /* Allan Add	Left on AOUTA */
			}
		else		//Open DAC////no mute key active   //PB1=1; no mute
			{
				Set_CS4341(0x03, 0x00 ); /* Allan Add	Left on AOUTA */
				Set_CS4341(0x04, 0x00 ); /* Allan Add	Left on AOUTA */
			}
#endif

	Set_CS4341(0x01, 0x90);   /* PDN = 0  I2S up 24 bit,32xFS internal SCLK*/

    Wait_For_mSec(10);        /* Ensure a steady-state reset */

#endif
	return (I2C_error);
}

/********************/
/*** CODEC_CS4341 ***/
/********************/
unsigned char Set_CS4341(unsigned char address, int data)
{
	unsigned char I2C_error = 0;

    i2cSlaveAddress	= 0x20;               /* CS4341 I2C Address 001000 0 0 + Write */
    I2C_error = I2C_Write_Byte(address, data);
    i2cSlaveAddress = I2C_SLAVE_ADDRESS;  /* Restore DARR80 I2C slave address */

	return (I2C_error);
}

void SetVolume_CS4341(unsigned char Left_Right, unsigned char Volume)
{
		if(key_state)	//Mute DAC////mute key active  //PB1=0; mute
			{
				Set_CS4341(0x03, 0x80 ); /* Allan Add	Left on AOUTA */
				Set_CS4341(0x04, 0x80 ); /* Allan Add	Left on AOUTA */
			}
		else		//Open DAC////no mute key active   //PB1=1; no mute
			{
				Set_CS4341(0x03, 0x00 ); /* Allan Add	Left on AOUTA */
				Set_CS4341(0x04, 0x00 ); /* Allan Add	Left on AOUTA */
			}

	return;  //allan
}


void SetInVolume_CS4341(unsigned char Left_Right, unsigned char Volume)
{
    SetVolume_CS4341(Left_Right, 0x00 );
	return;  //allan
}















//be cancelled allan
void Codec_PowerControl(unsigned char Sync_Stat)
{
    unsigned char temp_vol = 100;

    if (prev_Sync_Stat != Sync_Stat)
    {
        prev_Sync_Stat = Sync_Stat;

        if (Sync_Stat)
        {
            Sync_Led_Status = LED_SYNC_STATUS;

            //Set_CS4251(0x08, 0x70);   /* HP_GAIN = default G = 0.6047 (not in dB) | DAC_SNGVOL = On | DACMuteB = Off | DACMuteA = Off */
            Set_CS4341(0x08, 0x70);   /* HP_GAIN = default G = 0.6047 (not in dB) | DAC_SNGVOL = On | DACMuteB = Off | DACMuteA = Off */

            if (ApplicType == APPL_TYPE_NACK)
            {
                  //Set_CS4251(0x02, 0x1E); /* Powerdown PGA and ADC */
                  Set_CS4341(0x02, 0x1E); /* Powerdown PGA and ADC */
            }
            else if ( ApplicType == APPL_TYPE_HEADSET)
            {
                //Set_CS4251(0x02, 0x00); /* Poweron PGA and ADC */
                //Set_CS4251(0x05, 0x83); /* ADC_SNGVOL | ADCB_DBOOST=Off | ADCA_DBOOST=Off | MICB_BOOST | MICA_BOOST */
                //Set_CS4251(0x07, 0xF0); /* AIN3B->PGAB | AIN3A->PGAB +32/16dB */
                //Set_CS4251(0x18, 0xA0); /* L+R/2 | L+R/2 | L | R */
                Set_CS4341(0x02, 0x00); /* Poweron PGA and ADC */
                Set_CS4341(0x05, 0x83); /* ADC_SNGVOL | ADCB_DBOOST=Off | ADCA_DBOOST=Off | MICB_BOOST | MICA_BOOST */
                Set_CS4341(0x07, 0xF0); /* AIN3B->PGAB | AIN3A->PGAB +32/16dB */
                Set_CS4341(0x18, 0xA0); /* L+R/2 | L+R/2 | L | R */
            }
//#if 0
            /* Gradual Volume Control at AOUTA and AOUTB */
            while (temp_vol > START_UP_VOLUME)
            {
              temp_vol -= 2;
              //SetVolume_CS4251(0, temp_vol);
              SetVolume_CS4341(0x00, 0x00);
              Wait_For_mSec(10);
            }
//#endif
        }
        else
        {
            //Set_CS4251(0x02, 0x01); /* Powerdown Codec */
            Set_CS4341(0x02, 0x01); /* Powerdown Codec */
        }

    }

}




























/*

unsigned char Config_Codec_CS4251(void)
{
    Set_CS4251(0x02, 0x01);  
    Set_CS4251(0x03, 0x21);   
    Set_CS4251(0x04, 0x0C);  
    Set_CS4251(0x02, 0x00);   // PDN = 0 //
    Set_CS4251(0x08, 0x73);   // HP_GAIN = default G = 0.6047 (not in dB) | DAC_SNGVOL = On | DACMuteB | DACMuteA//
    Set_CS4251(0x09, 0x41);   // DATA_SEL = 01 Signal Processing Engine to DAC | Zero Crossing //

    Set_CS4251(0x10, 0x00);   // MUTE_PCM_MIXA = Off | 0dB //
    Set_CS4251(0x11, 0x00);   // MUTE_PCM_MIXB = Off | 0dB//

    Set_CS4251(0x16, Volume_Memory);   // AOUTA Volume = user setting//
    Set_CS4251(0x17, Volume_Memory);   // AOUTB Volume = user setting if not using DAC_SNGVOL //

    Set_CS4251(0x14, 0x19);   // Treble Corner Freq = 15kHz | Bass Corner Freq = 50Hz | Tone Control = On //
    Set_CS4251(0x21, 0x50);   // Charge Pump Freq = 438kHz //
    Set_CS4251(0x06, 0xA5);   // ADCB_HPF_EN | ADCA_HPF_EN | ZCROSSB | ZCROSSA //
    Set_CS4251(0x1D, 0x00); // Fastest Release ///
    Set_CS4251(0x1E, 0x1C); // ALC Threshold Max = 0dB | Min = -30dB //
    Set_CS4251(0x1F, 0xC0); // NG_ALL = On | NG_EN = On | -64dB Threshold | 50ms delay //
    Set_CS4251(0x08, 0x70);   // HP_GAIN = default G = 0.6047 (not in dB) | DAC_SNGVOL = On | DACMuteB = Off | DACMuteA = Off //
	Set_CS4251(0x03, 0x2F);   // No Auto | Single Speed | PDN_MICB | PDN_MICA | PDN_MICBIAS | (LSB) MCLK/DIV2 //
	Set_CS4251(0x05, 0x80);   // ADC_SNGVOL | MICB_BOOST=Off | MICA_BOOST=Off //
	Set_CS4251(0x07, 0x00);   // AIN1B->PGAB | AIN1A->PGAA //
}

*/










⌨️ 快捷键说明

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