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

📄 demod.cpp

📁 通过PC并口模拟I2C信号
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	int F288_FROZE_LOCK;
	F288_FROZE_LOCK=flag;
	int address=0x50;
	register_[address]&=0xDF;
	register_[address]|=(F288_FROZE_LOCK<<5);
	demod_setdata(address,register_[address]);
}

void Cdemod::demod_288_fine(long Symbolrate_Bds, long Known, int *register_)
{
	int address;
	long i=0;
	long fmin=0;
	long fmax=0;
	long MasterClock_Hz;
	MasterClock_Hz=demod_288_get_mclk_freq(register_);

CString t;

	if(Known)
	{
	//仠曄峏[060529]丗1Msps懳墳丂僔儞儃儖儗乕僩堷偒崬傒斖埻傪嫹傔傞偲岠壥偁傞丠丠
		/* +/- 1% search range */
		fmin=long( ((Symbolrate_Bds/1000)*0.99*32768) /(MasterClock_Hz/1000)); /* 2^15=32768*/
		fmax=long( ((Symbolrate_Bds/1000)*1.01*32768) /(MasterClock_Hz/1000));
//		/* +/- 5% search range */
//		 fmin=long( ((Symbolrate_Bds/1000)*0.95*32768) /(MasterClock_Hz/1000)); /* 2^15=32768*/
//		 fmax=long( ((Symbolrate_Bds/1000)*1.05*32768) /(MasterClock_Hz/1000));
//t.Format("::demod_288_fine[仠Known]/fmin=%.4X,fmax=%.4X",fmin,fmax); message(t);
	}
	else
	{
		//僆儕僕僫儖
		/* +/- 15% search range */
		fmin=long(((Symbolrate_Bds/1000)*0.85*32768)/(MasterClock_Hz/1000)); /* 2^15=32768*/
		fmax=long(((Symbolrate_Bds/1000)*1.15*32768)/(MasterClock_Hz/1000));
		/* fine loop start from high limit when symbol rate is unknown */
		demod_288_set_symbolrate(long(Symbolrate_Bds*1.1),register_);

	}

	address=0x53;
	register_[address]=(1<<7)|MSB(fmin); //F288_STOP_ON_FMIN=1
	demod_setdata(address,register_[address]);

	address+=1;
	register_[address]=LSB(fmin);
	demod_setdata(address,register_[address]);

	address+=1;
	register_[address]=MSB(fmax);
	demod_setdata(address,register_[address]);

	address+=1;
	register_[address]=LSB(fmax);
	demod_setdata(address,register_[address]);

	address+=1;
	register_[address]=MAX( (Symbolrate_Bds/1000000),1 );
	demod_setdata(address,register_[address]);

	demod_288_start_fine_algorithm(1,register_); /* start fine algorithm */

	i=0;
	int F288_FINE;
	int flag;
	address=0x50;
	do
	{
		//V0.04[061109] [STB0288+ix2410]
		//1ms -> 10ms 
		WAIT_N_MS(10); //<---
		//		// WAIT_N_MS(1);
		//		WAIT_N_MS(1); //test?? 060525

message("WAIT_N_MS(10)");
//message("WAIT_N_MS(1)");

		i++;
		demod_getdata(address,&F288_FINE);
		flag=(F288_FINE>>1)&0x01;

t.Format("  (demod_288_fine/[%d] flag=%ld)",i,flag); message(t);

	//仠曄峏丗僒乕僠夞悢惂尷捛壛:100夞
	}while( (flag) && (i<100) ); /* wait for end of fine algorithm */
	// <- loop num is 100 times in spite of wait time modified :1ms -> 10ms

	//}while(flag); /* wait for end of fine algorithm */

	demod_288_start_fine_algorithm(0,register_); /* stop fine algorithm */

}

long Cdemod::demod_288_autocenter(int *register_)
{
CString t;
	long timeout=0,timing;
	//	int address;
	//	address=0x22;
	//	int F288_TIMING_LOOP_FREQ_MSB;
	//	int F288_TIMING_LOOP_FREQ_LSB;
	demod_288_start_autocenter_algorithm(1,register_); /* Start autocentre algorithm */
	do
	{
t.Format("  (%.3d )",timeout); message(t);
		WAIT_N_MS(10); /* wait 10 ms */

message("WAIT_N_MS(10)");

		timeout++;

		timing=demod_288_get_timing_loop(register_);
	//		demod_getdata(address,&F288_TIMING_LOOP_FREQ_MSB);
	//		demod_getdata(address+1,&F288_TIMING_LOOP_FREQ_LSB);
	//		timing=BYTES2WORD(F288_TIMING_LOOP_FREQ_MSB,F288_TIMING_LOOP_FREQ_LSB);
	//t.Format("  (demod_288_autocenter: timing=%ld \t(%.8X) )",timing,timing); message(t);
	//		//仠曄峏丗亄亅嬌惈愝掕
	//		if(timing>0x10000/2) { //2's complement
	//			timing=0x10000-timing;
	//			timing*=-1;
	//		}

t.Format("  (demod_288_autocenter: timing=%ld \t(%.8X) )",timing,timing); message(t);

	}while((ABS(timing)>300) && (timeout<100));			/* timing loop is centered or timeout limit is reached */
	demod_288_start_autocenter_algorithm(0,register_);	/* Stop autocentre algorithm */

	return timing;
}

void Cdemod::demod_288_start_autocenter_algorithm(int flag, int *register_)
{
	int address=0x50;
	register_[address]&=0xFB;
	register_[address]|=(flag<<2);
	demod_setdata(address,register_[address]);
}

int Cdemod::demod_288_get_cf(int *register_)
{
	int CF;
	int address=0x24,data;
	demod_getdata(address,&data);
	CF=(data>>7)&0x01;
	return CF;
}

long Cdemod::demod_288_data_timing_constant(long SymbolRate, int *register_)
{
	int address;
	int data;
	long Tviterbi = 0,
		TimeOut = 0,
		THysteresis = 0,
		Tdata = 0,
		PhaseNumber[6] = {2,6,4,6,14,8},
		averaging[4] = {1024,4096,16384,65536},
		InnerCode = 1000,
		HigherRate = 1000;
	long i;
	int Pr,Sn,To,Hy;
	/*=======================================================================
	-- Data capture time (in ms)
	-- -------------------------
	-- This time is due to the Viterbi synchronisation.
	--
	-- For each authorized inner code, the Viterbi search time is calculated,
	-- and the results are cumulated in ViterbiSearch.
	-- InnerCode is multiplied by 1000 in order to obtain timings in ms
	=======================================================================*/
	//Pr=ChipGetOneRegister(hDemod,R288_PR);
	address=0x37;
	demod_getdata(address,&Pr);
	address=0x38;
	demod_getdata(address,&data);
	Sn=(data>>4)&0x03;
	To=(data>>2)&0x03;
	Hy=data&0x03;

	for(i=0;i<6;i++)
	{
		if (((Pr >> i)& 0x01) == 0x01)
		{
			switch(i)
			{
			case 0:						/* inner code 1/2 */
				InnerCode = 2000;		/* 2.0 */
				break;
			case 1:						/* inner code 2/3 */
				InnerCode = 1500;		/* 1.5 */
				break;
			case 2:						/* inner code 3/4 */
				InnerCode = 1333;		/* 1.333 */
				break;
			case 3:						/* inner code 5/6 */
				InnerCode = 1200;		/* 1.2 */
				break;
			case 4:						/* inner code 6/7 */
				InnerCode = 1167;		/* 1.667 */
				break;
			case 5:						/* inner code 7/8 */
					InnerCode = 1143;	/* 1.143 */
				break;
			}
			Tviterbi += (2*PhaseNumber[i]*averaging[Sn]*InnerCode);
			if(HigherRate < InnerCode)
				HigherRate = InnerCode;
		}
	}
	/* Time out calculation (TimeOut)
	-- ------------------------------
	-- This value indicates the maximum duration of the synchro word research. */
	TimeOut = long(HigherRate * 16384L * (1L<<To)); /* 16384= 16x1024 bits */
													 /* Hysteresis duration (Hysteresis)
	-- ------------------------------ */
	THysteresis = long(HigherRate * 26112L * (1L<<Hy)); /* 26112= 16x204x8 bits */
	Tdata =((Tviterbi + TimeOut + THysteresis) / (2*long(SymbolRate) ));
	/* a guard time of 1 mS is added */
	return (1L + (long)Tdata);


}


BOOL Cdemod::demod_288_waitlock(long TData,int *register_)
{

	//V0.05[061204] [TILT4]
	//wait time set twice??
	TData*=2;
	
	//V0.04[061109] [STB0288+ix2410]
	//1ms -> 10ms
	//----------------------
	CString t;
	t.Format("  (demod_288_waitlock: TData=%ld)",TData); message(t);
		int address=0x24;
		int data;
		long timeout=0;
		BOOL lock;
		do
		{
			 WAIT_N_MS(10); //wait 1 ms //<---
			 //WAIT_N_MS(1); //wait 1 ms
	message("WAIT_N_MS(1)");
			timeout+=10; //<---
			//timeout++;
			demod_getdata(address,&data);
			lock=(data>>3)&0x01;
	t.Format("  (demod_288_waitlock: lock= %ld (%.2X) \t[%d] )",lock,data,timeout ); message(t);
if(lock==1) {
t.Format("---> demod_288_waitlock/OK!!"); message(t);
message("");
}

		}while(!lock && (timeout<TData+10)); //<---
		// }while(!lock && (timeout<TData));
		return lock;
	//----------------------

//CString t;
//t.Format("  (demod_288_waitlock: TData=%ld)",TData); message(t);
//
//	int address=0x24;
//	int data;
//	long timeout=0;
//	BOOL lock;
//	do
//	{
//		WAIT_N_MS(1); /* wait 1 ms */
//
//message("WAIT_N_MS(1)");
//
//
//		timeout++;
//		demod_getdata(address,&data);
//		lock=(data>>3)&0x01;
//t.Format("  (demod_288_waitlock: lock=%ld \t[%d] )",lock,timeout); message(t);
//	}while(!lock && (timeout<TData));
//	return lock;



}

int Cdemod::demod_288_get_pr(int *register_)
{
	int address=0x24;
	int data;
	demod_getdata(address,&data);
	register_[address]=data;
	return data&0x07;
}

//#define test 1
void Cdemod::demod_288_init(int *register_)
{
	int address;
	int data;

#ifdef test //Def288Val[STX288_NBREGS]
//	register_[0x00]=0x10;
//	register_[0x01]=0x15;/* 0xa5; */
//	register_[0x02]=0x20;
//	register_[0x03]=0x8e;
//	register_[0x04]=0x8e;
//	register_[0x05]=0x12;
//	register_[0x06]=0x00;
//	register_[0x07]=0x20;
//	register_[0x08]=0x00;
//	register_[0x09]=0x00;
//	register_[0x0a]=0x04;
//	register_[0x0b]=0x00;
//	register_[0x0c]=0x00;
//	register_[0x0d]=0x00;
//	register_[0x0e]=0xc4; /* 0xd4; agc pol */
//	register_[0x0f]=0x54; /*0x30; AGC REF*/
//	register_[0x10]=0xf2;
//	register_[0x11]=0x7a;
//	register_[0x12]=0x03;
//	register_[0x13]=0x48;
//	register_[0x14]=0x84;
//	register_[0x15]=0xc5;
//	register_[0x16]=0xb7;
//	register_[0x17]=0x9c;
//	register_[0x18]=0x00;
//	register_[0x19]=0xa6;
//	register_[0x1a]=0x88;
//	register_[0x1b]=0x8f;
//	register_[0x1c]=0xf0;
//	register_[0x1e]=0x80;
//	register_[0x1f]=0x26;
//	register_[0x20]=0x0b;
//	register_[0x21]=0x54;
//	register_[0x22]=0xff;
//	register_[0x23]=0x01;
//	register_[0x24]=0x9a;
//	register_[0x25]=0x7f;
//	register_[0x26]=0x00;
//	register_[0x27]=0x00;
//	register_[0x28]=0x46;
//	register_[0x29]=0x66;
//	register_[0x2a]=0x90;
//	register_[0x2b]=0xfe;
//	register_[0x2c]=0x78;
//	register_[0x2d]=0x0e;
//	register_[0x2e]=0x5d;
//	register_[0x2f]=0x00;
//	register_[0x30]=0x00;
//	register_[0x31]=0x1e;
//	register_[0x32]=0x14;
//	register_[0x33]=0x0f;
//	register_[0x34]=0x09;
//	register_[0x35]=0x0c;
//	register_[0x36]=0x05;
//	register_[0x37]=0x2f;
//	register_[0x38]=0x16;
//	register_[0x39]=0xbd;
//	register_[0x3a]=0x00;
//	register_[0x3b]=0x13;
//	register_[0x3c]=0x11;
//	register_[0x3d]=0x30;
//	register_[0x3e]=0x00;
//	register_[0x3f]=0x00;
//	register_[0x40]=0x63;
//	register_[0x41]=0x04;
//	register_[0x42]=0x60;
//	register_[0x43]=0x00;
//	register_[0x44]=0x00;
//	register_[0x45]=0x00;
//	register_[0x46]=0x00;
//	register_[0x47]=0x00;
//	register_[0x4a]=0x00;
//	register_[0x4b]=0x1b;
//	register_[0x4c]=0x28;
//	register_[0x50]=0x10;
//	register_[0x51]=0x36;
//	register_[0x52]=0x12; //0x09 (KC,KS : 001 -> 010)
//	register_[0x53]=0x94;
//	register_[0x54]=0xb2;
//	register_[0x55]=0x29;
//	register_[0x56]=0x64;
//	register_[0x57]=0x2b;
//	register_[0x58]=0x54;
//	register_[0x59]=0x86;
//	register_[0x5a]=0x00;
//	register_[0x5b]=0x9b;
//	register_[0x5c]=0x08;
//	register_[0x5d]=0x7f;
//	register_[0x5e]=0xff;
//	register_[0x5f]=0x8d;
//	register_[0x60]=0x82;
//	register_[0x61]=0x82;
//	register_[0x62]=0x82;
//	register_[0x63]=0x02;
//	register_[0x64]=0x02;
//	register_[0x65]=0x02;
//	register_[0x66]=0x82;
//	register_[0x67]=0x82;
//	register_[0x68]=0x82;
//	register_[0x69]=0x82;
//	register_[0x6a]=0x38;
//	register_[0x6b]=0x0c;
//	register_[0x6c]=0x00;
//	register_[0x70]=0x00;
//	register_[0x71]=0x00;
//	register_[0x72]=0x00;
//	register_[0x74]=0x00;
//	register_[0x75]=0x00;
//	register_[0x76]=0x00;
//	register_[0x81]=0x00;
//	register_[0x82]=0x3f;
//	register_[0x83]=0x3f;
//	register_[0x84]=0x00;
//	register_[0x85]=0x00;
//	register_[0x88]=0x00;
//	register_[0x89]=0x00;
//	register_[0x8a]=0x00;
//	register_[0x8b]=0x00;
//	register_[0x8c]=0x00;
//	register_[0x90]=0x00;
//	register_[0x91]=0x00;
//	register_[0x92]=0x00;
//	register_[0x93]=0x00;
//	register_[0x94]=0x1c;
//	register_[0x97]=0x00;
//	register_[0xa0]=0x48;
//	register_[0xa1]=0x00;
//	register_[0xb0]=0xb8;
//	register_[0xb1]=0x3a;
//	register_[0xb2]=0x10;
//	register_[0xb3]=0x82;
//	register_[0xb4]=0x80;
//	register_[0xb5]=0x82;
//	register_[0xb6]=0x82;
//	register_[0xb7]=0x82;
//	register_[0xb8]=0x20;
//	register_[0xb9]=0x00;
//	register_[0xf0]=0x00;
//	register_[0xf1]=0x00;
//	register_[0xf2]=0xc0;

#endif

CString t; 

	//-----
	int i;
	for(i=0;i<=0xFF;i++)
	{
		if(register_[i]>=0)
		{
			address=i;	data=register_[address];
			demod_setdata(address,data);

//			if(i%0x10==0){
//				t.Format("%.2X",i); MessageBox(t);
//			}

		}
	}
	//-----


//	//--------------------------------------------------
//		address=0x0E;	data=register_[address];
//		demod_setdata(address,data);
//		address=0x18;	data=register_[address];
//		demod_setdata(address,data);
//		address=0x30;	data=register_[address];
//		demod_setdata(address,data);
//		address=0x37;	data=register_[address];
//		demod_setdata(address,data);
//		address=0x39;	data=register_[address];
//		demod_setdata(address,data);
//		address=0x3C;	data=register_[address];
//	//--------------------------------------------------


}

long Cdemod::demod_288_get_error(int *register_)
{
CString t,tt; 
	long ber=0;
	long i;
	//Read registers仺disabled
	//	int address;
	//	address=0x16;
	//	demod_getdata(address,&register_[address]);
	//	address=0x3B;
	//	demod_getdata(address,&register_[address]);
	//	address=0x24;
	//	demod_getdata(address,&register_[address]);

	demod_288_get_error_count(); /* remove first counter value */

		//	/* Average 10 ber values */
		//	for(i=0;i<10;i++)
		//	{
		//	WAIT_N_MS(100);
		//	ber += FE_288_GetErrorCount(hChip,COUNTER1);
		//	}
		//	ber/=10;

	int num=1;
	for(i=0;i<num;i++)
	{
		WAIT_N_MS(100);
		ber+=demod_288_get_error_count();
	}
	ber/=num;

t.Format("ber:%d\n",ber); tt=t;

	if(demod_288_cf(register_)) //0x24
	{
t.Format("demod_288_cf:%d\n",demod_288_cf(register_)); tt+=t; 
t.Format("demod_288_errmode:%d\n",demod_288_errmode(register_)); tt+=t;
		if(!demod_288_errmode(register_)) //0x3B
		{
			/* Error Rate */
			ber *= 9766;
			ber /= PowOf2(2 + 2*demod_288_noe(register_) ); //0x3B /* theses two lines => ber = ber * 10^7 */
		}
t.Format("demod_288_errsource:%d\n",demod_288_errsource(register_)); tt+=t;
		//	switch(ChipGetFieldImage(hChip,F288_ERR_SOURCE))
		switch(demod_288_errsource(register_) )
		{
		case 0 : /* QPSK bit errors */
			ber /= 8;
t.Format("demod_288_pr:%d\n",demod_288_pr(register_)); tt+=t;
			switch(demod_288_pr(register_))
			{
			case 0: /* PR 1/2 */
				ber *= 1;
				ber /= 2;
				break;
			case 1: /* PR 2/3 */
				ber *= 2;
				ber /= 3;
				break;
			case 2: /* PR 3/4 */
				ber *= 3;
				ber /= 4;
				break;
			case 3: /* PR 5/6 */
				ber *= 5;
				ber /= 6;
				break ;
			case 4: /* PR 6/7 */
				ber *= 6;
				ber /= 7;
				break;
			case 5: /* PR 7/8 */
				ber *= 7;
				ber /= 8;
				break;
			default :
				ber = 0;
				break;
			}
			break;
			case 1: /* Viterbi bit errors */
				ber /= 8;
				break;
			case 2: /* Viterbi byte errors */

⌨️ 快捷键说明

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