calcfreq.c

来自「基于WINCE的FM发射程序」· C语言 代码 · 共 139 行

C
139
字号
#include "calcfreq.h"

char calc_pll(unsigned char* p_pll1, unsigned char* p_pll2, unsigned char freq1, unsigned char freq2 )
{
	unsigned char freq[2];								//	input frequency
	unsigned char dat[8];								//	low 4bit valid data
	unsigned char plus[4];								//	data[8] -> plus[4]
	unsigned char pll[2];								//	pll register
	unsigned char is_plus;								//	carry value
	//----	input
	freq[0] = freq1;
	freq[1] = freq2;

	//----	
	//----	((N1<<16) + (N1<<15) + (N1<<10) + (N1<<9) + (N1<<7) + (N1<<5));		//N*100000	N*0x000186A0
	//----	((N<<19) + (N<<18) + (N<<17) + (N<<16) + (N<<14) + (N<<9) + (N<<6));	//N*1000000	N*0x000F4240
	//----	

	//----	freq[0]<<6
	dat[0] =	0;
	dat[1] =	(freq[0]<<2) & 0x0C;
	dat[2] =	(freq[0]>>2) & 0x0F;
	dat[3] =	(freq[0]>>6) & 0x03;

	//----	freq[0]<<9
	dat[2] +=	(freq[0]<<1) & 0x0E;
	dat[3] +=	(freq[0]>>3) & 0x0F;
	dat[4] =	(freq[0]>>7) & 0x01;

	//----	freq[0]<<14
	dat[3] +=	(freq[0]<<2) & 0x0C;
	dat[4] +=	(freq[0]>>2) & 0x0F;
	dat[5] =	(freq[0]>>6) & 0x03;

	//----	freq[0]<<16
	dat[4] +=	(freq[0]) & 0x0F;
	dat[5] +=	(freq[0]>>4) & 0x0F;

	//----	freq[0]<<17
	dat[4] +=	(freq[0]<<1) & 0x0E;
	dat[5] +=	(freq[0]>>3) & 0x0F;
	dat[6] =	(freq[0]>>7) & 0x01;

	//----	freq[0]<<18
	dat[4] +=	(freq[0]<<2) & 0x0C;
	dat[5] +=	(freq[0]>>2) & 0x0F;
	dat[6] +=	(freq[0]>>6) & 0x03;

	//----	freq[0]<<19
	dat[4] +=	(freq[0]<<3) & 0x08;
	dat[5] +=	(freq[0]>>1) & 0x0F;
	dat[6] +=	(freq[0]>>5) & 0x07;

	//----	freq[1]<<5
	dat[1] +=	(freq[1]<<1) & 0x0E;
	dat[2] +=	(freq[1]>>3) & 0x0F;
	dat[3] +=	(freq[1]>>7) & 0x01;

	//----	freq[1]<<7
	dat[1] +=	(freq[1]<<3) & 0x08;
	dat[2] +=	(freq[1]>>1) & 0x0F;
	dat[3] +=	(freq[1]>>5) & 0x07;

	//----	freq[1]<<9
	dat[2] +=	(freq[1]<<1) & 0x0E;
	dat[3] +=	(freq[1]>>3) & 0x0F;
	dat[4] +=	(freq[1]>>7) & 0x01;

	//----	freq[1]<<10
	dat[2] +=	(freq[1]<<2) & 0x0C;
	dat[3] +=	(freq[1]>>2) & 0x0F;
	dat[4] +=	(freq[1]>>6) & 0x03;

	//----	freq[1]<<15
	dat[3] +=	(freq[1]<<3) & 0x08;
	dat[4] +=	(freq[1]>>1) & 0x0F;
	dat[5] +=	(freq[1]>>5) & 0x07;

	//----	freq[1]<<16
	dat[4] +=	(freq[1]) & 0x0F;
	dat[5] +=	(freq[1]>>4) & 0x0F;

	//----
	//----	0x0004E380 plus
	//----	304kHz     + Half-adjust  plus value
	//----	0x0004A380 + 0x00004000 = 0x0004E380
	//----
	dat[0] +=	0x00;
	dat[1] +=	0x08;
	dat[2] +=	0x03;
	dat[3] +=	0x0E;
	dat[4] +=	0x04;
	dat[5] +=	0x00;
	dat[6] +=	0x00;
	dat[7] =	0x00;

	//----
	//----	Carry adjustment & 4bit-8bit conversion
	//----	data[8] 7777 6666 5555 4444 3333 2222 1111 0000
	//----	           ||       ||       ||       ||
	//----	temp[4] 77776666 55554444 33332222 11110000
	//----

	plus[0] =	(dat[1]<<4) + (dat[0]);
	is_plus	=	(plus[0] < dat[0]) ? 1 : 0;
	plus[1] =	(dat[3]<<4) + (dat[2]) + (dat[1]>>4) + is_plus;
	is_plus	=	(plus[1] < (dat[2] +(dat[1]>>4))) ? 1 : 0;
	plus[2] =	(dat[5]<<4) + (dat[4]) + (dat[3]>>4) + is_plus;
	is_plus	=	(plus[2] < (dat[4] +(dat[3]>>4))) ? 1 : 0;
	plus[3] =	(dat[7]<<4) + (dat[6]) + (dat[5]>>4) + is_plus;


	//----	n>>15 = n/32768
//	pll[0] = ((plus[1]>>7) & 0x01) | ((plus[2]<<1) & 0xFE);
//	pll[1] = ((plus[2]>>7) & 0x01) | ((plus[3]<<1) & 0xFE);

	//----	n>>13 = n/8192
	pll[0] = ((plus[1]>>5) & 0x07) | ((plus[2]<<3) & 0xF8);
	pll[1] = ((plus[2]>>5) & 0x07) | ((plus[3]<<3) & 0xF8);


	*p_pll1 = pll[0];
	*p_pll2 = pll[1];


	//----	
	dat[3] -=	0x04;
	
	plus[0] =	(dat[1]<<4) + (dat[0]);
	is_plus	=	(plus[0] < dat[1]) ? 1 : 0;
	plus[1] =	(dat[3]<<4) + (dat[2]) + (dat[1]>>4) + is_plus;
	is_plus	=	(plus[1] < dat[3]) ? 1 : 0;
	plus[2] =	(dat[5]<<4) + (dat[4]) + (dat[3]>>4) + is_plus;
	is_plus	=	(plus[2] < dat[5]) ? 1 : 0;
	plus[3] =	(dat[7]<<4) + (dat[6]) + (dat[5]>>4) + is_plus;
	return 1;
}

⌨️ 快捷键说明

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