枭龙战机

ADF4350的程序设计

0
阅读(2538)

 /*****************************************************************
*文件名:VCO4350.C
*功能:实现4350的频率系数的分配,以及完成送数过程
*说明:无
******************************************************************/
#include "config.h"
#define REF1             10000        //10MHz
struct TData1
    {
      uint32 RE[6];
   
    }TD1;
   
/******************************************************************
*函数:Turn_Feq_4350_P
*功能:完成4350的频率分配,正向锁定
*说明:Feq:待锁定的频率,step:步长,prescale:预分频系数
*******************************************************************/
void Turn_Feq_4350_P(uint32 Feq,uint16 Step,uint8 prescaler)
{
uint8  prescaler_S;

if(prescaler==4) prescaler_S=0;
if(prescaler==8) prescaler_S=1;

TD1.RE[5]=(0x01<<22)            //DIGITAL LOCK DETECT
           |(0x03<<19)
           |0x05;

TD1.RE[4]=(0x01<<23)
           |((REF1/Step*2)<<12)   //BAND SELECT CLOCK DIVIDER
           |(0x01<<5)             //RF OUTPUT ENABLE
           |(0x03<<3)             //OUTPUT POWER +5
           |0x04;

TD1.RE[3]=(0x00<<18)
           |(150<<3)              //FAST LOCK 150
           |0x03;
          
TD1.RE[2]=(0x00<<29)             //LOW NOISE
           |(0x06<<26)            //DIGITAL LOCK DETECT
           |(0x01<<14)            //R DIV
           |(0x07<<9)             //CHARGE PUMP  2.5mA
           |(0x01<<7)             //LDP
           |(0x01<<6)             //POSITIVE
           |0x02;

TD1.RE[1]=(prescaler_S<<27)       //PRESCALER 8/9 | 4/5
           |(0x01<<15)             //PHASE
           |(((REF1/Step))<<3)     //MOD
           |0x01;
             
TD1.RE[0]=((Feq/REF1)<<15)        //INT
           |(((Feq%REF1)/Step)<<3) //FRAC
           |0x00;
}
/***********************************************************************
*函数:OutputADF4350
*功能:完成送数的过程
*说明:无
************************************************************************/
void OutputADF4350(uint8 indexPll)
{
  uint8  i=0,j=0;
  uint32 AndRef=0x80000000;
  //---------------setup  Bits----------------
 
  for(i=0;i<6;i++)
    {
      if(indexPll==pll_one)   PULL_DOWN(LE1,0);
      if(indexPll==pll_two)   PULL_DOWN(LE2,0);
      if(indexPll==pll_three) PULL_DOWN(LE3,0);
      if(indexPll==pll_four)  PULL_DOWN(LE4,0);
      DelayNS(1);
     
      AndRef=0x80000000;
      for(j=0;j<32;j++)
        {
          if((TD1.RE[5-i])&AndRef) PULL_UP(SPI_DATA,0);
         else  PULL_DOWN(SPI_DATA,0);
         AndRef=AndRef>>1;
         PULL_UP(SPI_CLK,1);
         DelayNS(1);
         PULL_DOWN(SPI_CLK,1);
         DelayNS(1);
        }
      DelayNS(1);
      if(indexPll==pll_one)   PULL_UP(LE1,0);
      if(indexPll==pll_two)   PULL_UP(LE2,0);
      if(indexPll==pll_three) PULL_UP(LE3,0);
      if(indexPll==pll_four)  PULL_UP(LE4,0);
      DelayNS(1);
          }
}