#include "config.h"
//26MHZ 0.5PPM 本振源
#define R00 0X201050
#define R01 0X89D89D1
#define R02 0X1180822
#define R03 0x3
#define R04 0X30008B84 //差分时钟输入(目前芯片有问题)
#define R04_EN 0X30008B94
#define R05 0X800025
#define R06 0X35A08076
#define R07 0X12000007
#define R08 0X102D0428
#define R09 0XB0B3CC9
#define R10 0XC0107A
#define R11 0X61300B
#define R12 0X1041C
#define Fref_in 26000 //输入时钟
#define F_pfd 26000 //鉴相频率
#define MODE1 16777216; //第一部分小数分频模数
#define MODE2 130; //第二部分小数分频模数
/*25MHZ 20PPM 本振源
#define R00 0X201100
#define R01 0X1
#define R02 0X7D2
#define R03 0x3
#define R04 0X30008B84 //差分时钟输入(目前芯片有问题)
#define R04_EN 0X30008B94
#define R05 0X800025
#define R06 0X35A08076
#define R07 0X12000007
#define R08 0X102D0428
#define R09 0XB0ABCC9
#define R10 0XC00FBA
#define R11 0X61300B
#define R12 0X1041C
#define Fref_in 25000 //输入时钟
#define F_pfd 25000 //鉴相频率
#define MODE1 16777216; //第一部分小数分频模数
#define MODE2 125; //第二部分小数分频模数
*/
void WriteToADF5355(unsigned long BUF) //写寄存器 一共32位
{unsigned char j = 0;
unsigned long ValueToWrite = 0;
ValueToWrite =BUF;
ADF5355_CLK=0;ADF5355_LE=0;
for(j=0; j<32; j++)
{if(0x80000000 == (ValueToWrite & 0x80000000))
{ADF5355_DATA=1;} //Send one to SDO pin
else{ADF5355_DATA=0;} //Send zero to SDO pin
ADF5355_CLK=1;
ValueToWrite <<= 1; //Rotate data
ADF5355_CLK=0;
}
ADF5355_CLK=0;
ADF5355_LE=1;ADF5355_LE=0;
}
void Write_frequence_AMP(unsigned long Freq,unsigned long Amp) //写频率和幅度
//AMP ==> 0:-4dbm 1:-1dbm 2:2dbm 3:5dbm
{float Freq_N,Freq_temp;
unsigned long INT,FRAC1,FRAC2; //整数分频, 小数分频1 小数分频2
unsigned long R0_temp=0; //控制INT
unsigned long R4_temp=0,MODE2_temp; //改变输出的分频控制字,一共分成7段
unsigned long Out_Divider,RF_Divider;//输出分频控制,3位 及对应的分频数
unsigned long xdata I_CP=9000,I_BLEED_N;
if((53125<=Freq)&&(Freq<106250)) { Out_Divider=6; RF_Divider=64;} //分频段
if((106250<=Freq)&&(Freq<212500)) { Out_Divider=5; RF_Divider=32;} //
if((212500<=Freq)&&(Freq<425000)) { Out_Divider=4; RF_Divider=16;} //
if((425000<=Freq)&&(Freq<850000)) { Out_Divider=3; RF_Divider=8; } //
if((850000<=Freq)&&(Freq<1700000)) { Out_Divider=2; RF_Divider=4; } //
if((1700000<=Freq)&&(Freq<3400000)){ Out_Divider=1; RF_Divider=2; } //
if((3400000<=Freq)&&(Freq<6800000)){ Out_Divider=0; RF_Divider=1; }
Freq_temp=Freq;
Freq2VCO=(Freq_temp*RF_Divider)*2;//计算出2倍VCO,从B端口输出
//计算整数分频INT;小数分频1FRAC1;小数分频2FRAC2
Freq_temp=Freq;
Freq_N=(Freq_temp*RF_Divider)/F_pfd; //计算出N分频值,带有小数位
Freq_temp=Freq_N;
INT=(unsigned long)Freq_temp;//计算出整数分频INT
I_BLEED_N=I_CP*4/(INT*375); //计算bleed 电流对应的值
I_BLEED_N=(unsigned long)I_BLEED_N;
Freq_temp=(Freq_N-INT)*MODE1;
FRAC1=(unsigned long)Freq_temp; //计算出小数分频1-FRAC1
Freq_temp=(Freq_N-INT)*MODE1
Freq_temp=Freq_temp-FRAC1;
FRAC2=(unsigned long)Freq_temp*MODE2;
MODE2_temp=MODE2;
WriteToADF5355((Out_Divider<<21)|(I_BLEED_N<<13)|(Amp<<4)|0X35000046);//R6
WriteToADF5355(R04_EN); //R4-计数器复位
WriteToADF5355(2|(MODE2_temp<<4)|(FRAC2<<18));//R2
WriteToADF5355(1|(FRAC1<<4)); //R1
WriteToADF5355(INT<<4); //R0
WriteToADF5355(R04); //R4-计数器启动
WriteToADF5355(0X200000|(INT<<4));
}
void Init_ADF5355(void)
{
WriteToADF5355(R12);
WriteToADF5355(R11);
WriteToADF5355(R10);
WriteToADF5355(R09);
WriteToADF5355(R08);
WriteToADF5355(R07);
WriteToADF5355(R06);
WriteToADF5355(R05);
WriteToADF5355(R04);
WriteToADF5355(R03);
WriteToADF5355(R02);
WriteToADF5355(R01);
WriteToADF5355(R00);
}
这是来源网络的一段代码,是否争取还位置,需要测试一下。之后的实验要用这个代码测试,如果不成功就要就要根据数据手册死磕每个寄存器的内容。
暂时放在这里之后调试。