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

📄 tmbsl10046.c

📁 TDA10046驱动源代码.TDA10046是PHILIPS的一款DVB-T TUNER
💻 C
📖 第 1 页 / 共 5 页
字号:
			    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 + -