📄 tmbsl10046.c
字号:
g10046Instance[demodUnit].uDemodHwAdd,
TDA10046_DSP_ADR_MSB_IND, 1, &uByte);
// read the version
g10046Instance[demodUnit].systemFunc.SY_Read(
g10046Instance[demodUnit].uDemodHwAdd,
TDA10046_DSP_REG_MSB_IND, 2, puByteBuffer);
*puValue = puByteBuffer[1];
break;
case READCARRIER:
*puValue = g10046Instance[demodUnit].uCarrier;
break;
default:
return TM_ERR_BAD_PARAMETER;
}
return TM_OK;
}
//-----------------------------------------------------------------------------
// FUNCTION: tmbsl10046Write
//
// DESCRIPTION: this function writes bytes in the demod registers.
//
// RETURN: TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER
// TMBSL_ERR_DEMOD_NOT_INITIALIZED
// TM_ERR_IIC_ERR
// TM_OK
//
// NOTES: This function can be removed if needed
//-----------------------------------------------------------------------------
//
tmErrorCode_t
tmbsl10046Write (
tmUnitSelect_t demodUnit, // I: Demod unit number
UInt32 uIndex, // I: Start index to write
UInt32 uNbBytes, // I: Number of bytes to write
UInt32* puBytes // I: Pointer on an array of bytes
)
{
//----------------------
// test input parameters
//----------------------
// test the instance number
if (demodUnit > TDA10046_MAX_UNITS)
return TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER;
// test the object
if (g10046Instance[demodUnit].sApiFlags.iInit == False)
return TMBSL_ERR_DEMOD_NOT_INITIALIZED;
//----------------------
// Implementation
//----------------------
if (g10046Instance[demodUnit].systemFunc.SY_Write(
g10046Instance[demodUnit].uDemodHwAdd,
uIndex, uNbBytes, puBytes) == False)
return TM_ERR_IIC_ERR;
return TM_OK;
}
//-----------------------------------------------------------------------------
// FUNCTION: tmbsl10046WriteBit
//
// DESCRIPTION: this function writes a bit to the mask position
//
// RETURN: TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER
// TMBSL_ERR_DEMOD_NOT_INITIALIZED
// TM_ERR_IIC_ERR
// TM_OK
//
// NOTES: This function can be removed if needed
//-----------------------------------------------------------------------------
//
tmErrorCode_t
tmbsl10046WriteBit (
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 > TDA10046_MAX_UNITS)
return TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER;
// test the object
if (g10046Instance[demodUnit].sApiFlags.iInit == False)
return TMBSL_ERR_DEMOD_NOT_INITIALIZED;
//----------------------
// Implementation
//----------------------
if (g10046Instance[demodUnit].systemFunc.SY_WriteBit(
g10046Instance[demodUnit].uDemodHwAdd,
uIndex, uBitMask, uByte) == False)
return TM_ERR_IIC_ERR;
return TM_OK;
}
//-----------------------------------------------------------------------------
// FUNCTION: tmbsl10046Read
//
// DESCRIPTION: this function reads bytes
//
// RETURN: TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER
// TMBSL_ERR_DEMOD_NOT_INITIALIZED
// TM_ERR_IIC_ERR
// TM_OK
//
// NOTES: This function can be removed if needed
//-----------------------------------------------------------------------------
//
tmErrorCode_t
tmbsl10046Read (
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 > TDA10046_MAX_UNITS)
return TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER;
// test the object
if (g10046Instance[demodUnit].sApiFlags.iInit == False)
return TMBSL_ERR_DEMOD_NOT_INITIALIZED;
//----------------------
// Implementation
//----------------------
if (g10046Instance[demodUnit].systemFunc.SY_Read(
g10046Instance[demodUnit].uDemodHwAdd,
uIndex, uNbBytes, puBytes) == False)
return TM_ERR_IIC_ERR;
return TM_OK;
}
//-----------------------------------------------------------------------------
// Demod-Tuner programming functions:
//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
// FUNCTION: Tda10046WriteInit:
//
// DESCRIPTION: write the default configuration
//
// RETURN: TM_ERR_IIC_ERR
// TM_OK
//
// NOTES:
//-----------------------------------------------------------------------------
//
tmErrorCode_t
Tda10046WriteInit (
tm10046object_t *psObject
)
{
UInt32 puByte[4], uByte;
Double dValue;
//-------------------------------
// Sampling frequency
//-------------------------------
// calculate the sampling frequency
psObject->uSampClk = psObject->sConfig.uXtall * (psObject->sConfig.bPLL_MFactor + 45);
psObject->uSampClk /= psObject->sConfig.bPLL_NFactor + 1;
psObject->uSampClk /= psObject->sConfig.bPLL_PFactor + 4;
// PLL - test the I2C acknowledgement
puByte[0] = psObject->sConfig.bPLL_MFactor;
puByte[1] = psObject->sConfig.bPLL_PFactor << 5 | psObject->sConfig.bPLL_NFactor;
if (psObject->systemFunc.SY_Write(psObject->uDemodHwAdd,
TDA10046_CONF_PLL2_IND, 2, puByte) == False)
return TM_ERR_IIC_ERR;
// FREQ OFFSET
dValue = 1000000/(Double)psObject->uSampClk;
dValue *= 32768;
dValue /= 6;
uByte = (UInt32)((dValue*100+50)/100); // rounding to the next integer
psObject->systemFunc.SY_Write(psObject->uDemodHwAdd,
TDA10046_FREQ_OFFSET_IND, 1, &uByte);
// FREQ CORRECTION
dValue = (Double)((Int32)psObject->sConfig.uIF - (Int32)psObject->uSampClk);
dValue *= 32768;
dValue /= (Double)psObject->uSampClk;
uByte = (UInt32)((dValue*100-50)/100); // rounding to the next integer
puByte[0] = uByte >> 8;
puByte[1] = uByte & 0xFF;
psObject->systemFunc.SY_Write(psObject->uDemodHwAdd,
TDA10046_FREQ_PHY2_MSB_IND, 2, puByte);
// WREF
dValue = 2147483648/(7*(Double)psObject->uSampClk);
psObject->uWref8 = (UInt32)(dValue*8000000+0.5); // rounding to the next integer
psObject->uWref7 = (UInt32)(dValue*7000000+0.5); // rounding to the next integer
psObject->uWref6 = (UInt32)(dValue*6000000+0.5); // rounding to the next integer
// INV_WREF
dValue = 7*(Double)psObject->uSampClk;
psObject->uInvWref8 = (UInt32)((dValue*32+4000000)/8000000); // rounding to the next integer
psObject->uInvWref7 = (UInt32)((dValue*32+3500000)/7000000); // rounding to the next integer
psObject->uInvWref6 = (UInt32)((dValue*32+3000000)/6000000); // rounding to the next integer
//-------------------------------
// DSP
//-------------------------------
// watchdog
if (psObject->systemFunc.SY_WriteBit(psObject->uDemodHwAdd,
TDA10046_CONF_C4_IND, TDA10046_CONFC4_DSPWD_BIT,
psObject->sConfig.bWatchdog << 5) == False)
return TM_ERR_IIC_ERR;
// pulse killer
psObject->systemFunc.SY_WriteBit(psObject->uDemodHwAdd,
TDA10046_CONF_C1_IND, TDA10046_CONFC1_USEPK_BIT,
psObject->sConfig.bPulseKiller << 7);
//-------------------------------
// AGC
//-------------------------------
// AGC tun
uByte = TDA10046_AGCCONF_AUTOAGC_BIT & 0x02;
if (psObject->sConfig.bAgcTun) uByte |= TDA10046_AGCCONF_USEAGCTUN_BIT;
psObject->systemFunc.SY_Write(psObject->uDemodHwAdd,
TDA10046_AGC_CONF_IND, 1, &uByte);
// AGC pola
uByte = 0;
if (psObject->sConfig.bAgcPolaTun)
uByte |= TDA10046_CONFPOLA_AGCTUN_BIT;
if (psObject->sConfig.bAgcPolaIf)
uByte |= TDA10046_CONFPOLA_IFTUN_BIT;
psObject->systemFunc.SY_WriteBit(psObject->uDemodHwAdd,
TDA10046_CONF_POLARITY_IND, TDA10046_CONFPOLA_AGCTUN_BIT | TDA10046_CONFPOLA_IFTUN_BIT,
uByte);
// AGC level min and max
puByte[0] = psObject->sConfig.bAgcTunMin;
puByte[1] = psObject->sConfig.bAgcTunMax;
puByte[2] = psObject->sConfig.bAgcIfMin;
puByte[3] = psObject->sConfig.bAgcIfMax;
psObject->systemFunc.SY_Write(psObject->uDemodHwAdd,
TDA10046_AGC_TUN_MIN_IND, 4, puByte);
//-------------------------------
// Miscellaneous
//-------------------------------
// BER
psObject->systemFunc.SY_WriteBit(psObject->uDemodHwAdd,
TDA10046_CVBER_CTRL_IND, TDA10046_CVBERCTRL_PVBER_MSK,
psObject->sConfig.bBerDepth << 4);
// AGC_GAINS - change default value
uByte = 0x01;
psObject->systemFunc.SY_Write(psObject->uDemodHwAdd,TDA10046_AGC_GAINS_IND, 1, &uByte);
// 100ppm crystal
if (psObject->sConfig.bXtall100ppm)
psObject->systemFunc.SY_WriteBit(psObject->uDemodHwAdd,
TDA10046_AUTO_IND, TDA10046_AUTO_100PPM_BIT, TDA10046_AUTO_100PPM_BIT);
else
psObject->systemFunc.SY_WriteBit(psObject->uDemodHwAdd,
TDA10046_AUTO_IND, TDA10046_AUTO_100PPM_BIT, 0);
//-------------------------------
// Output
//-------------------------------
// Mode AB - Division factor for parallel mode B
uByte = psObject->sConfig.bOUT_ParaDiv;
if (psObject->sConfig.bOUT_ModeAB)
uByte |= TDA10046_CONFTS1_DEGIG_BIT;
psObject->systemFunc.SY_Write(psObject->uDemodHwAdd,
TDA10046_CONF_TS1_IND, 1, &uByte);
// Poclk - Serial/parallel - MSB/LSB
uByte = 0;
if (psObject->sConfig.bOUT_Poclk && psObject->sConfig.bOUT_ModeAB) // Mode B
uByte |= TDA10046_CONFTS2_POCLK_BIT;
if (psObject->sConfig.bOUT_Poclk == 0 && psObject->sConfig.bOUT_ModeAB == 0) // Mode B
uByte |= TDA10046_CONFTS2_POCLK_BIT;
if (psObject->sConfig.bOUT_ParaSer)
uByte |= TDA10046_CONFTS2_SBUS_BIT;
if (psObject->sConfig.bOUT_MsbLsb)
uByte |= TDA10046_CONFTS2_SLSB_BIT;
psObject->systemFunc.SY_WriteBit(psObject->uDemodHwAdd,
TDA10046_CONF_TS2_IND,
TDA10046_CONFTS2_POCLK_BIT | TDA10046_CONFTS2_SBUS_BIT | TDA10046_CONFTS2_SLSB_BIT,
uByte);
//-------------------------------
// Tri-State
//-------------------------------
if (psObject->sConfig.bAgcTun)
{
// TS parallel port: 0 - Agc tun: 10 - Agc if: 00
// 0xx1000x: 0x10
psObject->systemFunc.SY_WriteBit(psObject->uDemodHwAdd,
TDA10046_CONF_TRISTATE1_IND, TDA10046_TRISTATE1_ZTSPAR_BIT |
TDA10046_TRISTATE1_ZAGCTUN_MSK | TDA10046_TRISTATE1_ZAGCIF_MSK, 0x10);
}
else
{
// TS parallel port: 0 - Agc tun: 11 - Agc if: 00
// 0xx1100x: 0x18
psObject->systemFunc.SY_WriteBit(psObject->uDemodHwAdd,
TDA10046_CONF_TRISTATE1_IND, TDA10046_TRISTATE1_ZTSPAR_BIT |
TDA10046_TRISTATE1_ZAGCTUN_MSK | TDA10046_TRISTATE1_ZAGCIF_MSK, 0x18);
}
//-------------------------------
// GPIO
// GPIO0 input for the comparator
// GPIO1 used for selection of 7 or 8Mhz
// GPIO2 used for the FEL
// GPIO3 not used
//-------------------------------
// select IO
// GPIO3 not used:11 - GPIO2 open-drain:10 - GPIO1 push-pull:00 - GPIO0 input:01
// 11100001: 0xE1
uByte = 0xE1;
psObject->systemFunc.SY_Write(psObject->uDemodHwAdd,
TDA10046_CONF_TRISTATE2_IND, 1, &uByte);
// configure IO
// GPIO3 not used:11 - GPIO2 FEL:00 - GPIO1 SigmaDelta:11 - GPIO0 don't care:00
// 11001100: 0xCC
uByte = 0xCC;
psObject->systemFunc.SY_Write(psObject->uDemodHwAdd,
TDA10046_GPIO_OUT_SEL_IND, 1, &uByte);
// enable reading pin GPIO0
psObject->systemFunc.SY_WriteBit(psObject->uDemodHwAdd,
TDA10046_GPIO_SELECT_IND, TDA10046_GPIOSELECT_GPIOIN0_BIT,
TDA10046_GPIOSELECT_GPIOIN0_BIT);
return TM_OK;
}
//-----------------------------------------------------------------------------
// FUNCTION: tmbsl10046SetRF
//
// DESCRIPTION: this function will program the tuner
//
// RETURN: TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER
// TMBSL_ERR_DEMOD_NOT_INITIALIZED
// TM_OK
//
// NOTES:
//-----------------------------------------------------------------------------
//
tmErrorCode_t
tmbsl10046SetRF (
tmUnitSelect_t demodUnit, // I: Demod unit number
UInt32 uRF, // I: RF freqency (Hz)
tmhalFERfOffset_t eRFO // I: RF offset
)
{
UInt32 uAutoOffset, uOffset;
//----------------------
// test input parameters
//----------------------
// test the instance number
if (demodUnit > TDA10046_MAX_UNITS)
return TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER;
// test the object
if (g10046Instance[demodUnit].sApiFlags.iInit == False)
return TMBSL_ERR_DEMOD_NOT_INITIALIZED;
// test the parameter value
if (uRF < TDA10046_RF_MIN || uRF > TDA10046_RF_MAX)
return TMBSL_ERR_DEMOD_BAD_PARAMETER;
// test the parameter value
if (eRFO >= tmhalFERfOffsetMax)
return TMBSL_ERR_DEMOD_BAD_PARAMETER;
//----------------------
// Offset
//----------------------
switch(eRFO)
{
case tmhalFERfOffsetAuto:
uAutoOffset = TDA10046_AUTO_AUTOOFFSET_BIT;
uOffset = 0x00;
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -