📄 tuner.c
字号:
ChipAddField(hTuner,RSTB6100_LPEN,FSTB6100_LPEN,"LPEN",4,1,CHIP_UNSIGNED);
/* TEST3 */
ChipAddReg(hTuner,RSTB6100_TEST3,"TEST3",0x000b,*DefVal++,STCHIP_ACCESS_WR);
ChipAddField(hTuner,RSTB6100_TEST3,FSTB6100_TEST3,"TEST3",0,8,CHIP_UNSIGNED);
}
break;
case TUNER_IX2476:
/* */
hTunerParams->Reference = 4000000; /* 4 MHz reference */
hTunerParams->IF = 0; /* 0 MHz intermediate frequency */
hTunerParams->IQ_Wiring = TUNER_IQ_INVERT; /* hardware IQ invertion */
/* fill elements of external chip data structure */
ChipInfo.NbRegs = IX2476_NBREGS;
ChipInfo.NbFields = IX2476_NBFIELDS;
ChipInfo.ChipMode = STCHIP_MODE_NOSUBADR;
ChipInfo.WrStart = RIX2476_NHIGH;
ChipInfo.WrSize = 4;
ChipInfo.RdStart = RIX2476_STATUS;
ChipInfo.RdSize = 1;
hTuner = ChipOpen(&ChipInfo);
if(hTuner != NULL)
{
DefVal = DefIX2476Val;
/* REGISTER INITIALISATION */
/* NHIGH */
ChipAddReg(hTuner,RIX2476_NHIGH,"NHIGH",0x0001,*DefVal++,STCHIP_ACCESS_W);
ChipAddField(hTuner,RIX2476_NHIGH,FIX2476_BG,"BG",5,2,CHIP_UNSIGNED);
ChipAddField(hTuner,RIX2476_NHIGH,FIX2476_N_MSB,"N_MSB",0,5,CHIP_UNSIGNED);
/* NLOW_SDIV */
ChipAddReg(hTuner,RIX2476_NLOW_SDIV,"NLOW_SDIV",0x0002,*DefVal++,STCHIP_ACCESS_W);
ChipAddField(hTuner,RIX2476_NLOW_SDIV,FIX2476_N_LSB,"N_LSB",5,3,CHIP_UNSIGNED);
ChipAddField(hTuner,RIX2476_NLOW_SDIV,FIX2476_A,"A",0,5,CHIP_UNSIGNED);
/* CP_LPF_R */
ChipAddReg(hTuner,RIX2476_CP_LPF_R,"CP_LPF_R",0x0003,*DefVal++,STCHIP_ACCESS_W);
ChipAddField(hTuner,RIX2476_CP_LPF_R,FIX2476_CP,"CP",5,2,CHIP_UNSIGNED);
ChipAddField(hTuner,RIX2476_CP_LPF_R,FIX2476_PD5,"PD5",4,1,CHIP_UNSIGNED);
ChipAddField(hTuner,RIX2476_CP_LPF_R,FIX2476_PD4,"PD4",3,1,CHIP_UNSIGNED);
ChipAddField(hTuner,RIX2476_CP_LPF_R,FIX2476_TM,"TM",2,1,CHIP_UNSIGNED);
ChipAddField(hTuner,RIX2476_CP_LPF_R,FIX2476_RTS,"RTS",1,1,CHIP_UNSIGNED);
ChipAddField(hTuner,RIX2476_CP_LPF_R,FIX2476_REF,"REF",0,1,CHIP_UNSIGNED);
/* VCO_LPF */
ChipAddReg(hTuner,RIX2476_VCO_LPF,"VCO_LPF",0x0004,*DefVal++,STCHIP_ACCESS_W);
ChipAddField(hTuner,RIX2476_VCO_LPF,FIX2476_VCO,"VCO",5,3,CHIP_UNSIGNED);
ChipAddField(hTuner,RIX2476_VCO_LPF,FIX2476_PSC,"PSC",4,1,CHIP_UNSIGNED);
ChipAddField(hTuner,RIX2476_VCO_LPF,FIX2476_PD3,"PD3",3,1,CHIP_UNSIGNED);
ChipAddField(hTuner,RIX2476_VCO_LPF,FIX2476_PD2,"PD2",2,1,CHIP_UNSIGNED);
ChipAddField(hTuner,RIX2476_VCO_LPF,FIX2476_DIV,"DIV",1,1,CHIP_UNSIGNED);
ChipAddField(hTuner,RIX2476_VCO_LPF,FIX2476_P0,"P0",0,1,CHIP_UNSIGNED);
/* STATUS */
ChipAddReg(hTuner,RIX2476_STATUS,"STATUS",0x0005,*DefVal++,STCHIP_ACCESS_R);
ChipAddField(hTuner,RIX2476_STATUS,FIX2476_PWR,"PWR",7,1,CHIP_UNSIGNED);
ChipAddField(hTuner,RIX2476_STATUS,FIX2476_FL,"FL",6,1,CHIP_UNSIGNED);
}
break;
default:
break;
}
#if defined(CHIP_STAPI) || defined(NO_GUI)
TunerWrite(hTuner);
#endif
}
return hTuner;
}
TUNER_Error_t TunerSetFrequency(STCHIP_Handle_t hTuner,U32 Frequency)
{
TUNER_Error_t error = TUNER_NO_ERR;
TUNER_Params_t hTunerParams = NULL;
U32 frequency;
U32 stepsize;
U32 nbsteps;
U32 divider;
U32 swallow;
U8 vco,u8,index;
hTunerParams = (TUNER_Params_t) hTuner->pData;
if(hTuner && hTunerParams && !hTuner->Error)
{
switch(hTunerParams->Model)
{
case TUNER_VG0011:
u8=0;
if(Frequency>=950000)
while(!INRANGE(TUNERSAT_LOOKUP[u8][0],Frequency,TUNERSAT_LOOKUP[u8][1]) && (u8<4)) u8++;
ChipSetFieldImage(hTuner,FTUNERSAT_DIV4SEL,TUNERSAT_LOOKUP[u8][2]);
ChipSetFieldImage(hTuner,FTUNERSAT_RDIV,TUNERSAT_LOOKUP[u8][3]);
ChipSetFieldImage(hTuner,FTUNERSAT_PRESC32ON,TUNERSAT_LOOKUP[u8][4]);
divider = Frequency/1000;
ChipSetFieldImage(hTuner,FTUNERSAT_N_MSB,(divider>>8) & 0x0F);
ChipSetFieldImage(hTuner,FTUNERSAT_N_LSB,divider & 0xFF);
ChipSetRegisters(hTuner,RTUNERSAT_TUNING_LSB,3);
ChipSetField(hTuner,FTUNERSAT_CALVCOSTRT,1);
break;
case TUNER_HZ1184:
ChipSetFieldImage(hTuner,FHZ1184_PD1,Frequency < 1450000);
frequency = Frequency + hTunerParams->IF;
stepsize = 2*(hTunerParams->Reference/(PowOf2(ChipGetFieldImage(hTuner,FHZ1184_R))));
nbsteps = (frequency * 100) / (stepsize / 10);
divider = nbsteps / 32;
swallow = nbsteps % 32;
ChipSetFieldImage(hTuner,FHZ1184_N_HSB,((divider >> 10) & 0x03));
ChipSetFieldImage(hTuner,FHZ1184_N_MSB,((divider >> 3) & 0x7F));
ChipSetFieldImage(hTuner,FHZ1184_N_LSB,(divider & 0x07));
ChipSetFieldImage(hTuner,FHZ1184_A,swallow);
error = TunerWrite(hTuner);
break;
case TUNER_MAX2116:
frequency = Frequency + hTunerParams->IF;
stepsize = hTunerParams->Reference / (PowOf2(ChipGetFieldImage(hTuner,FMAX2116_R)+1));
divider = (frequency * 100) / (stepsize / 10);
ChipSetFieldImage(hTuner,FMAX2116_N_MSB,(divider >> 8) & 0x7F);
ChipSetFieldImage(hTuner,FMAX2116_N_LSB,divider & 0xFF);
u8=0;
while(!INRANGE(MAX2116_LOOKUP[u8][0],Frequency,MAX2116_LOOKUP[u8][1]) && (u8<9)) u8++;
ChipSetFieldImage(hTuner,FMAX2116_DIV2,MAX2116_LOOKUP[u8][3]);
vco = MAX2116_LOOKUP[u8][2];
ChipSetFieldImage(hTuner,FMAX2116_VCO,vco);
error = TunerWrite(hTuner);
WAIT_N_MS(1);
index = 0;
while((!TunerGetStatus(hTuner)) && (index < 4))
{
u8 = ChipGetFieldImage(hTuner,FMAX2116_ADC);
if(u8 == 0)
{
if(vco == 0)
{
vco = 7;
ChipSetFieldImage(hTuner,FMAX2116_DIV2,0);
}
else
{
vco--;
}
}
else if(u8 == 7)
{
if(vco == 7)
{
vco = 0;
ChipSetFieldImage(hTuner,FMAX2116_DIV2,1);
}
else
{
vco++;
}
}
ChipSetFieldImage(hTuner,FMAX2116_VCO,vco);
error = TunerWrite(hTuner);
WAIT_N_MS(1);
index++;
}
break;
case TUNER_SU1200:
if(Frequency >= 2000000)
ChipSetFieldImage(hTuner,FSU1200_C,0x03);
else if(Frequency >= 1500000)
ChipSetFieldImage(hTuner,FSU1200_C,0x02);
else
ChipSetFieldImage(hTuner,FSU1200_C,0x01);
frequency = Frequency + hTunerParams->IF;
stepsize = hTunerParams->Reference/(PowOf2(ChipGetFieldImage(hTuner,FSU1200_R) + 1));
nbsteps = (frequency * 100) / (stepsize / 10);
ChipSetFieldImage(hTuner,FSU1200_N_HSB,((nbsteps >> 15) & 0x03));
ChipSetFieldImage(hTuner,FSU1200_N_MSB,((nbsteps >> 8) & 0x7F));
ChipSetFieldImage(hTuner,FSU1200_N_LSB,(nbsteps & 0x00FF));
error = TunerWrite(hTuner);
break;
case TUNER_TBMU301:
frequency = Frequency + hTunerParams->IF;
stepsize = hTunerParams->Reference/(PowOf2(ChipGetFieldImage(hTuner,FTBMU301_R) + 1));
nbsteps = (frequency * 100) / (stepsize / 10);
ChipSetFieldImage(hTuner,FTBMU301_N_HSB,((nbsteps >> 15) & 0x03));
ChipSetFieldImage(hTuner,FTBMU301_N_MSB,((nbsteps >> 8) & 0x7F));
ChipSetFieldImage(hTuner,FTBMU301_N_LSB,(nbsteps & 0x00FF));
error = TunerWrite(hTuner);
break;
case TUNER_IX2410:
frequency = Frequency + hTunerParams->IF;
stepsize = hTunerParams->Reference / (PowOf2(ChipGetFieldImage(hTuner,FIX2410_R)+2));
nbsteps = (frequency * 100) / (stepsize / 10);
swallow = nbsteps % 32;
divider = nbsteps / 32;
ChipSetFieldImage(hTuner,FIX2410_N_MSB,(divider >> 3) & 0x7F);
ChipSetFieldImage(hTuner,FIX2410_N_LSB,divider & 0x07);
ChipSetFieldImage(hTuner,FIX2410_SDIV, swallow);
u8=0;
while(!INRANGE(IX2410_LOOKUP[u8][0],Frequency,IX2410_LOOKUP[u8][1]) && (u8<10)) u8++;
ChipSetFieldImage(hTuner,FIX2410_DIV,IX2410_LOOKUP[u8][3]);
vco = IX2410_LOOKUP[u8][2];
ChipSetFieldImage(hTuner,FIX2410_VCO,vco);
/*
error = Tuner299_Write(hTuner);
WAIT_N_MS(1);
*/
ChipSetFieldImage(hTuner, FIX2410_TM, 0);
ChipSetRegisters(hTuner,RIX2410_NHIGH,4);
WAIT_N_MS(1);
ChipSetFieldImage(hTuner, FIX2410_TM, 1);
ChipSetRegisters(hTuner,RIX2410_NHIGH,4);
WAIT_N_MS(6);
TunerGetStatus(hTuner);
break;
case TUNER_STB6000:
ChipSetFieldImage(hTuner,FSTB6000_ODIV,Frequency <= 1075000); /* this switch frequency should be in line with vco table */
u8=0;
while(!INRANGE(STB6K_LOOKUP[u8][0],Frequency,STB6K_LOOKUP[u8][1]) && (u8<10)) u8++;
ChipSetFieldImage(hTuner,FSTB6000_OSM,STB6K_LOOKUP[u8][2]);
//frequency = Frequency + hTunerParams->IF;
frequency = Frequency<<(ChipGetFieldImage(hTuner,FSTB6000_ODIV)+1);
stepsize = 2*(hTunerParams->Reference / ChipGetFieldImage(hTuner,FSTB6000_R)); /* 2 x Fr / R */
nbsteps = (frequency * 100) / (stepsize / 10);
divider = nbsteps / 16; /* 32 */
swallow = nbsteps % 16; /* 32 */
ChipSetFieldImage(hTuner,FSTB6000_N_MSB,(divider>>1) & 0xFF);
ChipSetFieldImage(hTuner,FSTB6000_N_LSB,divider & 0x01);
ChipSetFieldImage(hTuner,FSTB6000_A,swallow);
ChipSetFieldImage(hTuner,FSTB6000_LPEN,0); /* PLL loop disabled */
ChipSetFieldImage(hTuner,FSTB6000_OSCH,1); /* VCO search enabled */
ChipSetFieldImage(hTuner,FSTB6000_OCK,1); /* VCO search clock off */
error = TunerWrite(hTuner);
ChipSetFieldImage(hTuner,FSTB6000_LPEN,1); /* PLL loop enabled */
error = TunerWrite(hTuner);
WAIT_N_MS(20);
ChipSetFieldImage(hTuner,FSTB6000_OSCH,0); /* VCO search disabled */
ChipSetFieldImage(hTuner,FSTB6000_OCK,3); /* VCO search clock off */
error = TunerWrite(hTuner);
break;
case TUNER_STB6100:
ChipSetFieldImage(hTuner,FSTB6100_ODIV,Frequency <= 1075000);
ChipSetFieldImage(hTuner,FSTB6100_PSD2,!INRANGE (1076000,Frequency,1325000));
u8=0;
while(!INRANGE(STB6K_LOOKUP[u8][0],Frequency,STB6K_LOOKUP[u8][1])&& (u8<10)) u8++;
vco=STB6K_LOOKUP[u8][2];
ChipSetFieldImage(hTuner,FSTB6100_OSM,vco);
frequency=2*Frequency*(ChipGetFieldImage(hTuner,FSTB6100_ODIV)+1); /*Flo=2*Ftuner*(ODIV+1)*/
hTunerParams->Reference/=1000; /*Refrence in Khz*/
/*flo=Fxtal*(DIV2+1)*(Ni+Nf/2^9)*/
/*Ni = floor (fVCO / (fXTAL * P))*/
divider=(frequency/hTunerParams->Reference)/(ChipGetFieldImage(hTuner,FSTB6100_PSD2)+1);
/*round ((fVCO / (fXTAL * P) - Ni) * 2^9)*/
stepsize=frequency-divider*(ChipGetFieldImage(hTuner,FSTB6100_PSD2)+1)*(hTunerParams->Reference); /**/
nbsteps=(stepsize*PowOf2(9))/((ChipGetFieldImage(hTuner,FSTB6100_PSD2)+1)*(hTunerParams->Reference));
swallow=nbsteps;
ChipSetFieldImage(hTuner,FSTB6100_NI,divider);
ChipSetFieldImage(hTuner,FSTB6100_NF_LSB,(swallow&0xFF));
ChipSetFieldImage(hTuner,FSTB6100_NF_MSB,(swallow>>8));
hTunerParams->Reference*=1000;
ChipSetFieldImage(hTuner,FSTB6100_LPEN,0); /* PLL loop disabled */
ChipSetFieldImage(hTuner,FSTB6100_OSCH,1); /* VCO search enabled */
ChipSetFieldImage(hTuner,FSTB6100_OCK,1); /* VCO search clock off */
error = TunerWrite(hTuner);
ChipSetFieldImage(hTuner,FSTB6100_LPEN,1); /* PLL loop enabled */
error = TunerWrite(hTuner);
WAIT_N_MS(20);
ChipSetFieldImage(hTuner,FSTB6100_OSCH,0); /* VCO search disabled */
ChipSetFieldImage(hTuner,FSTB6100_OCK,3); /* VCO search clock off */
ChipSetFieldImage(hTuner,FSTB6100_FCCK,0); /*LPF BW setting clock disabled */
error = TunerWrite(hTuner);
break;
case TUNER_IX2476:
frequency = Frequency + hTunerParams->IF;
stepsize = hTunerParams->Reference / (PowOf2(ChipGetFieldImage(hTuner,FIX2476_REF)+2));
nbsteps = (frequency * 100) / (stepsize / 10);
swallow = nbsteps % 32;
divider = nbsteps / 32;
ChipSetFieldImage(hTuner,FIX2476_N_MSB,(divider >> 3) & 0x1F);
ChipSetFieldImage(hTuner,FIX2476_N_LSB,divider & 0x07);
ChipSetFieldImage(hTuner,FIX2476_A, swallow);
u8=0;
while(!INRANGE(IX2476_LOOKUP[u8][0],Frequency,IX2476_LOOKUP[u8][1]) && (u8<10)) u8++;
ChipSetFieldImage(hTuner,FIX2476_DIV,IX2476_LOOKUP[u8][3]);
vco = IX2476_LOOKUP[u8][2];
ChipSetFieldImage(hTuner,FIX2476_VCO,vco);
ChipSetFieldImage(hTuner, FIX2476_TM, 0);
ChipSetRegisters(hTuner,RIX2476_NHIGH,4);
WAIT_N_MS(1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -