📄 calcfreq.c
字号:
#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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -