snifer

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

0
阅读(4362)

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
#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{
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);
}
查了很多资料,最后测试了时钟性能,整体指标达到设计要求,终于完成了,请大家拍砖!!!
Baidu
map