ADF5355的C设置代码

66 篇文章 23 订阅
58 篇文章 27 订阅

#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);  

}

这是来源网络的一段代码,是否争取还位置,需要测试一下。之后的实验要用这个代码测试,如果不成功就要就要根据数据手册死磕每个寄存器的内容。

暂时放在这里之后调试。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的ADF4356初始化代码,用于配置ADF4356以输出一个特定的频率。请注意,这只是一个示例代码,并且需要根据您的具体需求进行修改和调整。 ```c #include "stm32f4xx.h" #define ADF4356_REG0 0x00 #define ADF4356_REG1 0x01 #define ADF4356_REG2 0x02 #define ADF4356_REG3 0x03 // 其他寄存器定义... void ADF4356_Write(uint32_t reg, uint32_t value) { // 将reg和value写入ADF4356的SPI接口 // ... } void ADF4356_Init(void) { uint32_t ref = 10000000; // 参考时钟频率为10MHz uint32_t freq = 1000000000; // 输出频率为1GHz uint32_t divider = 0; uint32_t reg0 = 0, reg1 = 0, reg2 = 0; // 计算分频器值 divider = (freq / 25) - 1; // 设置寄存器0 reg0 = (1 << 14) | (divider << 3); ADF4356_Write(ADF4356_REG0, reg0); // 设置寄存器1 reg1 = (1 << 15) | (1 << 13) | (1 << 12) | (1 << 11) | (1 << 4) | (1 << 3) | (1 << 2) | (1 << 1) | (1 << 0); ADF4356_Write(ADF4356_REG1, reg1); // 设置寄存器2 reg2 = (1 << 15) | (1 << 14) | (1 << 12) | (1 << 11) | (1 << 3) | (1 << 2); ADF4356_Write(ADF4356_REG2, reg2); // 设置参考时钟分频器 reg3 = (1 << 15) | ((ref / 1000000 - 1) << 3); ADF4356_Write(ADF4356_REG3, reg3); } int main(void) { // 初始化SPI接口等硬件 // ... // 初始化ADF4356 ADF4356_Init(); while (1) { // 主循环 } } ``` 这个例子代码假设您已经完成了SPI接口的初始化,并且已经有一种方法可以将数据写入ADF4356的SPI接口。在代码中,`ADF4356_Write`函数用于将数据写入ADF4356的寄存器中,`ADF4356_Init`函数计算了分频器值及其他寄存器的值,并将其写入ADF4356的寄存器中。此外,该代码设置了参考时钟分频器以确保参考时钟的正确频率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值