📄 tmbsl10086.c
字号:
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
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
uByte = TDA10086_ADC_C1_DEF | 0x01;
psObject->systemFunc.SY_Write(
psObject->uDemodHwAdd,
TDA10086_ADC_C1_IND,
1, &uByte);
uByte = TDA10086_ADC_C1_DEF;
psObject->systemFunc.SY_Write(
psObject->uDemodHwAdd,
TDA10086_ADC_C1_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)
)
{
UInt32 uAGCA;
UInt32 puByte[2];
//----------------------
// 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;
#ifdef BSL_DEBUG_FREQ
SEND_TRACE(DEBUG_FREQUENCY_ID, uRF);
#endif
// To increase the maximum allowable input level (0 dBm) for OM5752 board
// When AGCA = 0 (Minimum gain in the tuner), change the thresholds:
// FARTR1 = 0x0F
// FARTR2 = 0x0F
// NYQTR = 0x0F
g10086Instance[demodUnit].systemFunc.SY_Read(
g10086Instance[demodUnit].uDemodHwAdd,
TDA10086_VAGCA_IND,
1,
&uAGCA);
if (uAGCA == 0)
{
puByte[0] = 0xFF; // FARTR1 = 0x0F (& ADCTR = 0x0F)
puByte[1] = 0xFF; // NYQTR = 0x0F & FARTR2 = 0x0F
g10086Instance[demodUnit].systemFunc.SY_Write(
g10086Instance[demodUnit].uDemodHwAdd,
TDA10086_GTR1_IND,
2,
puByte);
}
else
{
puByte[0] = TDA10086_GTR1_DEF;
g10086Instance[demodUnit].systemFunc.SY_Write(
g10086Instance[demodUnit].uDemodHwAdd,
TDA10086_GTR1_IND,
1,
puByte);
}
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
//
// NOTES: the value stocked in the object is returned
//-----------------------------------------------------------------------------
//
tmErrorCode_t
tmbsl10086GetRF (
tmUnitSelect_t demodUnit, // I: Demod unit number
UInt32 *puRF // O: RF freqency (KHz)
)
{
//----------------------
// 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
//----------------------
*puRF = g10086Instance[demodUnit].sCurrentChannel.uRF;
return TM_OK;
}
//-----------------------------------------------------------------------------
// FUNCTION: tmbsl10086SetSR
//
// DESCRIPTION: this function calculates the frequency symbol for registers
// BDR_LSB, BDR_MID, BDR_MSB, BDR_INV
//
// RETURN: TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER
// TMBSL_ERR_DEMOD_NOT_INITIALIZED
// TMBSL_ERR_DEMOD_BAD_PARAMETER
// TM_OK
//
// NOTES:
//-----------------------------------------------------------------------------
//
tmErrorCode_t
tmbsl10086SetSR (
tmUnitSelect_t demodUnit, // I: Demod unit number
UInt32 uSR // I: Symbol Rate (Bauds)
)
{
UInt32 uFreqSymbInv, uCutOff, uDecim, uResult, uByte, puWrite[4];
UInt8 bConfReg, bDecim;
Bool boolBypass = False;
float fFreqSymb, fSysClk, fResult;
//----------------------
// 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 (uSR < TDA10086_SR_MIN || uSR > TDA10086_SR_MAX)
return TMBSL_ERR_DEMOD_BAD_PARAMETER;
//----------------------
// Core function
//----------------------
// calculate the cutoff value
uCutOff = (g10086Instance[demodUnit].uSysClk*10)/uSR;
// calculate the filter we will used
bConfReg = 0x84; // 0.0104 * sr by default
if (uCutOff < 720 ) // 0.0137 * sr
bConfReg = 0x04;
if (uCutOff < 480 ) // 0.0208 * sr
bConfReg = 0x83;
if (uCutOff < 360 ) // 0.0275 * sr
bConfReg = 0x03;
if (uCutOff < 240 ) // 0.0416 * sr
bConfReg = 0x82;
if (uCutOff < 180 ) // 0.0555 * sr
bConfReg = 0x02;
if (uCutOff < 120 ) // 0.0833 * sr
bConfReg = 0x81;
if (uCutOff < 90 ) // 0.111 * sr
bConfReg = 0x01;
if (uCutOff < 60 ) // 0.166 * sr
bConfReg = 0x80;
if (uCutOff < 45 ) // 0.222 * sr
bConfReg = 0x00;
if (uCutOff < 30 ) // 0.333 * sr
{
bConfReg = 0x00;
boolBypass = True; // set bypass filters
// Set AGCN and GTR2 values for high SR
uByte = TDA10086_AGCN_HIGHSR_DEF;
g10086Instance[demodUnit].systemFunc.SY_Write(
g10086Instance[demodUnit].uDemodHwAdd,
TDA10086_AGCN_IND,
1,
&uByte);
uByte = TDA10086_GTR2_HIGHSR_DEF;
g10086Instance[demodUnit].systemFunc.SY_Write(
g10086Instance[demodUnit].uDemodHwAdd,
TDA10086_GTR2_IND,
1,
&uByte);
}
else
{
// Set AGCN and GTR2 values for low SR
uByte = TDA10086_AGCN_LOWSR_DEF;
g10086Instance[demodUnit].systemFunc.SY_Write(
g10086Instance[demodUnit].uDemodHwAdd,
TDA10086_AGCN_IND,
1,
&uByte);
uByte = TDA10086_GTR2_LOWSR_DEF;
g10086Instance[demodUnit].systemFunc.SY_Write(
g10086Instance[demodUnit].uDemodHwAdd,
TDA10086_GTR2_IND,
1,
&uByte);
}
uByte = bConfReg;
g10086Instance[demodUnit].systemFunc.SY_Write(
g10086Instance[demodUnit].uDemodHwAdd,
TDA10086_FCONF_IND,
1,
&uByte);
// bypass the filter if needed
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -