[原创]AD9516-3编程应用案例
0赞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;
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;
}
}
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);
}
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);
}