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

📄 tmbsltda18211.c

📁 TDA8211芯片驱动程序
💻 C
📖 第 1 页 / 共 5 页
字号:
		// MAIN pll charge pump source
		pObj->I2CMap.uBx13.bF.LO_ForceSrce = 0x01;
		// write byte EXTENDED_BYTE_4
		if (TDA18211Write(pObj,0x13,1) != True)
			return TMBSL_ERR_IIC_ERR;

		// wait 1 ms for charge pump source
		if (TDA18211Wait(pObj,1) == False)
			return TM_FALSE;

		// MAIN pll normal operation
		pObj->I2CMap.uBx13.bF.LO_ForceSrce = 0x00;
		// write byte EXTENDED_BYTE_4
		if (TDA18211Write(pObj,0x13,1) != True)
			return TMBSL_ERR_IIC_ERR;

		// wait 5 ms for pll locking
		if (TDA18211Wait(pObj,5) == False)
			return TM_FALSE;
	}
	else // slave
	{		
		// calculate CAL PLL
		if (TDA18211CalcCALPLL(pObj, uRF + pObj->Config.uIF) == False)
			return TM_FALSE;

		// copy CAL PLL PostDiv to MAIN PLL Post Div
		pObj->I2CMap.uBx0C.bF.MAIN_Post_Div = pObj->I2CMap.uBx08.CAL_POST_DIV_BYTE & 0x7F;

		// write bytes 0x01 to 0x0F
		if (TDA18211Write(pObj,0x01,15) != True)
			return TMBSL_ERR_IIC_ERR;    

		// CAL pll charge pump source
		pObj->I2CMap.uBx16.bF.CAL_ForceSrce = 0x01;
		// write byte EXTENDED_BYTE_7
		if (TDA18211Write(pObj,0x16,1) != True)
			return TMBSL_ERR_IIC_ERR;

		// wait 1 ms for charge pump source
		if (TDA18211Wait(pObj,1) == False)
			return TM_FALSE;

		// CAL pll normal operation
		pObj->I2CMap.uBx16.bF.CAL_ForceSrce = 0x00;
		// write byte EXTENDED_BYTE_7
		if (TDA18211Write(pObj,0x16,1) != True)
			return TMBSL_ERR_IIC_ERR;

		// wait 5 ms for pll locking
		if (TDA18211Wait(pObj,5) == False)
			return TM_FALSE;
	}

	// read bytes 0x00 to 0x26
	if (TDA18211Read (pObj,0x00,39) != True)
		return TMBSL_ERR_IIC_ERR;

	return TM_OK;
}


//-------------------------------------------------------------------------------------
// FUNCTION:    tmbslTDA18211GetRf:
//
// DESCRIPTION: Get the frequency programmed in the tuner
//
// RETURN:      TMBSL_ERR_TUNER_BAD_UNIT_NUMBER
//              TMBSL_ERR_TUNER_NOT_INITIALIZED
//              TM_OK
//
// NOTES:       The value returned is the one stored in the Object
//-------------------------------------------------------------------------------------
//
tmErrorCode_t
TMBSL_FUNC(GetRf)
(
 tmUnitSelect_t		TunerUnit,		//  I: Tuner unit number
 UInt32*				pRF				//  O: RF frequency in hertz
 )
{
	ptmTDA18211Object_t		pObj;

	//------------------------------
	// test input parameters
	//------------------------------
	// test the instance number
	if (TunerUnit > TDA18211_MAX_UNITS)
		return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER;

	// test the Object
	if (gTDA18211Instance[TunerUnit].init == False)
		return TMBSL_ERR_TUNER_NOT_INITIALIZED;

	// pObj initialization
	pObj = &gTDA18211Instance[TunerUnit];

	//----------------------
	// get the value
	//----------------------
	// the read function can't be used
	*pRF = pObj->Config.uRF;

	return TM_OK;
}


//-----------------------------------------------------------------------------
// Internal functions:
//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
// FUNCTION:    TDA18211Init:
//
// DESCRIPTION: initialization of the Tuner
//
// RETURN:      always True
//
// NOTES:       
//-----------------------------------------------------------------------------
//
tmErrorCode_t
TDA18211Init (
			  tmUnitSelect_t			TunerUnit	// I: Tuner Object
			  )
{ 	
	tmErrorCode_t ret = TM_FALSE;
	ptmTDA18211Object_t		pObj;

	//------------------------------
	// test input parameters
	//------------------------------
	// test the instance number
	if (TunerUnit > TDA18211_MAX_UNITS)
		return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER;

	// test the Object
	if (gTDA18211Instance[TunerUnit].init == False)
		return TMBSL_ERR_TUNER_NOT_INITIALIZED;

	// pObj initialization
	pObj = &gTDA18211Instance[TunerUnit];

	//----------------------
	// configuration reset
	//----------------------
	// set power level indicator to off
	pObj->Config.uPLMODE = 1;

	//----------------------
	// I2C map initialization
	//----------------------
	// set & write all bytes
	pObj->I2CMap.uBx01.THERMO_BYTE = 0x08;
	pObj->I2CMap.uBx02.POWER_LEVEL_BYTE = 0x80;
	pObj->I2CMap.uBx03.EASY_PROG_BYTE_1 = 0xC6;
	pObj->I2CMap.uBx04.EASY_PROG_BYTE_2 = 0xDF;
	pObj->I2CMap.uBx05.EASY_PROG_BYTE_3 = 0x16;
	pObj->I2CMap.uBx06.EASY_PROG_BYTE_4 = 0x60;
	pObj->I2CMap.uBx07.EASY_PROG_BYTE_5 = 0x80;
	pObj->I2CMap.uBx08.CAL_POST_DIV_BYTE = 0x80;
	pObj->I2CMap.uBx09.CAL_DIV_BYTE_1 = 0x00;
	pObj->I2CMap.uBx0A.CAL_DIV_BYTE_2 = 0x00;
	pObj->I2CMap.uBx0B.CAL_DIV_BYTE_3 = 0x00;
	pObj->I2CMap.uBx0C.MAIN_POST_DIV_BYTE = 0x00;
	pObj->I2CMap.uBx0D.MAIN_DIV_BYTE_1 = 0x00;
	pObj->I2CMap.uBx0E.MAIN_DIV_BYTE_2 = 0x00;
	pObj->I2CMap.uBx0F.MAIN_DIV_BYTE_3 = 0x00;
	pObj->I2CMap.uBx10.EXTENDED_BYTE_1 = 0xFC;	// AGC1 bits set to 0
	pObj->I2CMap.uBx11.EXTENDED_BYTE_2 = 0x01;
	pObj->I2CMap.uBx12.EXTENDED_BYTE_3 = 0x84;
	pObj->I2CMap.uBx13.EXTENDED_BYTE_4 = 0x41;
	pObj->I2CMap.uBx14.EXTENDED_BYTE_5 = 0x01;
	pObj->I2CMap.uBx15.EXTENDED_BYTE_6 = 0x84;
	pObj->I2CMap.uBx16.EXTENDED_BYTE_7 = 0x40;
	pObj->I2CMap.uBx17.EXTENDED_BYTE_8 = 0x07;
	pObj->I2CMap.uBx18.EXTENDED_BYTE_9 = 0x00;
	pObj->I2CMap.uBx19.EXTENDED_BYTE_10 = 0x00;
	pObj->I2CMap.uBx1A.EXTENDED_BYTE_11 = 0x96;
	pObj->I2CMap.uBx1B.EXTENDED_BYTE_12 = 0x33;  // AGC12_Speed set to 2KHz 
	pObj->I2CMap.uBx1C.EXTENDED_BYTE_13 = 0xC1;
	pObj->I2CMap.uBx1D.EXTENDED_BYTE_14 = 0x00;
	pObj->I2CMap.uBx1E.EXTENDED_BYTE_15 = 0x8F;
	pObj->I2CMap.uBx1F.EXTENDED_BYTE_16 = 0x00;
	pObj->I2CMap.uBx20.EXTENDED_BYTE_17 = 0x00;
	pObj->I2CMap.uBx21.EXTENDED_BYTE_18 = 0x8C;  // AGC1_DO_Step set to 8
	pObj->I2CMap.uBx22.EXTENDED_BYTE_19 = 0x00;
	pObj->I2CMap.uBx23.EXTENDED_BYTE_20 = 0x20;
	pObj->I2CMap.uBx24.EXTENDED_BYTE_21 = 0xB3;
	pObj->I2CMap.uBx25.EXTENDED_BYTE_22 = 0x48;
	pObj->I2CMap.uBx26.EXTENDED_BYTE_23 = 0xB0;
	if (TDA18211Write(pObj,0x01,38) != True)
		return TMBSL_ERR_IIC_ERR;

	//----------------------
	// AGC1 gain setup
	//----------------------
	// AGC1_Gain_do
	// update & write EXTENDED_BYTE_17
	pObj->I2CMap.uBx20.EXTENDED_BYTE_17 = 0x00;	// set gain_do address
	if (TDA18211Write(pObj,0x20,1) != True)
		return TMBSL_ERR_IIC_ERR;
	pObj->I2CMap.uBx20.EXTENDED_BYTE_17 = 0x03;	// keep gain_do address, set gain_do 
	if (TDA18211Write(pObj,0x20,1) != True)
		return TMBSL_ERR_IIC_ERR;

	// AGC1_Gain_up
	// update & write EXTENDED_BYTE_17
	pObj->I2CMap.uBx20.EXTENDED_BYTE_17 = 0x43;	// set gain_up address, keep gain_do 
	if (TDA18211Write(pObj,0x20,1) != True)
		return TMBSL_ERR_IIC_ERR;
	pObj->I2CMap.uBx20.EXTENDED_BYTE_17 = 0x4C;	// keep gain_up address, set gain_up 
	if (TDA18211Write(pObj,0x20,1) != True)
		return TMBSL_ERR_IIC_ERR;

	//----------------------
	// image rejection calibration - low band
	//----------------------
	// initialisation
	pObj->I2CMap.uBx05.EASY_PROG_BYTE_3 = 0x1F;
	pObj->I2CMap.uBx06.EASY_PROG_BYTE_4 = 0x66;
	pObj->I2CMap.uBx07.EASY_PROG_BYTE_5 = 0x81;
	pObj->I2CMap.uBx08.CAL_POST_DIV_BYTE = 0xCC;
	pObj->I2CMap.uBx09.CAL_DIV_BYTE_1 = 0x6C;
	pObj->I2CMap.uBx0A.CAL_DIV_BYTE_2 = 0x00;
	pObj->I2CMap.uBx0B.CAL_DIV_BYTE_3 = 0x00;
	pObj->I2CMap.uBx0C.MAIN_POST_DIV_BYTE = 0xCD;
	pObj->I2CMap.uBx0D.MAIN_DIV_BYTE_1 = 0x77;
	pObj->I2CMap.uBx0E.MAIN_DIV_BYTE_2 = 0x08;
	pObj->I2CMap.uBx0F.MAIN_DIV_BYTE_3 = 0x00;
	// write bytes EASY_PROG_BYTE_2 to MAIN_DIV_BYTE_3
	if (TDA18211Write(pObj,0x04,12) != True)
		return TMBSL_ERR_IIC_ERR;

	// wait 5 ms for pll locking
	if (TDA18211Wait(pObj,5) == False)
		return TM_FALSE;

	// launch detector
	// write byte EASY_PROG_BYTE_1
	if (TDA18211Write(pObj,0x03,1) != True)
		return TMBSL_ERR_IIC_ERR;

	// wait 5 ms for wanted measurement
	if (TDA18211Wait(pObj,5) == False)
		return TM_FALSE;

	// CAL pll update
	pObj->I2CMap.uBx07.EASY_PROG_BYTE_5 = 0x85;
	pObj->I2CMap.uBx08.CAL_POST_DIV_BYTE = 0xCB; 
	pObj->I2CMap.uBx09.CAL_DIV_BYTE_1 = 0x66;
	pObj->I2CMap.uBx0A.CAL_DIV_BYTE_2 = 0x70;

	// write bytes EASY_PROG_BYTE_3 to CAL_DIV_BYTE_3
	if (TDA18211Write(pObj,0x05,7) != True)
		return TMBSL_ERR_IIC_ERR;

	// wait 5 ms for pll locking
	if (TDA18211Wait(pObj,5) == False)
		return TM_FALSE;

	// launch optimisation algorithm
	// write byte EASY_PROG_BYTE_2
	if (TDA18211Write(pObj,0x04,1) != True)
		return TMBSL_ERR_IIC_ERR;

	// wait 30 ms for image optimization completion
	if (TDA18211Wait(pObj,30) == False)
		return TM_FALSE;

	//----------------------
	// image rejection calibration - mid band
	//----------------------
	// initialisation
	pObj->I2CMap.uBx07.EASY_PROG_BYTE_5 = 0x82;
	pObj->I2CMap.uBx08.CAL_POST_DIV_BYTE = 0xA8;
	pObj->I2CMap.uBx0A.CAL_DIV_BYTE_2 = 0x00;
	pObj->I2CMap.uBx0C.MAIN_POST_DIV_BYTE = 0xA9;
	pObj->I2CMap.uBx0D.MAIN_DIV_BYTE_1 = 0x73;
	pObj->I2CMap.uBx0E.MAIN_DIV_BYTE_2 = 0x1A;
	// write bytes EASY_PROG_BYTE_3 to MAIN_DIV_BYTE_3
	if (TDA18211Write(pObj,0x05,11) != True)
		return TMBSL_ERR_IIC_ERR;

	// wait 5 ms for pll locking
	if (TDA18211Wait(pObj,5) == False)
		return TM_FALSE;

	// launch detector
	// write byte EASY_PROG_BYTE_1
	if (TDA18211Write(pObj,0x03,1) != True)
		return TMBSL_ERR_IIC_ERR;

	// wait 5 ms for wanted measurement
	if (TDA18211Wait(pObj,5) == False)
		return TM_FALSE;

	// CAL pll update
	pObj->I2CMap.uBx07.EASY_PROG_BYTE_5 = 0x86;
	pObj->I2CMap.uBx08.CAL_POST_DIV_BYTE = 0xA8;
	pObj->I2CMap.uBx09.CAL_DIV_BYTE_1 = 0x66;
	pObj->I2CMap.uBx0A.CAL_DIV_BYTE_2 = 0xA0;

	// write bytes EASY_PROG_BYTE_3 to CAL_DIV_BYTE_3
	if (TDA18211Write(pObj,0x05,7) != True)
		return TMBSL_ERR_IIC_ERR;

	// wait 5 ms for pll locking
	if (TDA18211Wait(pObj,5) == False)
		return TM_FALSE;

	// launch optimisation algorithm
	// write byte EASY_PROG_BYTE_2
	if (TDA18211Write(pObj,0x04,1) != True)
		return TMBSL_ERR_IIC_ERR;

	// wait 30 ms for image optimization completion
	if (TDA18211Wait(pObj,30) == False)
		return TM_FALSE;

	//----------------------
	// image rejection calibration - high band
	//----------------------
	// initialisation
	pObj->I2CMap.uBx07.EASY_PROG_BYTE_5 = 0x83;
	pObj->I2CMap.uBx08.CAL_POST_DIV_BYTE = 0x98;
	pObj->I2CMap.uBx09.CAL_DIV_BYTE_1 = 0x65;
	pObj->I2CMap.uBx0A.CAL_DIV_BYTE_2 = 0x00;
	pObj->I2CMap.uBx0C.MAIN_POST_DIV_BYTE = 0x99;
	pObj->I2CMap.uBx0D.MAIN_DIV_BYTE_1 = 0x71;
	pObj->I2CMap.uBx0E.MAIN_DIV_BYTE_2 = 0xCD;		
	// write bytes EASY_PROG_BYTE_3 to CAL_DIV_BYTE_3
	if (TDA18211Write(pObj,0x05,11) != True)
		return TMBSL_ERR_IIC_ERR;

	// wait 5 ms for pll locking
	if (TDA18211Wait(pObj,5) == False)
		return TM_FALSE;

	// launch detector
	// write byte EASY_PROG_BYTE_1
	if (TDA18211Write(pObj,0x03,1) != True)
		return TMBSL_ERR_IIC_ERR;

	// wait 5 ms for wanted measurement
	if (TDA18211Wait(pObj,5) == False)
		return TM_FALSE;

	// CAL pll update
	pObj->I2CMap.uBx07.EASY_PROG_BYTE_5 = 0x87;
	pObj->I2CMap.uBx09.CAL_DIV_BYTE_1 = 0x65;
	pObj->I2CMap.uBx0A.CAL_DIV_BYTE_2 = 0x50;

	// write bytes EASY_PROG_BYTE_3 to CAL_DIV_BYTE_3
	if (TDA18211Write(pObj,0x05,7) != True)
		return TMBSL_ERR_IIC_ERR;

	// wait 5 ms for pll locking
	if (TDA18211Wait(pObj,5) == False)
		return TM_FALSE;

	// launch optimisation algorithm
	// write byte EASY_PROG_BYTE_2
	if (TDA18211Write(pObj,0x04,1) != True)
		return TMBSL_ERR_IIC_ERR;

	// wait 30 ms for image optimization completion
	if (TDA18211Wait(pObj,30) == False)
		return TM_FALSE;

	//----------------------
	// back to normal mode
	//----------------------
	// update & write byte EASY_PROG_BYTE_4
	pObj->I2CMap.uBx06.EASY_PROG_BYTE_4 = 0x64;
	if (TDA18211Write(pObj,0x06,1) != True)
		return TMBSL_ERR_IIC_ERR;

	// synchronization
	// write byte EASY_PROG_BYTE_1
	if (TDA18211Write(pObj,0x03,1) != True)
		return TMBSL_ERR_IIC_ERR;

	//----------------------
	// RF tracking filters calibration
	//----------------------
	ret = TDA18211CalcRFFilterCurve(pObj);
	if (ret != TM_OK)
		return ret;

	//----------------------
	// back to POR mode
	//----------------------
	// power up detector 1
	pObj->I2CMap.uBx1B.bF.PD_AGC1_Det = 0x00;
	// write byte EXTENDED_BYTE_12
	if (TDA18211Write(pObj,0x1B,1) != True)
		return TMBSL_ERR_IIC_ERR;

	// turn AGC1 loop on
	pObj->I2CMap.uBx21.bF.AGC1_loop_off = 0x00;
	// set AGC1Gain = 6dB
	pObj->I2CMap.uBx21.bF.AGC1_Gain = 0x00;
	// write byte EXTENDED_BYTE_18
	if (TDA18211Write(pObj,0x21,1) != True)
		return TMBSL_ERR_IIC_ERR;

	// set AGC2Gain = -6dB
	pObj->I2CMap.uBx24.bF.AGC2_Gain = 0x03;

	// swicth to POR mode
	pObj->I2CMap.uBx05.bF.SM = 0x01;
	pObj->I2CMap.uBx05.bF.SM_LT = 0x00;
	pObj->I2CMap.uBx05.bF.SM_XT = 0x00;
	// write byte EASY_PROG_BYTE_3
	if (TDA18211Write(pObj,0x5,1) != True)
		return TMBSL_ERR_IIC_ERR;

	// disable 1.5MHz low pass filter
	pObj->I2CMap.uBx26.bF.ForceLP_Fc2_En = 0x00;
	pObj->I2CMap.uBx26.bF.LP_Fc = 0x00;

	// write bytes EXTENDED_BYTE_21 to EXTENDED_BYTE_23
	if (TDA18211Write(pObj,0x24,3) != True)
		return TMBSL_ERR_IIC_ERR;

	return TRUE;
}


//-----------------------------------------------------------------------------
// FUNCTION:    TDA18211InitTick
//
// DESCRIPTI

⌨️ 快捷键说明

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