📄 tmbsl10086scanauto.c
字号:
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 + -