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

📄 mxl5005_c.c

📁 DVB软件,基于CT216软件的开发源程序.
💻 C
📖 第 1 页 / 共 5 页
字号:
	}

	return status ;
}

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// Function:       MXL_IFSynthInit                                           //
//                                                                           //
// Description:    Tuner IF Synthesizer related register initialization      //
//                                                                           //
// Globals:                                                                  //
//                 NONE                                                      //
//                                                                           //
// Functions used:                                                           //
//                 Tuner_struct: structure defined at higher level           //
//                                                                           //
// Inputs:                                                                   //
//                 Tuner       : Tuner structure defined at higher level     //
//                                                                           //
// Outputs:                                                                  //
//                 Tuner                                                     //
//                                                                           //
// Return:                                                                   //
//                 0 : Successful                                            //
//               > 0 : Failed                                                //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////
_u16 MXL_IFSynthInit( Tuner_struct * Tuner )
{
	_u16 status = 0 ;
	// Declare Local Variables
	_u32	Fref = 0 ;
	_u32	Kdbl, intModVal ;
    _u32	fracModVal ;    
	Kdbl = 2 ;

	if (Tuner->Fxtal >= 12000000UL && Tuner->Fxtal <= 16000000UL)
		Kdbl = 2 ;
	if (Tuner->Fxtal > 16000000UL && Tuner->Fxtal <= 32000000UL)
		Kdbl = 1 ;

	//
	// IF Synthesizer Control
	//
	if (Tuner->Mode == 0 && Tuner->IF_Mode == 1) // Analog Low IF mode
	{
		if (Tuner->IF_LO == 41000000UL) {
			status += MXL_ControlWrite(Tuner, IF_DIVVAL,   0x08) ;
			status += MXL_ControlWrite(Tuner, IF_VCO_BIAS, 0x0C) ;
			Fref = 328000000UL ;
		}
		if (Tuner->IF_LO == 47000000UL) {
			status += MXL_ControlWrite(Tuner, IF_DIVVAL,   0x08) ;
			status += MXL_ControlWrite(Tuner, IF_VCO_BIAS, 0x08) ;
			Fref = 376000000UL ;
		}
		if (Tuner->IF_LO == 54000000UL) {
			status += MXL_ControlWrite(Tuner, IF_DIVVAL,   0x10) ;
			status += MXL_ControlWrite(Tuner, IF_VCO_BIAS, 0x0C) ;
			Fref = 324000000UL ;
		}
		if (Tuner->IF_LO == 60000000UL) {
			status += MXL_ControlWrite(Tuner, IF_DIVVAL,   0x10) ;
			status += MXL_ControlWrite(Tuner, IF_VCO_BIAS, 0x08) ;
			Fref = 360000000UL ;
		}
		if (Tuner->IF_LO == 39250000UL) {
			status += MXL_ControlWrite(Tuner, IF_DIVVAL,   0x08) ;
			status += MXL_ControlWrite(Tuner, IF_VCO_BIAS, 0x0C) ;
			Fref = 314000000UL ;
		}
		if (Tuner->IF_LO == 39650000UL) {
			status += MXL_ControlWrite(Tuner, IF_DIVVAL,   0x08) ;
			status += MXL_ControlWrite(Tuner, IF_VCO_BIAS, 0x0C) ;
			Fref = 317200000UL ;
		}
		if (Tuner->IF_LO == 40150000UL) {
			status += MXL_ControlWrite(Tuner, IF_DIVVAL,   0x08) ;
			status += MXL_ControlWrite(Tuner, IF_VCO_BIAS, 0x0C) ;
			Fref = 321200000UL ;
		}
		if (Tuner->IF_LO == 40650000UL) {
			status += MXL_ControlWrite(Tuner, IF_DIVVAL,   0x08) ;
			status += MXL_ControlWrite(Tuner, IF_VCO_BIAS, 0x0C) ;
			Fref = 325200000UL ;
		}
	}

	if (Tuner->Mode || (Tuner->Mode == 0 && Tuner->IF_Mode == 0))
	{
		if (Tuner->IF_LO == 57000000UL) {
			status += MXL_ControlWrite(Tuner, IF_DIVVAL,   0x10) ;
			status += MXL_ControlWrite(Tuner, IF_VCO_BIAS, 0x08) ;
			Fref = 342000000UL ;
		}
		if (Tuner->IF_LO == 44000000UL) {
			status += MXL_ControlWrite(Tuner, IF_DIVVAL,   0x08) ;
			status += MXL_ControlWrite(Tuner, IF_VCO_BIAS, 0x08) ;
			Fref = 352000000UL ;
		}
		if (Tuner->IF_LO == 43750000UL) {
			status += MXL_ControlWrite(Tuner, IF_DIVVAL,   0x08) ;
			status += MXL_ControlWrite(Tuner, IF_VCO_BIAS, 0x08) ;
			Fref = 350000000UL ;
		}
		if (Tuner->IF_LO == 36650000UL) {
			status += MXL_ControlWrite(Tuner, IF_DIVVAL,   0x04) ;
			status += MXL_ControlWrite(Tuner, IF_VCO_BIAS, 0x08) ;
			Fref = 366500000UL ;
		}
		if (Tuner->IF_LO == 36150000UL) {
			status += MXL_ControlWrite(Tuner, IF_DIVVAL,   0x04) ;
			status += MXL_ControlWrite(Tuner, IF_VCO_BIAS, 0x08) ;
			Fref = 361500000UL ;
		}
		if (Tuner->IF_LO == 36000000UL) {
			status += MXL_ControlWrite(Tuner, IF_DIVVAL,   0x04) ;
			status += MXL_ControlWrite(Tuner, IF_VCO_BIAS, 0x08) ;
			Fref = 360000000UL ;
		}
		if (Tuner->IF_LO == 35250000UL) {
			status += MXL_ControlWrite(Tuner, IF_DIVVAL,   0x04) ;
			status += MXL_ControlWrite(Tuner, IF_VCO_BIAS, 0x08) ;
			Fref = 352500000UL ;
		}
		if (Tuner->IF_LO == 34750000UL) {
			status += MXL_ControlWrite(Tuner, IF_DIVVAL,   0x04) ;
			status += MXL_ControlWrite(Tuner, IF_VCO_BIAS, 0x08) ;
			Fref = 347500000UL ;
		}
		if (Tuner->IF_LO == 6280000UL) {
			status += MXL_ControlWrite(Tuner, IF_DIVVAL,   0x07) ;
			status += MXL_ControlWrite(Tuner, IF_VCO_BIAS, 0x08) ;
			Fref = 376800000UL ;
		}
		if (Tuner->IF_LO == 5000000UL) {
			status += MXL_ControlWrite(Tuner, IF_DIVVAL,   0x09) ;
			status += MXL_ControlWrite(Tuner, IF_VCO_BIAS, 0x08) ;
			Fref = 360000000UL ;
		}
		if (Tuner->IF_LO == 4500000UL) {
			status += MXL_ControlWrite(Tuner, IF_DIVVAL,   0x06) ;
			status += MXL_ControlWrite(Tuner, IF_VCO_BIAS, 0x08) ;
			Fref = 360000000UL ;
		}
		if (Tuner->IF_LO == 4570000UL) {
			status += MXL_ControlWrite(Tuner, IF_DIVVAL,   0x06) ;
			status += MXL_ControlWrite(Tuner, IF_VCO_BIAS, 0x08) ;
			Fref = 365600000UL ;
		}
		if (Tuner->IF_LO == 4000000UL) {
			status += MXL_ControlWrite(Tuner, IF_DIVVAL,   0x05) ;
			status += MXL_ControlWrite(Tuner, IF_VCO_BIAS, 0x08) ;
			Fref = 360000000UL ;
		}
		if (Tuner->IF_LO == 57400000UL)
		{
			status += MXL_ControlWrite(Tuner, IF_DIVVAL,   0x10) ;
			status += MXL_ControlWrite(Tuner, IF_VCO_BIAS, 0x08) ;
			Fref = 344400000UL ;
		}
		if (Tuner->IF_LO == 44400000UL)
		{
			status += MXL_ControlWrite(Tuner, IF_DIVVAL,   0x08) ;
			status += MXL_ControlWrite(Tuner, IF_VCO_BIAS, 0x08) ;
			Fref = 355200000UL ;
		}
		if (Tuner->IF_LO == 44150000UL)
		{
			status += MXL_ControlWrite(Tuner, IF_DIVVAL,   0x08) ;
			status += MXL_ControlWrite(Tuner, IF_VCO_BIAS, 0x08) ;
			Fref = 353200000UL ;
		}
		if (Tuner->IF_LO == 37050000UL)
		{
			status += MXL_ControlWrite(Tuner, IF_DIVVAL,   0x04) ;
			status += MXL_ControlWrite(Tuner, IF_VCO_BIAS, 0x08) ;
			Fref = 370500000UL ;
		}
		if (Tuner->IF_LO == 36550000UL)
		{
			status += MXL_ControlWrite(Tuner, IF_DIVVAL,   0x04) ;
			status += MXL_ControlWrite(Tuner, IF_VCO_BIAS, 0x08) ;
			Fref = 365500000UL ;
		}
		if (Tuner->IF_LO == 36125000UL) {
			status += MXL_ControlWrite(Tuner, IF_DIVVAL,   0x04) ;
			status += MXL_ControlWrite(Tuner, IF_VCO_BIAS, 0x08) ;
			Fref = 361250000UL ;
		}
		if (Tuner->IF_LO == 6000000UL) {
			status += MXL_ControlWrite(Tuner, IF_DIVVAL,   0x07) ;
			status += MXL_ControlWrite(Tuner, IF_VCO_BIAS, 0x08) ;
			Fref = 360000000UL ;
		}
		if (Tuner->IF_LO == 5400000UL)
		{
			status += MXL_ControlWrite(Tuner, IF_DIVVAL,   0x07) ;
			status += MXL_ControlWrite(Tuner, IF_VCO_BIAS, 0x0C) ;
			Fref = 324000000UL ;
		}
		if (Tuner->IF_LO == 5380000UL) {
			status += MXL_ControlWrite(Tuner, IF_DIVVAL,   0x07) ;
			status += MXL_ControlWrite(Tuner, IF_VCO_BIAS, 0x0C) ;
			Fref = 322800000UL ;
		}
		if (Tuner->IF_LO == 5200000UL) {
			status += MXL_ControlWrite(Tuner, IF_DIVVAL,   0x09) ;
			status += MXL_ControlWrite(Tuner, IF_VCO_BIAS, 0x08) ;
			Fref = 374400000UL ;
		}
		if (Tuner->IF_LO == 4900000UL)
		{
			status += MXL_ControlWrite(Tuner, IF_DIVVAL,   0x09) ;
			status += MXL_ControlWrite(Tuner, IF_VCO_BIAS, 0x08) ;
			Fref = 352800000UL ;
		}
		if (Tuner->IF_LO == 4400000UL)
		{
			status += MXL_ControlWrite(Tuner, IF_DIVVAL,   0x06) ;
			status += MXL_ControlWrite(Tuner, IF_VCO_BIAS, 0x08) ;
			Fref = 352000000UL ;
		}
		if (Tuner->IF_LO == 4063000UL)  //add for 2.6.8
		{
			status += MXL_ControlWrite(Tuner, IF_DIVVAL,   0x05) ;
			status += MXL_ControlWrite(Tuner, IF_VCO_BIAS, 0x08) ;
			Fref = 365670000UL ;
		}
	}
	// CHCAL_INT_MOD_IF
	// CHCAL_FRAC_MOD_IF
	intModVal = Fref / (Tuner->Fxtal * Kdbl/2) ;
	status += MXL_ControlWrite(Tuner, CHCAL_INT_MOD_IF, intModVal ) ;

	fracModVal = (2<<15)*(Fref/1000 - (Tuner->Fxtal/1000 * Kdbl/2) * intModVal);
	fracModVal = fracModVal / ((Tuner->Fxtal * Kdbl/2)/1000) ;
	status += MXL_ControlWrite(Tuner, CHCAL_FRAC_MOD_IF, fracModVal) ;



	return status ;
}

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// Function:       MXL_GetXtalInt                                            //
//                                                                           //
// Description:    return the Crystal Integration Value for				     //
//				   TG_VCO_BIAS calculation									 //
//                                                                           //
// Globals:                                                                  //
//                 NONE                                                      //
//                                                                           //
// Functions used:                                                           //
//                 NONE											             //
//                                                                           //
// Inputs:                                                                   //
//                 Crystal Frequency Value in Hz						     //
//                                                                           //
// Outputs:                                                                  //
//                 Calculated Crystal Frequency Integration Value            //
//                                                                           //
// Return:                                                                   //
//                 0 : Successful                                            //
//               > 0 : Failed                                                //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////
_u32 MXL_GetXtalInt(_u32 Xtal_Freq)
{
	if ((Xtal_Freq % 1000000) == 0)
		return (Xtal_Freq / 10000) ;
	else
		return (((Xtal_Freq / 1000000) + 1)*100) ;
}

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// Function:       MXL5005_TuneRF                                            //
//                                                                           //
// Description:    Set control names to tune to requested RF_IN frequency    //
//                                                                           //
// Globals:                                                                  //
//                 None                                                      //
//                                                                           //
// Functions used:                                                           //
//                 MXL_SynthRFTGLO_Calc                                      //
//                 MXL5005_ControlWrite                                      //
//				   MXL_GetXtalInt											 //
//                                                                           //
// Inputs:                                                                   //
//                 Tuner       : Tuner structure defined at higher level     //
//                                                                           //
// Outputs:                                                                  //
//                 Tuner                                                     //
//                                                                           //
// Return:                                                                   //
//                 0 : Successful                                            //
//                 1 : Unsuccessful                                          //
///////////////////////////////////////////////////////////////////////////////
_u16 MXL_TuneRF(Tuner_struct *Tuner, _u32 RF_Freq) 
{
	// Declare Local Variables
	_u16 status = 0 ;
	_u32 divider_val = 0, E3, E4, E5, E5A ;
	_u32 Fmax = 0, Fmin = 0, FmaxBin, FminBin ;
	_u32 Kdbl_RF = 2; 
	_u32 tg_divval ;
	_u32 tg_lo ;
	_u32 Xtal_Int ;
	
	_u32 Fref_TG;
	_u32 Fvco;
//	_u32 temp;


	Xtal_Int = MXL_GetXtalInt(Tuner->Fxtal ) ;

	Tuner->RF_IN = RF_Freq ;

	MXL_SynthRFTGLO_Calc( Tuner ) ;

	if (Tuner->Fxtal >= 12000000UL && Tuner->Fxtal <= 22000000UL)
		Kdbl_RF = 2 ;
	if (Tuner->Fxtal > 22000000 && Tuner->Fxtal <= 32000000)
		Kdbl_RF = 1 ;

⌨️ 快捷键说明

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