📄 pll.cpp
字号:
pd3=((*(byte+4))>>3)&0x01;
pd4=((*(byte+3))>>3)&0x01;
pd5=((*(byte+3))>>4)&0x01;
data=(pd2<<3)&0x08;
data|=((pd3<<2)&0x0C);
data|=((pd4<<1)&0x0E);
data|=(pd5&0x0F);
//CString t; t.Format("calculate_pll_lpf:%.2X, %ld",data,calculate_pll_lpf(data)); MessageBox(t);
// return calculate_pll_lpf(data);
return ((data+2)*2)*1000;
// if(data>=0x01 && data<=0x0F) return ((data+2)*2);
// else if(data == 0) return 0;
// else return 9999;
// if(data>=0x01 && data<=0x0F) return double((data+2.)*2.);
// else if(data == 0) return 0.;
// else return 9999.;
/*
//QM1D1B0004
int PD2345;
int PD2,PD3,PD4,PD5;
PD2=((*(byte+4))>>2)&0x01;
PD3=((*(byte+4))>>3)&0x01;
PD4=((*(byte+3))>>3)&0x01;
PD5=((*(byte+3))>>4)&0x01;
PD2345=PD2<<3;
PD2345|=PD3<<2;
PD2345|=PD4<<1;
PD2345|=PD5;
return calculate_pll_lpf(PD2345);
*/
}
void Cpll::calculate_combo_to_byte()
{
CString t;
double data;
int byte_[10];
int i=0;
for(i=0;i<=4;i++) byte_[i]=((Cnim*)m_pParent)->tuner.byte[i];
UpdateData(TRUE);
//LPF
long LPF;
sscanf(m_lpf,"%lf",&data);
LPF=long(data*1000.);
calculate_pll_lpf_to_byte(LPF,&byte_[0]);
//
for(i=0;i<=4;i++) ((Cnim*)m_pParent)->tuner.byte[i]=byte_[i];
set_dialog();
}
void Cpll::calculate_pll_lpf_to_byte(long LPF, int *byte)
{
//ix2410 aaaaa
int data,pd2,pd3,pd4,pd5;
//lpf
data=int((LPF/1000.)/2.-2.);
pd2=(data>>1)&0x04;
pd3=(data<<1)&0x08;
pd4=(data<<2)&0x08;
pd5=(data<<4)&0x10;
*(byte+3)&=0xE7;
*(byte+4)&=0xF3;
*(byte+3)|=(pd5|pd4); //byte_4
*(byte+4)|=(pd3|pd2); //byte_5
/*
//QM1D1B0004
int data,PD2,PD3,PD4,PD5;
data = int( double(LPF)/1000./2. - 2.);
PD2 = (data>>3)&0x01;
PD3 = (data>>2)&0x01;
PD4 = (data>>1)&0x01;
PD5 = (data)&0x01;
*(byte+3) &= 0xE7;
*(byte+4) &= 0xF3;
*(byte+3) |= ( (PD5<<4)|(PD4<<3) );
*(byte+4) |= ( (PD3<<3)|(PD2<<2) );
*/
}
void Cpll::OnKillfocusCOMBOfreq()
{
// TODO: 偙偺埵抲偵僐儞僩儘乕儖捠抦僴儞僪儔梡偺僐乕僪傪捛壛偟偰偔偩偝偄
}
void Cpll::OnKillfocusComboLpf()
{
calculate_combo_to_byte();
}
void Cpll::OnKillfocusEDITbyte1()
{
get_dialog_byte();
set_dialog();
}
void Cpll::OnKillfocusEDITbyte2()
{
get_dialog_byte();
set_dialog();
}
void Cpll::OnKillfocusEDITbyte3()
{
get_dialog_byte();
set_dialog();
}
void Cpll::OnKillfocusEDITbyte4()
{
get_dialog_byte();
set_dialog();
}
void Cpll::OnKillfocusEDITbyte5()
{
get_dialog_byte();
set_dialog();
}
void Cpll::get_dialog_byte()
{
long data;
UpdateData(TRUE);
sscanf(m_byte1, "%x", &data );
((Cnim*)m_pParent)->tuner.byte[0]=data;
sscanf(m_byte2, "%x", &data );
((Cnim*)m_pParent)->tuner.byte[1]=data;
sscanf(m_byte3, "%x", &data );
((Cnim*)m_pParent)->tuner.byte[2]=data;
sscanf(m_byte4, "%x", &data );
((Cnim*)m_pParent)->tuner.byte[3]=data;
sscanf(m_byte5, "%x", &data );
((Cnim*)m_pParent)->tuner.byte[4]=data;
}
long Cpll::calculate_LPF_from_baud(long baud)
{
long LPF;
if((34000<baud)) LPF=34000;
if((32000<baud)&&(baud<=34000) ) LPF=34000;
if((30000<baud)&&(baud<=32000)) LPF=32000;
if((28000<baud)&&(baud<=30000)) LPF=30000;
if((26000<baud)&&(baud<=28000)) LPF=28000;
if((24000<baud)&&(baud<=26000)) LPF=26000;
if((22000<baud)&&(baud<=24000)) LPF=24000;
if((20000<baud)&&(baud<=22000)) LPF=22000;
if((18000<baud)&&(baud<=20000)) LPF=20000;
if((16000<baud)&&(baud<=18000)) LPF=18000;
if((14000<baud)&&(baud<=16000)) LPF=16000;
if((12000<baud)&&(baud<=14000)) LPF=16000;
if((10000<baud)&&(baud<=12000)) LPF=14000;
if((8000<baud)&&(baud<=10000)) LPF=14000;
if((6000<baud)&&(baud<=8000)) LPF=12000;
if((4000<baud)&&(baud<=6000)) LPF=10000;
if(baud<=4000) LPF=10000;
//CString t;
//t.Format("calculate_LPF_from_baud:baud=%d lpf=%d",baud,LPF);
//MessageBox(t);
// if(baud>=20000) LPF=34000;
// else LPF=20000;
return LPF;
}
int Cpll::pll_getdata(int *byte_)
{
int data_[10];
// unsigned char data_[10];
((Cnim*)m_pParent)->bus_open();
((Cnim*)m_pParent)->i2c_read_write(0,byte_[0],data_,1);
return data_[0];
}
//------------------------------------
//---------------IX2410---------------
//------------------------------------
long Cpll::tun_getfreq(int *byte_) //kHz
// double Cpll::tun_getfreq(int *byte_) //kHz
{
long data;
long freq;
data=( (byte_[1]&0x1F)<<8 )|byte_[2];
freq=data*long( calculate_pll_step(*(byte_+3)) );
return freq;
/*
long data;
double freq;
data=( (byte_[1]&0x1F)<<8 )|byte_[2];
freq=double(data)*calculate_pll_step(*(byte_+3));
return freq;
*/
// int P,N,A;
// long data;
// double freq;
// data=( (byte_[1]&0x1F)<<8 )|byte_[2];
// P=calculate_dividing_factor_of_prescaler(byte_);
// N=(data>>5)&0xFF;
// N*=P;
// A=data&0x1F;
// data=N|A;
// freq=double(data)*calculate_pll_step_QM1D1B0004(*(byte_+3));
// return freq;
}
void Cpll::tun_setfreq(long freq, long baud, int *byte_) //kHz, ksps
{
//V0.03[xxxxxx]
//if baud is unknown(blind search mode),
//set the LPF cutoff should be widest.
if(baud==0) baud=45000;
//CString t,tt;
//int i;
//t.Format(" %ld %ld \n",freq,baud);
//tt+=t;
//for(i=0;i<5;i++) {
// t.Format(" %.2X \n",byte_[i]); tt+=t;
//}
// //MessageBox(tt);
//tt+="\n";
//ix2410
//if(*(byte_)==0) //calculate the default value
{
//init_pll_ic(byte_);
calculate_pll_divider_byte(freq,byte_);
calculate_pll_lpf_cutoff(baud,byte_);
calculate_pll_vco(freq,byte_);
}
pll_setdata(byte_);
}
void Cpll::init_pll_ic(int *byte_)
{
//ix2410
//default setting
*byte_=0xC0; //address=C0
//byte_4
*(byte_+3)=0x80; //bit7=1;
*(byte_+3)|=0x60; //CP=11;
*(byte_+3)|=0x01; //pll step=500kHz [R1/R0=0/1];
*(byte_+3)|=0x04; //TM=1
//仾byte4傪堦偐傜寁嶼偟偰傞丅
}
void Cpll::calculate_pll_divider_byte(long freq, int *byte_)
{
//ix2410
long data;
data=long( double(freq)/calculate_pll_step(*(byte_+3))+.5 );
*(byte_+1)=int((data>>8)&0x7f); //byte2
*(byte_+2)=int(data&0xff); //byte3
}
void Cpll::calculate_pll_lpf_cutoff(long baud, int *byte_)
{
//CString t; t.Format("baud:%ld",baud); MessageBox(t);
//ix2410
if(baud>0){ //calculate LPF automatically
double lpf;
if( baud>=40000 ) lpf=34000.;//LPF=34MHz
if( (40000>baud) && (baud>=39000) ) lpf=30000.;//LPF=30MHz
if( (39000>baud) && (baud>=35000) ) lpf=28000.;//LPF=28MHz
if( (35000>baud) && (baud>=30000) ) lpf=26000.;//LPF=26MHz
if( (30000>baud) && (baud>=26000) ) lpf=24000.;//LPF=24MHz
if( (26000>baud) && (baud>=23000) ) lpf=22000.;//LPF=22MHz
if( (23000>baud) && (baud>=21000) ) lpf=20000.;//LPF=20MHz
if( (21000>baud) && (baud>=19000) ) lpf=18000.;//LPF=18MHz
if( (19000>baud) && (baud>=18000) ) lpf=16000.;//LPF=16MHz
if( (18000>baud) && (baud>=17000) ) lpf=14000.;//LPF=14MHz
if( (17000>baud) && (baud>=16000) ) lpf=12000.;//LPF=12MHz
if( 16000>baud) lpf=10000.;//LPF=10MHz
calculate_pll_byte(lpf,byte_);
}
else{//LPF setting not change
}
/*
//QM1D1B0004
double lpf;
//V1.03[031219]
if( baud>=40000 ) lpf=34000.;//LPF=34MHz
if( (40000>baud) && (baud>=39000) ) lpf=30000.;//LPF=30MHz
//
// if( (45000>=baud) && (baud>=39000) ) lpf=30000.;//LPF=30MHz
//
if( (39000>baud) && (baud>=35000) ) lpf=28000.;//LPF=28MHz
if( (35000>baud) && (baud>=30000) ) lpf=26000.;//LPF=26MHz
if( (30000>baud) && (baud>=26000) ) lpf=24000.;//LPF=24MHz
if( (26000>baud) && (baud>=23000) ) lpf=22000.;//LPF=22MHz
if( (23000>baud) && (baud>=21000) ) lpf=20000.;//LPF=20MHz
if( (21000>baud) && (baud>=19000) ) lpf=18000.;//LPF=18MHz
if( (19000>baud) && (baud>=18000) ) lpf=16000.;//LPF=16MHz
if( (18000>baud) && (baud>=17000) ) lpf=14000.;//LPF=14MHz
if( (17000>baud) && (baud>=16000) ) lpf=12000.;//LPF=12MHz
if( 16000>baud) lpf=10000.;//LPF=10MHz
calculate_pll_byte(lpf,byte_);
*/
}
void Cpll::calculate_pll_vco(long freq, int *byte_)
{
long div=1 , ba=5 ;
//ZEROIF/VCO
//==V2.18[030221]==
if( (950000<=freq) && (freq<970000.) ) div=1,ba=6; //div=1,ba=5;
//==================
else if( (970000<=freq) && (freq<1065000.) ) div=1,ba=6;
else if( (1065000<=freq) && (freq<1170000.) ) div=1,ba=7;
else if( (1170000<=freq) && (freq<1300000.) ) div=0,ba=1;
else if( (1300000<=freq) && (freq<1445000.) ) div=0,ba=2;
else if( (1445000<=freq) && (freq<1607000.) ) div=0,ba=3;
else if( (1607000<=freq) && (freq<1778000.) ) div=0,ba=4;
else if( (1778000<=freq) && (freq<1942000.) ) div=0,ba=5;
else if( (1942000<=freq) && (freq<2131000.) ) div=0,ba=6;
//==V2.18[030221]==
else if(2131000<=freq) div=0,ba=6;
// div=0 , ba=7 ;
//==================
*(byte_+4)&=0xFD ; *(byte_+4)|=(div<<1); //byte_5
*(byte_+4)&=0x1F ; *(byte_+4)|=(ba<<5); //byte_5
}
void Cpll::pll_setdata(int *byte_)
{
bus_open(); //bus open
int data[10];
//ix2410
//<Initialization>
long byte4,byte5;
byte4=*(byte_+3); //byte4
byte5=*(byte_+4); //byte5
//
//Initialize
*(byte_+3)&=0xE3; //TM=0,LPF=4MHz
*(byte_+4)&=0xF3; //LPF=4MHz
// bus_open();
i2c_write(byte_,5);//write i2c data
//V0.01[030402]
//m_i2c.i2c_write(byte_,5);//write i2c data
//
//Adjustment
*(byte_+3)|=0x04; //TM=1
//V0.01[030402]
data[0]=*(byte_);
data[1]=*(byte_+3);
// bus_open();
i2c_write(data,2);//write i2c data
//m_i2c.i2c_write(&data[0],2);//write i2c data
Sleep(6); //wait 6ms
//===V0.02[030617] for MT312===
//set dummy wait <- PC time is unstable
Sleep(20);
//
//TM=1,LPF setting
//Data write
*(byte_+3)=byte4; //byte_4 original value
*(byte_+4)=byte5; //byte_5 original value
data[0]=*(byte_);
data[1]=*(byte_+3);
data[2]=*(byte_+4);
// bus_open();
i2c_write(data,3);//write i2c data
bus_close(); //bus close
}
void Cpll::calculate_pll_byte(double cutoff, int *byte_)
{
//ix2410
int data,pd2,pd3,pd4,pd5;
//lpf
data=int((cutoff/1000.)/2.-2.);
pd2=(data>>1)&0x04;
pd3=(data<<1)&0x08;
pd4=(data<<2)&0x08;
pd5=(data<<4)&0x10;
*(byte_+3)&=0xE7;
*(byte_+4)&=0xF3;
*(byte_+3)|=(pd5|pd4); //byte_4
*(byte_+4)|=(pd3|pd2); //byte_5
}
double Cpll::calculate_pll_step(int byte4)
{
//ix2410
int R10;
double Nref;
double pll_step;
R10=byte4&0x03;
Nref=4.*int(pow(2,R10));
pll_step=calculate_pll_xtal()/Nref;
return(pll_step) ;
}
double Cpll::calculate_pll_xtal()
{
double xtal;
xtal=double( ((Cnim*)m_pParent)->tuner.xtal )/1000.;
return xtal; //kHz
// return 4000.;//[kHz]
}
void Cpll::bus_open()
{
((Cnim*)m_pParent)->bus_open();
}
void Cpll::bus_close()
{
((Cnim*)m_pParent)->bus_close();
}
//before set LPF, adjustment should be finished
//V0.03[xxxxxx]
BOOL Cpll::tun_setbw(long baud_, int *byte_) //ksps
{
int flag=0;
int data[10];
data[0]=byte_[0];
data[1]=byte_[3];
data[2]=byte_[4];
calculate_pll_lpf_cutoff(baud_,byte_);
i2c_write(data,3);
return flag;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -