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

📄 pll.cpp

📁 通过PC并口模拟I2C信号
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -