📄 tmbsl10086.c
字号:
tmErrorCode_t
tmbsl10086WriteBit (
tmUnitSelect_t demodUnit, // I: Demod unit number
UInt32 uIndex, // I: Index to write
UInt32 uBitMask, // I: byte mask
UInt32 uByte // I: value
)
{
//----------------------
// test input parameters
//----------------------
// test the instance number
if (demodUnit > TDA10086_MAX_UNITS)
return TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER;
// test the object
if (g10086Instance[demodUnit].Init == False)
return TMBSL_ERR_DEMOD_NOT_INITIALIZED;
//----------------------
// Core function
//----------------------
if (g10086Instance[demodUnit].systemFunc.SY_WriteBit(
g10086Instance[demodUnit].uDemodHwAdd,
uIndex,
uBitMask,
uByte) != True)
return TM_ERR_IIC_ERR;
return TM_OK;
}
//-----------------------------------------------------------------------------
// FUNCTION: tmbsl10086Read
//
// DESCRIPTION: this function reads bytes
//
// RETURN: TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER
// TMBSL_ERR_DEMOD_NOT_INITIALIZED
// TM_ERR_IIC_ERR
// TM_OK
//
// NOTES:
//-----------------------------------------------------------------------------
//
tmErrorCode_t
tmbsl10086Read (
tmUnitSelect_t demodUnit, // I: Demod unit number
UInt32 uIndex, // I: Start index to write
UInt32 uNbBytes, // I: Number of bytes to read
UInt32* puBytes // O: Pointer on an array of bytes
)
{
//----------------------
// test input parameters
//----------------------
// test the instance number
if (demodUnit > TDA10086_MAX_UNITS)
return TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER;
// test the object
if (g10086Instance[demodUnit].Init == False)
return TMBSL_ERR_DEMOD_NOT_INITIALIZED;
//----------------------
// Core function
//----------------------
if (g10086Instance[demodUnit].systemFunc.SY_Read(
g10086Instance[demodUnit].uDemodHwAdd,
uIndex,
uNbBytes,
puBytes) != True)
return TM_ERR_IIC_ERR;
return TM_OK;
}
//-----------------------------------------------------------------------------
// Demod-Tuner programming functions:
//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
// FUNCTION: Tda10086WriteInit
//
// DESCRIPTION: reset the TDA10086 and start all algo.
//
// RETURN: True if OK else False
//
// NOTES:
//-----------------------------------------------------------------------------
//
tmErrorCode_t
Tda10086WriteInit (
tm10086object_t *psObject
)
{
UInt32 uByte, puByte[6];
volatile UInt32 uLong1, uLong2;
//--------------
// set the value
//--------------
// calculate the system frequency
psObject->uSysClk = psObject->sConfig.uXtall*(psObject->sConfig.bPLL_M_Factor+1);
psObject->uSysClk /= (psObject->sConfig.bPLL_P_Factor+1);
// CLEAR CARC CSWP CARINIT RHYC AGCRN
puByte[0] = TDA10086_CLEAR_DEF;
puByte[1] = TDA10086_CARCTRACKING_DEF;
puByte[2] = TDA10086_CSWP_DEF;
puByte[3] = TDA10086_CARINIT_DEF;
puByte[4] = TDA10086_RHYC_DEF;
puByte[5] = TDA10086_AGCRN_DEF;
if (psObject->sConfig.bPolaAGC)
puByte[5] |= TDA10086_PWMS_BIT;
if (psObject->systemFunc.SY_Write(
psObject->uDemodHwAdd,
TDA10086_CLEAR_IND,
6,
puByte) != True)
return TM_ERR_IIC_ERR;
// POLA1 POLA2
puByte[0] = TDA10086_POLA_DEF;
if (psObject->sConfig.bOUT1_POClk)
puByte[0] |= TDA10086_POLA_POCLK_BIT;
puByte[1] = TDA10086_POLA_DEF;
if (psObject->sConfig.bOUT2_POClk)
puByte[1] |= TDA10086_POLA_POCLK_BIT;
psObject->systemFunc.SY_Write(
psObject->uDemodHwAdd,
TDA10086_POLA1_IND,
2,
puByte);
// FREQ_NCO
Tda10086WriteNCO(psObject);
// WPLL_DIV
uByte = TDA10086_VBER_MSB_DEF;
psObject->systemFunc.SY_Write(
psObject->uDemodHwAdd,
TDA10086_VBERMSB_IND,
1,
&uByte);
// TS_INT MODE
puByte[0] = psObject->sConfig.bOUT1_ParBDiv << 2;
puByte[1] = psObject->sConfig.bBerDepth << 4;
if (psObject->sConfig.bOUT1_ParaSer == TDA10086_SERIAL_VAL)
{
puByte[0] |= TDA10086_TSINT_SERINT_BIT;
if (psObject->sConfig.bOUT1_ModeABC == TDA10086_MODE_B_VAL)
puByte[1] |= TDA10086_MODE_PARC_SERB_BIT;
}
else
{
if (psObject->sConfig.bOUT1_ModeABC == TDA10086_MODE_B_VAL)
puByte[0] |= TDA10086_TSINT_PARMOD_BIT;
if (psObject->sConfig.bOUT1_ModeABC == TDA10086_MODE_C_VAL)
{
puByte[0] |= TDA10086_TSINT_PARMOD_BIT;
puByte[1] |= TDA10086_MODE_PARC_SERB_BIT;
}
}
// in parallel mode, MSB First is forced otherwise bits are swapped
if (psObject->sConfig.bOUT1_ParaSer == TDA10086_PARALLEL_VAL)
psObject->sConfig.bOUT1_MSBFirst = TDA10086_MSB_FIRST_VAL;
if (psObject->sConfig.bOUT1_MSBFirst == TDA10086_MSB_FIRST_VAL)
puByte[0] |= TDA10086_TSINT_MSBFIRST_BIT;
if (psObject->sConfig.bDSS_DVB == (UInt8)tmhalFEStandardDVBS)
puByte[1] |= TDA10086_MODE_STD_BIT;
if (psObject->sConfig.bOUT2_MSBFirst)
puByte[1] |= TDA10086_TSINT_MSBFIRST_BIT;
if (psObject->sConfig.bOUT2_ModeAB == TDA10086_MODE_B_VAL)
puByte[1] |= TDA10086_MODE_SERB_BIT;
psObject->systemFunc.SY_Write(
psObject->uDemodHwAdd,
TDA10086_TSINT_IND,
2,
puByte);
// power down the PLL
uByte = TDA10086_PLLP4_DEF;
psObject->systemFunc.SY_Write(
psObject->uDemodHwAdd,
TDA10086_PLLP4_IND,
1,
&uByte);
// program the PLL
puByte[0] = psObject->sConfig.bPLL_M_Factor;
puByte[1] = psObject->sConfig.bPLL_P_Factor;
psObject->systemFunc.SY_Write(
psObject->uDemodHwAdd,
TDA10086_PLLP1_IND,
2,
puByte);
// power up the PLL
uByte = TDA10086_PLLP4_DEF & ~TDA10086_PLLP4_PDPLL_BIT;
psObject->systemFunc.SY_Write(
psObject->uDemodHwAdd,
TDA10086_PLLP4_IND,
1,
&uByte);
// ADCONF
uByte = TDA10086_ADCONF_DEF;
psObject->systemFunc.SY_Write(
psObject->uDemodHwAdd,
TDA10086_ADCONF_IND,
1,
&uByte);
// AFC1
uByte = TDA10086_AFC1_DEF;
psObject->systemFunc.SY_Write(
psObject->uDemodHwAdd,
TDA10086_AFC1_IND,
1,
&uByte);
// H22K_LSB and H22K_MSB (0xABE00000 = 22000*2^19 divide by 4)
uLong1 = psObject->uSysClk >> 2;
uLong2 = (0xABE00000 + uLong1/2)/uLong1;
puByte[0] = (UInt8)uLong2;
puByte[1] = (UInt8)(uLong2 >> 8);
psObject->systemFunc.SY_Write(
psObject->uDemodHwAdd,
TDA10086_H22KLSB_IND,
2,
puByte);
// FTUNMSB (POSMUL)
psObject->systemFunc.SY_WriteBit(
psObject->uDemodHwAdd,
TDA10086_FTUNMSB_IND,
TDA10086_FTUNMSB_POSMUL_MSK,
TDA10086_FTUNMSB_POSMUL_MSK);
// AGCRA AGCA GTR1
if((psObject->sConfig.uBoard & 0xffff0000) == OM5761_BOARD_DEF)
{
// For OM5761 board (TDA8262 tuner), remove the 3 dB attenuation
puByte[0] = TDA10086_AGCRA_OM5761_DEF;
}
else
{
// puByte[0] = TDA10086_AGCRA_OM57XX_DEF;
puByte[0] = TDA10086_AGCRA_DEF;
}
puByte[1] = TDA10086_AGCA_DEF;
puByte[2] = TDA10086_GTR1_DEF;
psObject->systemFunc.SY_Write(
psObject->uDemodHwAdd,
TDA10086_AGCRA_IND,
3,
puByte);
if (((psObject->sConfig.bOUT1_ParaSer == TDA10086_SERIAL_VAL) &&
(psObject->sConfig.bOUT1_ModeABC == TDA10086_MODE_B_VAL)) ||
(psObject->sConfig.bOUT2_ModeAB == TDA10086_MODE_B_VAL))
{
// WPLL1: Power up the WPLL
uByte = TDA10086_WPLL1_ON_DEF;
psObject->systemFunc.SY_Write(
psObject->uDemodHwAdd,
TDA10086_WPLL1_IND,
1,
&uByte);
// WPLL2: don't bypass the WPLL
uByte = TDA10086_WPLL2_ON_DEF;
psObject->systemFunc.SY_Write(
psObject->uDemodHwAdd,
TDA10086_WPLL2_IND,
1,
&uByte);
}
else
{
// WPLL1: Power down the WPLL
uByte = TDA10086_WPLL1_OFF_DEF;
psObject->systemFunc.SY_Write(
psObject->uDemodHwAdd,
TDA10086_WPLL1_IND,
1,
&uByte);
// WPLL2: bypass the WPLL
uByte = TDA10086_WPLL2_OFF_DEF;
psObject->systemFunc.SY_Write(
psObject->uDemodHwAdd,
TDA10086_WPLL2_IND,
1,
&uByte);
}
// ADC_C1 - workaround for ADC startup sensitivity
if((psObject->sConfig.uBoard & 0xffff0000) == OM5761_BOARD_DEF)
{
// For OM5761 board (TDA8262 tuner), remove the 3 dB attenuation
uByte = TDA10086_ADC_C1_OM5761_DEF | 0x01;
}
else
{
uByte = TDA10086_ADC_C1_OM57XX_DEF | 0x01;
}
psObject->systemFunc.SY_Write(
psObject->uDemodHwAdd,
TDA10086_ADC_C1_IND,
1, &uByte);
//uByte = TDA10086_ADC_C1_DEF;
uByte &= 0xFE;
psObject->systemFunc.SY_Write(
psObject->uDemodHwAdd,
TDA10086_ADC_C1_IND,
1, &uByte);
//
// Modify the threshold for RxSig
uByte = NTHR;
psObject->systemFunc.SY_Write(
psObject->uDemodHwAdd,
TDA10086_NTHR_IND,
1, &uByte);
//
return TM_OK;
}
//-----------------------------------------------------------------------------
// FUNCTION: tmbsl10086SetRF
//
// DESCRIPTION: this function will program the tuner and the complex
// multiplier if needed. FTUN[15:0] = 2^16*FreqOffset/FreqSystem
//
// RETURN: TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER
// TMBSL_ERR_DEMOD_NOT_INITIALIZED
// TM_OK
//
// NOTES:
//-----------------------------------------------------------------------------
//
tmErrorCode_t
tmbsl10086SetRF (
tmUnitSelect_t demodUnit, // I: Demod unit number
UInt32 uRF // I: RF freqency (Hz)
)
{
//----------------------
// test input parameters
//----------------------
// test the instance number
if (demodUnit > TDA10086_MAX_UNITS)
return TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER;
// test the object
if (g10086Instance[demodUnit].Init == False)
return TMBSL_ERR_DEMOD_NOT_INITIALIZED;
// test the parameter value
if (uRF < TDA10086_RF_MIN || uRF > TDA10086_RF_MAX)
return TMBSL_ERR_DEMOD_BAD_PARAMETER;
//----------------------
// Core function
//----------------------
if (Tda10086WriteRF(&g10086Instance[demodUnit], &uRF) == False)
return TM_FALSE;
// start algo
g10086Instance[demodUnit].bStartAlgo = True;
// update return value
g10086Instance[demodUnit].sCurrentChannel.uRF = uRF;
return TM_OK;
}
//-----------------------------------------------------------------------------
// FUNCTION: tmbsl10086GetRF
//
// DESCRIPTION: this function gets the current RF Frequency.
//
// RETURN: TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER
// TMBSL_ERR_DEMOD_NOT_INITIALIZED
// TM_OK
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -