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

📄 tmbsl10086.c

📁 卫星前段解码器详细代码
💻 C
📖 第 1 页 / 共 5 页
字号:
        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 + -