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

📄 tmbsltda18211.c

📁 TDA8211芯片驱动程序
💻 C
📖 第 1 页 / 共 5 页
字号:
		// get PLAGC1 value
		*puValue = 3 * (2 + ((pObj->I2CMap.uBx02.bF.Power_Level_7_to_0 & 0x7F) >> 5));
		break;

	case PLAGC2:
		// get PLAGC2 value
		*puValue = 3 * (2 + (3 - (pObj->I2CMap.uBx03.bF.Power_Level_8 << 1 | pObj->I2CMap.uBx02.bF.Power_Level_7_to_0 >> 7)));
		break;

	case PLRFAGC:
		// get PLRFAGC value (PLRFAGC = PLRFAGC - 11)
		if (((pObj->I2CMap.uBx25.EXTENDED_BYTE_22 & 0x7F) >> 4) < 5)
			*puValue = 11 + (92 + 2 * ((pObj->I2CMap.uBx25.EXTENDED_BYTE_22 & 0x7F) >> 4)) - (103 - (pObj->I2CMap.uBx02.bF.Power_Level_7_to_0 & 0x1F));
		else
			*puValue = 11 + 102 - (103 - (pObj->I2CMap.uBx02.bF.Power_Level_7_to_0 & 0x1F));
		// limit PLRFAGC value
		if (*puValue > 33)
			*puValue = 33;
		else if (*puValue < 1)
			*puValue = 1;
		break;

	case RFCALOK:
		// get RFCALOK value
		*puValue = pObj->I2CMap.uBx03.bF.RF_CAL_OK;
		break;

	case RFCAL_TCOMP:
		// get RFCAL_TCOMP value
		*puValue = pObj->Config.uRFCAL_TCOMP;
		break;

	case IRCALOK:
		// get IRCALOK value
		*puValue = pObj->I2CMap.uBx03.bF.IR_CAL_OK;
		break;

	case BPFILTER:
		// get BPFILTER value
		*puValue = pObj->I2CMap.uBx03.bF.BP_Filter;
		break;

	case RFBAND:
		// get RFBAND value
		*puValue = pObj->I2CMap.uBx04.bF.RF_Band;
		break;

	case GAINTAPER:
		// get GAINTAPER value
		*puValue = pObj->I2CMap.uBx04.bF.Gain_Taper;
		break;

	case POWERSTATE:
		// get POWERSTATE
		TDA18211GetPowerState(pObj,(ptmTDA18211PowerState_t)puValue);
		break;

	case LPFC:
		// get LPFC value
		*puValue = pObj->I2CMap.uBx05.bF.Std & 0x03;
		break;


	case CALRFN:
		*puValue = pObj->I2CMap.uBx06.bF.CAL_RFn;
		break;

	case STANDARDMODE:
		// get STANDARDMODE
		TDA18211GetStandardMode(pObj, (ptmTDA18211StandardMode_t)puValue);
		break;

	case XTOUT:
		// get XTout_ON & Xtout_400mV value
		*puValue = (UInt32)(pObj->I2CMap.uBx06.bF.XTout_ON << 1 | pObj->I2CMap.uBx06.bF.Xtout_400mV);
		break;

	case IFLEVEL:
		// get IFLEVEL value
		*puValue = pObj->I2CMap.uBx06.bF.IF_Level;
		break;

	case EXTENDEDREG:
		// get EXTENDEDREG value
		*puValue = pObj->I2CMap.uBx07.bF.Extended_Reg;
		break;

	case CALPOSTDIV:
		// get CALPOSTDIV value
		*puValue = pObj->I2CMap.uBx08.CAL_POST_DIV_BYTE & 0x7F;
		break;

	case CALDIV:
		// get CALDIV value
		*puValue = pObj->I2CMap.uBx09.bF.CAL_Div_22_to_16 << 16 | pObj->I2CMap.uBx0A.bF.CAL_Div_15_to_8 << 8 | pObj->I2CMap.uBx0B.bF.CAL_Div_7_to_0;
		break;

	case MAINPOSTDIV:
		// get MAINPOSTDIV value
		*puValue = pObj->I2CMap.uBx0C.bF.MAIN_Post_Div;
		break;

	case MAINDIV:
		// get MAINDIV value
		*puValue = pObj->I2CMap.uBx0D.bF.MAIN_Div_22_to_16 << 16 | pObj->I2CMap.uBx0E.bF.MAIN_Div_15_to_8 << 8 | pObj->I2CMap.uBx0F.bF.MAIN_Div_7_to_0;
		break;

	case MAPVALUE:
		// set pointer on wanted cell
		switch (pObj->Config.uMAPNAME)
		{
		case tmTDA18211_IR_MEAS_Map:
			// test map column & row
			if ((pObj->Config.uMAPCOLUMN > TDA18211_IR_MEAS_NB_COLUMNS - 1) || (pObj->Config.uMAPROW > TDA18211_IR_MEAS_NB_ROWS - 1))
				return TM_ERR_NOT_SUPPORTED;
			// pDataMap initialization
			pDataMap = &(pObj->Config.IR_MEAS_Map[pObj->Config.uMAPROW].uRF_Max);
			break;	

		case tmTDA18211_IR_CAL_Map:
			// test map column & row
			if ((pObj->Config.uMAPCOLUMN > TDA18211_IR_CAL_NB_COLUMNS - 1) || (pObj->Config.uMAPROW > TDA18211_IR_CAL_NB_ROWS - 1))
				return TM_ERR_NOT_SUPPORTED;
			// pDataMap initialization
			pDataMap = &(pObj->Config.IR_CAL_Map[pObj->Config.uMAPROW].uRF);
			break;

		case tmTDA18211_BP_FILTER_Map:
			// test map column & row
			if ((pObj->Config.uMAPCOLUMN > TDA18211_BP_FILTER_NB_COLUMNS - 1) || (pObj->Config.uMAPROW > TDA18211_BP_FILTER_NB_ROWS - 1))
				return TM_ERR_NOT_SUPPORTED;
			// pDataMap initialization
			pDataMap = &(pObj->Config.BP_FILTER_Map[pObj->Config.uMAPROW].uRF_Max);
			break;

		case tmTDA18211_RF_BAND_Map:
			// test map column & row
			if ((pObj->Config.uMAPCOLUMN > TDA18211_RF_BAND_NB_COLUMNS - 1) || (pObj->Config.uMAPROW > TDA18211_RF_BAND_NB_ROWS - 1))
				return TM_ERR_NOT_SUPPORTED;
			// pDataMap initialization
			pDataMap = &(pObj->Config.RF_BAND_Map[pObj->Config.uMAPROW].uRF_Max);
			break;	

		case tmTDA18211_GAIN_TAPER_Map:
			// test map column & row
			if ((pObj->Config.uMAPCOLUMN > TDA18211_GAIN_TAPER_NB_COLUMNS - 1) || (pObj->Config.uMAPROW > TDA18211_GAIN_TAPER_NB_ROWS - 1))
				return TM_ERR_NOT_SUPPORTED;
			// pDataMap initialization
			pDataMap = &(pObj->Config.GAIN_TAPER_Map[pObj->Config.uMAPROW].uRF_Max);
			break;

		case tmTDA18211_RF_CAL_Map:
			// test map column & row
			if ((pObj->Config.uMAPCOLUMN > TDA18211_RF_CAL_NB_COLUMNS - 1) || (pObj->Config.uMAPROW > TDA18211_RF_CAL_NB_ROWS - 1))
				return TM_ERR_NOT_SUPPORTED;
			// pDataMap initialization
			pDataMap = &(pObj->Config.RF_CAL_Map[pObj->Config.uMAPROW].uRF_Max);
			break;

		case tmTDA18211_RF_CAL_DC_OVER_DT_Map:
			// test map column & row
			if ((pObj->Config.uMAPCOLUMN > TDA18211_RF_CAL_DC_OVER_DT_NB_COLUMNS - 1) || (pObj->Config.uMAPROW > TDA18211_RF_CAL_DC_OVER_DT_NB_ROWS - 1))
				return TM_ERR_NOT_SUPPORTED;
			// pDataMap initialization
			pDataMap = &(pObj->Config.RF_CAL_DC_OVER_DT_Map[pObj->Config.uMAPROW].uRF_Max);
			break;

		case tmTDA18211_RF_CAL_KMCO_Map:
			// test map column & row
			if ((pObj->Config.uMAPCOLUMN > TDA18211_RF_CAL_KMCO_NB_COLUMNS - 1) || (pObj->Config.uMAPROW > TDA18211_RF_CAL_KMCO_NB_ROWS - 1))
				return TM_ERR_NOT_SUPPORTED;
			// pDataMap initialization
			pDataMap = &(pObj->Config.RF_CAL_KMCO_Map[pObj->Config.uMAPROW].uRF_Max);
			break;

		case tmTDA18211_RF_CAL_CID_TARGET_Map:
			// test map column & row
			if ((pObj->Config.uMAPCOLUMN > TDA18211_RF_CAL_CID_TARGET_NB_COLUMNS - 1) || (pObj->Config.uMAPROW > TDA18211_RF_CAL_CID_TARGET_NB_ROWS - 1))
				return TM_ERR_NOT_SUPPORTED;
			// pDataMap initialization
			pDataMap = &(pObj->Config.RF_CAL_CID_TARGET_Map[pObj->Config.uMAPROW].uRF_Max);
			break;

		case tmTDA18211_THERMOMETER_Map:
			// test map column & row
			if ((pObj->Config.uMAPCOLUMN > TDA18211_THERMOMETER_NB_COLUMNS - 1) || (pObj->Config.uMAPROW > TDA18211_THERMOMETER_NB_ROWS - 1))
				return TM_ERR_NOT_SUPPORTED;
			// pDataMap initialization
			pDataMap = &(pObj->Config.THERMOMETER_Map[pObj->Config.uMAPROW].uTM_D);
			break;	

		case tmTDA18211_CAL_PLL_Map:
			// test map column & row
			if ((pObj->Config.uMAPCOLUMN > TDA18211_CAL_PLL_NB_COLUMNS - 1) || (pObj->Config.uMAPROW > TDA18211_CAL_PLL_NB_ROWS - 1))
				return TM_ERR_NOT_SUPPORTED;
			// pDataMap initialization
			pDataMap = &(pObj->Config.CAL_PLL_Map[pObj->Config.uMAPROW].uLO_Max);
			break;	

		case tmTDA18211_MAIN_PLL_Map:
			// test map column & row
			if ((pObj->Config.uMAPCOLUMN > TDA18211_MAIN_PLL_NB_COLUMNS - 1) || (pObj->Config.uMAPROW > TDA18211_MAIN_PLL_NB_ROWS - 1))
				return TM_ERR_NOT_SUPPORTED;
			// pDataMap initialization
			pDataMap = &(pObj->Config.MAIN_PLL_Map[pObj->Config.uMAPROW].uLO_Max);
			break;

		case tmTDA18211_I2C_Map:
			// test map column & row
			if ((pObj->Config.uMAPCOLUMN > 0) || (pObj->Config.uMAPROW > TDA18211_NB_BYTES - 1))
				return TM_ERR_NOT_SUPPORTED;
			// pI2CMap initialization
			pI2CMap = &(pObj->I2CMap.uBx00.ID_BYTE) + pObj->Config.uMAPROW;
			break;
		}
		// get cell value
		if  (pObj->Config.uMAPNAME == tmTDA18211_I2C_Map)
			*puValue = *(pI2CMap + pObj->Config.uMAPCOLUMN);
		else
			*puValue = *(pDataMap + pObj->Config.uMAPCOLUMN);
		break;

		// backdoor functions
	case IDENTITY:
		pObj->SystemFunc.SY_Read( pObj->uHwAddress, TDA18211_IDENTITY_IND, 1, &uByte); 
		/*if (uByte != 0x82) 
		*puValue = False; 
		else 
		*puValue = True; 
		*/
		switch (pObj->Config.uBoard & 0xffff0000)
		{ 
		case 0x57750000: 
			*puValue = True; 
			break;
		default:
			*puValue = False;
			break;
		}
		break;

	}
	return TM_OK;
}


//-------------------------------------------------------------------------------------
// FUNCTION:    tmbslTDA18211SetRf:
//
// DESCRIPTION: Calculate i2c I2CMap & write in TDA18211
//
// RETURN:      TMBSL_ERR_TUNER_BAD_UNIT_NUMBER
//              TMBSL_ERR_TUNER_NOT_INITIALIZED
//              TMBSL_ERR_TUNER_BAD_PARAMETER
//              TMBSL_ERR_IIC_ERR
//              TM_OK
//
// NOTES:       
//-------------------------------------------------------------------------------------
//
tmErrorCode_t
TMBSL_FUNC(SetRf)
(
 tmUnitSelect_t		TunerUnit,  //  I: Tuner unit number
 UInt32				uRF			//  I: RF frequency in hertz
 )
{	
	tmErrorCode_t ret = TMBSL_ERR_IIC_ERR;

	UInt32	uCounter = 0;
	UInt32	uTMVALUE_CURRENT = 0;

	UInt8	uCprog_table = 0;
	UInt8	uCapprox = 0;

	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];

	// Config.uRF update
	pObj->Config.uRF = uRF;

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

	//----------------------
	// normal mode restore
	//----------------------
	// power up in calibration standard
	pObj->I2CMap.uBx05.bF.SM = 0x00;
	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;

	//----------------------
	// RF tracking filter correction
	//----------------------
	// sense temperature
	ret = TDA18211ThermometerRead(pObj, (UInt8 *)&uTMVALUE_CURRENT);
	if (ret != TM_OK)
		return ret;

	//----------------------
	// frequency dependent parameters update
	//----------------------
	// search for uCprog_table corresponding to uRF
	uCounter = 0;
	do uCounter ++;
	while (uRF > pObj->Config.RF_CAL_Map[uCounter - 1].uRF_Max && uCounter < TDA18211_RF_CAL_NB_ROWS);
	uCprog_table = (UInt8)pObj->Config.RF_CAL_Map[uCounter - 1].uRFC_Cprog;

	// search for sub-band corresponding to uRF
	uCounter = 0;
	do uCounter ++;
	while (uRF > pObj->Config.RF_BAND_Map[uCounter - 1].uRF_Max && uCounter < TDA18211_RF_BAND_NB_ROWS);

	// calculate Capprox
	if (pObj->Config.RF_BAND_Map[uCounter - 1].uRF1 == 0)
	{
		// Capprox = uCprog_table
		uCapprox = uCprog_table;
	}
	else if ((pObj->Config.RF_BAND_Map[uCounter - 1].uRF3 != 0) && (uRF >= pObj->Config.RF_BAND_Map[uCounter - 1].uRF2))
	{
		// Capprox = A2 * (uRF - uRF2) + B2 + uCprog_table
		uCapprox = (Int8)(((pObj->Config.RF_BAND_Map[uCounter - 1].uRF_A2 * ((Int32)(uRF - pObj->Config.RF_BAND_Map[uCounter - 1].uRF2) / 1000000)) / 1000000)
			+ pObj->Config.RF_BAND_Map[uCounter - 1].uRF_B2 + uCprog_table);
	}
	else
	{
		// Capprox = A1 * (uRF - uRF1) + B1 + uCprog_table
		uCapprox = (Int8)(((pObj->Config.RF_BAND_Map[uCounter - 1].uRF_A1 * ((Int32)(uRF - pObj->Config.RF_BAND_Map[uCounter - 1].uRF1) / 1000000)) / 1000000)
			+ pObj->Config.RF_BAND_Map[uCounter - 1].uRF_B1 + uCprog_table);
	}

	// search for udC_Over_dT corresponding to uRF
	uCounter = 0;
	do uCounter ++;
	while (uRF > pObj->Config.RF_CAL_DC_OVER_DT_Map[uCounter - 1].uRF_Max && uCounter < TDA18211_RF_CAL_DC_OVER_DT_NB_ROWS);

	// calculate CTcomp
	pObj->Config.uRFCAL_TCOMP = (Int32)(pObj->Config.RF_CAL_DC_OVER_DT_Map[uCounter - 1].udC_Over_dT * (uTMVALUE_CURRENT - pObj->Config.uTMVALUE_RFCAL)) / 1000;

	// calculate Cprog
	pObj->I2CMap.uBx1D.RFC_Cprog = uCapprox + (Int8)pObj->Config.uRFCAL_TCOMP;

	// write byte RFC_Cprog
	if (TDA18211Write(pObj,0x1D,1) != True)
		return TMBSL_ERR_IIC_ERR;

	//----------------------
	// standard mode update
	//----------------------
	// update TV broadcast parameters
	ret = TDA18211SetStandardMode(pObj, pObj->StandardMode);
	if (ret != TM_OK)
		return ret;

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

	//----------------------
	// update frequency dependent parameters
	//----------------------
	// search for IR_Meas corresponding to wanted frequency
	uCounter = 0;
	do uCounter ++;
	while (uRF > pObj->Config.IR_MEAS_Map[uCounter - 1].uRF_Max && uCounter < TDA18211_IR_MEAS_NB_ROWS);
	pObj->I2CMap.uBx07.bF.IR_Meas = (UInt8)pObj->Config.IR_MEAS_Map[uCounter - 1].uIR_Meas;

	// search for BP_Filter corresponding to uRF
	uCounter = 0;
	do uCounter ++;
	while (uRF > pObj->Config.BP_FILTER_Map[uCounter - 1].uRF_Max && uCounter < TDA18211_BP_FILTER_NB_ROWS);
	pObj->I2CMap.uBx03.bF.BP_Filter = (UInt8)pObj->Config.BP_FILTER_Map[uCounter - 1].uBP_Filter;

	// search for RF_BAND corresponding to uRF
	uCounter = 0;
	do uCounter ++;
	while (uRF > pObj->Config.RF_BAND_Map[uCounter - 1].uRF_Max && uCounter < TDA18211_RF_BAND_NB_ROWS);
	pObj->I2CMap.uBx04.bF.RF_Band = (UInt8)pObj->Config.RF_BAND_Map[uCounter - 1].uRF_Band;

	// search for Gain_Taper corresponding to uRF
	uCounter = 0;
	do uCounter ++;
	while (uRF > pObj->Config.GAIN_TAPER_Map[uCounter - 1].uRF_Max && uCounter < TDA18211_GAIN_TAPER_NB_ROWS);
	pObj->I2CMap.uBx04.bF.Gain_Taper = (UInt8)pObj->Config.GAIN_TAPER_Map[uCounter - 1].uGain_Taper;

	//---------------------
	// dual tuner and AGC1 extra configuration management
	//---------------------
	// use MAIN VCO when master, CAL VCO when slave
	pObj->I2CMap.uBx10.bF.CALVCO_forLOn = (TunerUnit == 0) ? 1 : 0;

	// AGC1 & AGC2 management
	pObj->I2CMap.uBx10.bF.AGC1_always_mastern = 0x00;
	pObj->I2CMap.uBx10.bF.AGC1_firstn = 0x00;

	// write byte EXTENDED_BYTE_1
	if (TDA18211Write(pObj,0x10,1) != True)
		return TMBSL_ERR_IIC_ERR;

	//---------------------
	// tune to wanted channel frequency
	//---------------------
	// use MAIN VCO when master, CAL VCO when slave
	if (TunerUnit == 0) // master
	{
		// calculate MAIN PLL
		if (TDA18211CalcMAINPLL(pObj, uRF + pObj->Config.uIF) == False)
			return TM_FALSE;

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

⌨️ 快捷键说明

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