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

📄 tmbsl10086scanauto.c

📁 卫星接收机器卫星 自动搜索, 包括优化处理
💻 C
📖 第 1 页 / 共 4 页
字号:

    double lFTUNStep;
    Int32  iFTUNStep;
    static Int32  iFTUNStepLoop = 0;
    double lFTUNRange;
    static Int32  iMinFTUN = 0;
    static Int32  iMaxFTUN = 0;

    static UInt32 uStepRF  = 0;
    static UInt32 uStartRF = 0;
    static UInt32 uStopRF  = 0;

    Int32  iFTUN;
    UInt32 uByte, puByte[2];
    Int32  iFTUN_MSB, iFTUN_LSB;
    double lOffset;
    UInt32 uRF2;

    UInt32 uNewVagcN;
    Int32  iVagcNMod;

    UInt32 uNEST;

    double lFreqRange;

    SEND_TRACE_CALLS(0x0024,0);

    if (psObject->bStateSpectrum == 2)
    {
        return TDA10086_ALGO_SUCCESS_RET;
    }
    else if (psObject->bStateSpectrum == 0)
    {

        lFTUNStep  = (double)(uScanStep);
        lFTUNStep *= 1000;
        lFTUNStep *= (1 << 16);
        lFTUNStep /= (double)(psObject->uSysClk);
        iFTUNStep  = (Int32)lFTUNStep;

        iFTUNStepLoop = -iFTUNStep;

        lFTUNRange  = (double)(uSweepRange);
        lFTUNRange *= 1000;
        lFTUNRange *= (1<<16);
        lFTUNRange /= (double)(psObject->uSysClk);

        iMinFTUN = (Int32)lFTUNRange;
        iMaxFTUN = (Int32)(-lFTUNRange);

        lFreqRange  = lFTUNRange;
        lFreqRange *= (double)(psObject->uSysClk);
        lFreqRange /= (1<<16);

        uStepRF = (UInt32)(2 * lFreqRange);
        uStartRF = psObject->uStartFrequency + (UInt32)(lFreqRange);
        uStopRF = psObject->uStopFrequency;



        // set SR to 1Mbauds
        psObject->sCurrentChannel.uSR = 1000000;
        Tda10086WriteSR(psObject,&psObject->sCurrentChannel.uSR);
        psObject->sCurrentChannel.uSR = 1000000;

        // set RF to start frequency
        psObject->sCurrentChannel.uRF = psObject->uStartFrequency;
        Tda10086WriteRF(psObject,&psObject->sCurrentChannel.uRF);

        // Set Auto Spectral inversion
        psObject->systemFunc.SY_WriteBit(
            psObject->uDemodHwAdd, 
            TDA10086_CONF_IND, 
            TDA10086_CONF_SPECINV_MSK, 
            TDA10086_CONF_AUTOSPECINV_VAL);

        // Set Auto viterbi
        psObject->systemFunc.SY_WriteBit(
            psObject->uDemodHwAdd,
            TDA10086_RATE_IND,
            TDA10086_RATE_RAUTO_MSK, 
            TDA10086_RATE_RAUTO_BIT);


        // Write FCONF: AFS,AFG,DFN
        uByte = (uAFS << 7) | (uAFG << 3) | (uDFN);
        psObject->systemFunc.SY_Write(
            psObject->uDemodHwAdd, 
            TDA10086_FCONF_IND, 
            1, 
            &uByte);

        // Write GSEL
        psObject->systemFunc.SY_WriteBit(
            psObject->uDemodHwAdd, 
            TDA10086_AGCRA_IND, 
            TDA10086_AGCRA_GSEL_MSK, 
            uGSEL<<6);

        // Write NYQG
        psObject->systemFunc.SY_WriteBit(
            psObject->uDemodHwAdd, 
            TDA10086_AGCRN_IND, 
            TDA10086_AGCRN_NYQG_MSK, 
            uNYQG << 6);


        psObject->sCurrentChannel.uRF = uStartRF;

        psObject->bStateSpectrum++;

        return TDA10086_ALGO_NOT_FINISHED_RET;

    }
    else if (psObject->bStateSpectrum == 1)
    {

        // open the IIC BUS for the Tuner
        psObject->systemFunc.SY_WriteBit(
                psObject->uDemodHwAdd, 
                TDA10086_CLEAR_IND, 
                TDA10086_CLEAR_IICTRL_MSK, 
                TDA10086_CLEAR_IICTRL_MSK);    

        // call the tuner function
        psObject->tunerFunc.setRfFunc(psObject->eTunerUnit, psObject->sCurrentChannel.uRF);
//        SEND_TRACESPECTRUM(TRACE_RED, DEBUG_XY, FREQ2INDEX(psObject->sCurrentChannel.uRF), 25);
//        SEND_TRACEAUTOSR1(0x8000+39, psObject->sCurrentChannel.uRF);
        // close the IIC BUS
        psObject->systemFunc.SY_WriteBit(
                psObject->uDemodHwAdd, 
                TDA10086_CLEAR_IND, 
                TDA10086_CLEAR_IICTRL_MSK, 
                0);

        psObject->tunerFunc.getRfFunc(psObject->eTunerUnit, &(psObject->sCurrentChannel.uRF));


        // CLBCAR = 0: Clear the carrier recovery loop
        psObject->systemFunc.SY_WriteBit(
            psObject->uDemodHwAdd, 
            TDA10086_CARINIT_IND, 
            TDA10086_CARINIT_CLBCAR_MSK, 
            0x00);


        for(iFTUN = iMinFTUN; iFTUN >= iMaxFTUN ; iFTUN += iFTUNStepLoop)
        {
            UInt32 i;
            UInt32 AverageVAGC;
            Int32 iFTUN_IQ;

            // if hardware spectral inversion offset is inverted
            if (!psObject->sConfig.bIQ_Swapped)
                iFTUN_IQ = -iFTUN;
			else
				iFTUN_IQ = iFTUN;


            lOffset  = (double)iFTUN_IQ;
            lOffset *= psObject->uSysClk;
            lOffset /= (1 << 16);

            // if hardware spectral inversion offset is inverted
            if (psObject->sConfig.bIQ_Swapped)
                uRF2 = psObject->sCurrentChannel.uRF - (Int32)lOffset;
            else
                uRF2 = psObject->sCurrentChannel.uRF + (Int32)lOffset;


//            SEND_TRACEAUTOSR1(0x8000+39,uRF2);
            if(uRF2 > uStopRF)
                break;

            iFTUN_MSB = iFTUN_IQ >> 8;
            iFTUN_LSB = iFTUN_IQ & 0xFF;

            puByte[0] = 0x80 | (iFTUN_MSB & 0x7F);    //POSMUL
            puByte[1] = iFTUN_LSB;


            psObject->systemFunc.SY_Write(
                psObject->uDemodHwAdd, 
                TDA10086_FTUNMSB_IND, 
                2, 
                puByte);

            if(iFTUN == iMinFTUN)
            {
                Tda10086InitTick(psObject, 20);
                while (Tda10086WaitTick(psObject) == False);
            }


            AverageVAGC = 0;

            for(i=0; i<SPECTRUM_AVERAGING ; i++)
            {
                psObject->systemFunc.SY_Read(
                    psObject->uDemodHwAdd, 
                    TDA10086_VAGCN_IND, 
                    1, 
                    &uNewVagcN);

                AverageVAGC += uNewVagcN;
            }

            uNewVagcN = AverageVAGC /SPECTRUM_AVERAGING;

            psObject->systemFunc.SY_Read(
                psObject->uDemodHwAdd, 
                TDA10086_NEST_IND, 
                1, 
                &uNEST);

            // Calculate the offset to avoid discontinuity
            // don't modify offset if analog carrier (NEST>250)
            if((iFTUN == iMinFTUN) && (uNEST < 250))
            {
                iVagcN_Offset += (Int32)(uVagcN - uNewVagcN);
            }

            uVagcN = uNewVagcN;

            iVagcNMod = 127 - (Int32)uVagcN - iVagcN_Offset;

            SEND_TRACESPECTRUM(TRACE_BLUE, DEBUG_XY, FREQ2INDEX(uRF2), iVagcNMod);
            SEND_TRACEAUTOSR1(0x8000+39, iVagcNMod);
			SEND_TRACEAUTOSR2(0x8006, iVagcNMod);

/*
            psObject->systemFunc.SY_Read(
                psObject->uDemodHwAdd, 
                TDA10086_VAGCN_IND, 
                1, 
                &uNewVagcN);

//            SEND_TRACEAUTOSR2(0x8006,uNewVagcN);

            // Calculate the offset to avoid discontinuity
            // don't modify offset if analog carrier (NEST>250)
            if((iFTUN == iMinFTUN) && (uNEST < 250))
            {
                iVagcN_Offset += (Int32)(uVagcN - uNewVagcN);
            }

            uVagcN = uNewVagcN;

            iVagcNMod = 127 - (Int32)uVagcN - iVagcN_Offset;

//            SEND_TRACESPECTRUM(TRACE_RED, DEBUG_XY, FREQ2INDEX(uRF2), iVagcNMod);
*/
/*
            AverageVAGC = uNewVagcN*1000;
        
            for(i=1; i<4 ; i++)
            {
                psObject->systemFunc.SY_Read(
                    psObject->uDemodHwAdd, 
                    TDA10086_VAGCN_IND, 
                    1, 
                    &uNewVagcN);

//                    SEND_TRACEAUTOSR2(0x8006,uNewVagcN);
//                    SEND_TRACEAUTOSR2(0x8006,i);

                    AverageVAGC = (AverageVAGC*i + uNewVagcN*1000)/(i+1);

//                    SEND_TRACEAUTOSR2(0x8006,AverageVAGC);
            }

            uNewVagcN = (AverageVAGC + 500)/1000;

            psObject->systemFunc.SY_Read(
                psObject->uDemodHwAdd, 
                TDA10086_NEST_IND, 
                1, 
                &uNEST);

            // Calculate the offset to avoid discontinuity
            // don't modify offset if analog carrier (NEST>250)
            if((iFTUN == iMinFTUN) && (uNEST < 250))
            {
                iVagcN_Offset += (Int32)(uVagcN - uNewVagcN);
            }

            uVagcN = uNewVagcN;

            iVagcNMod = 127 - (Int32)uVagcN - iVagcN_Offset;

            SEND_TRACESPECTRUM(TRACE_BLUE, DEBUG_XY, FREQ2INDEX(uRF2), iVagcNMod);
*/
            if(psObject->pbSpectrum != 0)
            {
                psObject->pbSpectrum[(uRF2-psObject->uStartFrequency+125000)/250000] = (UInt8)iVagcNMod;
            }
        }

        psObject->sCurrentChannel.uRF += uStepRF;


        if(psObject->sCurrentChannel.uRF >= (uStopRF+uStepRF))
        {
            psObject->bStateSpectrum++;

            // Write GSEL
            uGSEL = 0;
            psObject->systemFunc.SY_WriteBit(
                psObject->uDemodHwAdd, 
                TDA10086_AGCRA_IND, 
                TDA10086_AGCRA_GSEL_MSK, 
                uGSEL<<6);

            iVagcN_Offset = 0;
            uVagcN = 0;

        }
        return TDA10086_ALGO_NOT_FINISHED_RET; 
    }

    return TM_OK;

}


//-----------------------------------------------------------------------------
// FUNCTION:    Tda10086FreeBuffers
//
// DESCRIPTION: Free all buffers used for AutoSR scanning
//
// RETURN:      
//
// NOTES:       
//
//-----------------------------------------------------------------------------
//
void
Tda10086FreeBuffers(
    tm10086object_t *psObject
    )
{
#ifdef _WIN32
    // delete buffer for Spectrum analyzer
    if (psObject->pbSpectrum)
    {
        free(psObject->pbSpectrum);
        psObject->pbSpectrum = 0;
    }

    // delete buffer for derivation calculation
    if (psObject->pbDeriv)
    {
        free(psObject->pbDeriv);
        psObject->pbDeriv = 0;
    }

    // delete buffer for Region
    if (psObject->puRegion)
    {
        free(psObject->puRegion);
        psObject->puRegion = 0;
    }
#else
    // delete buffer for Spectrum analyzer
    if (psObject->pbSpectrum)
    {
        tmhpiCommonMemFree(psObject->pbSpectrum);
        psObject->pbSpectrum = 0;
    }

    // delete buffer for derivation calculation
    if (psObject->pbDeriv)
    {
        tmhpiCommonMemFree(psObject->pbDeriv);
        psObject->pbDeriv = 0;
    }

    // delete buffer for Region
    if (psObject->puRegion)
    {
        tmhpiCommonMemFree(psObject->puRegion);
        psObject->puRegion = 0;
    }
#endif
    // no more region
    psObject->uNbRegion = 0;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -