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

📄 tmbsl10086.c

📁 卫星接收机器卫星 自动搜索, 包括优化处理
💻 C
📖 第 1 页 / 共 5 页
字号:
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 + -