snifer

[原创]AD9516-3编程应用案例

0
阅读(5434)

AD9516-3*采用64引脚,LFCSP封装提供多路输出时钟分配功能,价格比较昂贵,达到了190美金。具有亚皮秒级抖动性能,并且片内集成锁相环(PLL)和电压控制振荡器(VCO)。片内VCO的调谐频率范围为1.75 GHz至2.25 GHz。也可以使用最高2.4 GHz的外部VCO/VCXO。

AD9516-3具有出色的低抖动和相位噪声特性,可极大地提升数据转换器的性能,并且也有利于其它相位噪声和抖动要求严苛的应用。

AD9516-3提供6路LVPECL输出(分为三对)、4路LVDS输出(分为两对)和8路CMOS输出(每路LVDS输出对应两路)。LVPECL输出的工作频率达1.6 GHz,LVDS输出的工作频率达800 MHz,CMOS输出的工作频率达250 MHz。(引用自官网)

结构图如下:

既然是老板出钱,咱也不省着,呵呵,主要写一下这个模块的编程,主要实现使用ADUC7026通过GPIO来控制AD9516在软件SPI的形式。

程序如下:

#include<ADuC7026.h>
#include"ADuC7026Driver.h"
#include"AD9516.h"

/********************************************************************************
利用AD9516通过SPI端口实现写的功能
********************************************************************************/
void WriteInstruction(unsigned short RegisterData)
{
 unsigned char i;
 
 //Write out the ControlWord
 for(i=0; i<16; i++)
 { 
  ADuC7026_OutputBit(AD9516_SCLK,0);
  
  if(0x8000 == (RegisterData & 0x8000))
  {
   ADuC7026_OutputBit(AD9516_SDIN,1);   //SDIN引脚发送1

  }
  else
  {
   ADuC7026_OutputBit(AD9516_SDIN,0);   //SDIN引脚发送0
  }
  
  ADuC7026_OutputBit(AD9516_SCLK,1);
  
  RegisterData <<= 1; //Rotate data
 }
}
/********************************************************************************
利用AD9516通过SPI端口读的功能
********************************************************************************/
void ReadData(unsigned char  *pRegisterData, unsigned char N)
{
 unsigned char i= 0,j=0;
 unsigned char iTemp = 0;
 // SPI start
 for(j=0;j<N;j++)
 {
  for(i=0; i<8; i++)
  {
   ADuC7026_OutputBit(AD9516_SCLK,1);
   
   ADuC7026_OutputBit(AD9516_SCLK,0);
   
   iTemp<<=1;
   iTemp |= ADuC7026_InputBit(AD9516_SDOUT);   
  }
  pRegisterData[j] = iTemp;
  iTemp = 0;
 }
}
//写方式,调用 Ad9516.h
void WriteReg(unsigned short RegAddr, unsigned char *pData, unsigned short WrMode, unsigned char num)
{
 unsigned short tmp = 0;
 
 ADuC7026_OutputBit(AD9516_CS,0); 
 tmp = RegAddr | WrMode | WRITE;
 WriteInstruction(tmp);
 WriteData(pData,num);
 ADuC7026_OutputBit(AD9516_CS,1);
 Delay(10); 
}
// 读方式,调用Ad9516.h
void ReadReg(unsigned short RegAddr, unsigned char *pData, unsigned short RdMode, unsigned char num)
{
 unsigned short tmp = 0;
 
 ADuC7026_OutputBit(AD9516_CS,0); //clear CS and begin to write address and and read the addressed register
 Delay(1);
 tmp = READ | RdMode | RegAddr;
 WriteInstruction(tmp);
 ReadData(pData,num);
 ADuC7026_OutputBit(AD9516_CS,1); 
 Delay(10);
}
//需要更新后写寄存器效果
void UpdateRegister(void)
{
 unsigned short tmp1;
 unsigned char tmp2;
 
 ADuC7026_OutputBit(AD9516_CS,1);
 ADuC7026_OutputBit(AD9516_CS,0);// 清CS,开始写指令和数据
 Delay(1);
 tmp1 = WRITE | ONE_BYTE |0x232;
 WriteInstruction(tmp1);
 
 tmp2 = 0x01;
 WriteData(&tmp2,1);
}
 
查了很多资料,最后测试了时钟性能,整体指标达到设计要求,终于完成了,请大家拍砖!!!