📄 tmbsltda18211.c
字号:
// 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 + -