资源描述
前段时间非常忙,AD9854这个芯片真是整的我头好疼,虽然在网上也查了大量的资料,不过关于AD9854使用的资料真是少之又少,无奈,只好自己去研究DATASHEET,好在终于实现了,并且通过调试,输出波形稳定!现在把我的设计法出来供大家使用参考。原理图和PCB图为AD9854外围电路!
以下是AD9854的控制程序!
//#include <reg51f.h>
#include "sst89x5xxrd2.h"
#include <intrins.h>
#define USE_KEY 0
#define uchar unsigned char
#define uint unsigned int
#define schar signed char
#define sint signed int
#define ulong unsigned long int
//须主程序定义的参数
/
sbit ADDR0 =P2^0; //
sbit ADDR1 =P2^1; //
sbit ADDR2 =P2^2; //
sbit ADDR3 =P2^3; //
sbit ADDR4 =P2^4; //
sbit ADDR5 =P2^5; //
/
sbit AD_FUD =P3^7; //UP_DATA
sbit RUN =P3^2;
sbit WR_LOW =P3^5; // WR
sbit MASTER_RESET=P3^3;
bit bdata F_Flag,OneSec_Flag,Re_Flag,P_Flag;
//
uchar SecOne;
uchar Time_count;
uchar AD_Addr;
uchar dats;
uchar TAB_Data[40];
//
//初始化串口。配置定时器
// void
initial_system()
{
EA = 0;
TMOD=0x21; //初始化定时器0
PCON=0x00;
SCON=0x50;
TH0 = 0xdc; //10毫秒定时, 采用晶体11.0592 定时器0,方式1
TL0 = 0x00;
TH1 = 0xfd; //波特率9600 采用晶体11.0592 定时器1,方式1
TL1 = 0xfd;
TR0 =1; //开启定时器0
TR1 =1; //开启定时器0
ET0 =1; //时钟0
ES =0; //开串口中断
EA = 1 ; // 使能所有中断
}
void Timer0() interrupt 1 using 3
{
TH0 = 0xdc; //10毫秒 采用晶体11.0592 定时器0,方式1
TL0 = 0x00;
SecOne++;
if(SecOne>200) //计时1秒钟
{
SecOne=0x00;
OneSec_Flag=1;
RUN=~RUN;
}
}
//
void AD9854_delay(int time)
{
int i;
for(i = 0; i < time; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
void TAB_DataWord()
{
TAB_Data[0]=0x00; //00H Phase Adjust Register #1 <13:8> (Bits 15, 14 don't care)
Phase #1 相位为0
TAB_Data[1]=0x00; //01H Phase Adjust Register #1 <7:0> 01H
TAB_Data[2]=0x00; //02H Phase Adjust Register #2 <13:8> (Bits 15, 14 don't care)
Phase #2 相位为0
TAB_Data[3]=0x00; //03H Phase Adjust Register #1 <7:0> 03H
//100M
TAB_Data[4]=0X31; //Frequency Tuning Word 1 <47:40>//623795E0184A
TAB_Data[5]=0X1B; //Frequency Tuning Word 1 <39:32>
TAB_Data[6]=0xE6; //Frequency Tuning Word 1 <31:24>
TAB_Data[7]=0xE6; //Frequency Tuning Word 1 <23:16>
TAB_Data[8]=0x53; //Frequency Tuning Word 1 <15:8>
TAB_Data[9]=0x86; //Frequency Tuning Word 1 <7:0>
//FTW2
TAB_Data[10]=0x31; //Frequency Tuning Word 2 <47:40
TAB_Data[11]=0x1B; //Frequency Tuning Word 2 <39:32>
TAB_Data[12]=0xE6; //Frequency Tuning Word 2 <31:24>
TAB_Data[13]=0xE6; //Frequency Tuning Word 2 <23:16>
TAB_Data[14]=0x53; //Frequency Tuning Word 2 <15:8>
TAB_Data[15]=0x86; //Frequency Tuning Word 2 <7:0> //500KHZ
//FTW
TAB_Data[16]=0x01; //Delta Frequency Word <47:40>
TAB_Data[17]=0x47; //Delta Frequency Word <39:32>
TAB_Data[18]=0xAE; //Delta Frequency Word <31:24>
TAB_Data[19]=0x14; //Delta Frequency Word <23:16>
TAB_Data[20]=0x7A; //Delta Frequency Word <15:8>
TAB_Data[21]=0xE1; //Delta Frequency Word <7:0> 三角波 //频率为0
//Upclok
TAB_Data[22]=0x00; //Update Clock <31:24>
TAB_Data[23]=0x00; //Update Clock <23:16>
TAB_Data[24]=0x00; //Update Clock <15:8>
TAB_Data[25]=0xF0; //Update Clock <7:0> //系统出现寄存器更新信号reg. Int Update
Clk.=0;外部更新
TAB_Data[26]=0x00; //Ramp Rate Clock <19:16> (Bits 23, 22, 21, 20 don't care)
TAB_Data[27]=0x00; //Ramp Rate Clock <15:8>
TAB_Data[28]=0x00; //Ramp Rate Clock <7:0>
TAB_Data[29]=0x10; //Don't Care(0),Don't Care(0),Don't Care(0),Comp PD
(1),Reserved_Always Low(0),QDAC PD(0),DAC PD(0),DIG PD(0).
TAB_Data[30]=0x20; //Don't Care(0),PLL Range(1),Bypass PLL(1),Ref Mult 4(0),Ref
Mult 3(0),Ref Mult 2(0),Ref Mult 1(0),Ref Mult 0(0).
TAB_Data[31]=0x10; //CLR ACC1(0),CLR ACC2(0),Triangle(0)(三角波),SRC QDAC(0),Mode
2(0),Mode 1(0),Mode 0(0),Int Update Clk(0). 注意
TAB_Data[32]=0x50; //Don't Care(0),Bypass_Inv_Sinc(0),OSK EN(0),OSK INT(0),Don't
Care(0),Don't Care(0),LSB First(0),SDO_Active(0).
TAB_Data[33]=0x00; //Output Shape Key I Mult <11:8> (Bits 15, 14, 13, 12 don't
care)
TAB_Data[34]=0x0F; //Output Shape Key I Mult <7:0>
TAB_Data[35]=0x00; //Output Shape Key Q Mult <11:8> (Bits 15, 14, 13, 12 don't
care)
TAB_Data[36]=0x0F; //Output Shape Key Q Mult <7:0>
TAB_Data[37]=0xFF; //Output Shape Key Ramp Rate <7:0>
TAB_Data[38]=0x00; //QDAC <11:8> (Bits 15, 14, 13, 12 don't care)
TAB_Data[39]=0x0F; //QDAC <7:0> (Data is required to be in twos complement format)
}
void AD9854_ParallelSendByte(uchar addr,uchar data1)
{
// WR_LOW=0; //lhyaddr WR_LOW=WRB
_nop_();
P2=addr&0x3F;
_nop_();
P1=data1;
WR_LOW=0; //lhyaddr WR_LOW=WRB
_nop_();
WR_LOW=1;
_nop_();
_nop_();
WR_LOW=0; //lhyaddr WR_LOW=WRB
}
data0=*(SWord+i);
AD9854_ParallelSendByte(Special_addr,data0);
AD9854_delay(5);
}
}
void Init9854(void)
{
WR_LOW=0;
AD_FUD=0;
MASTER_RESET=0;
}
//
void main(void)
{ uchar i;
MASTER_RESET=0;
initial_system(); //系统初始化
Init9854();
TAB_DataWord();
MASTER_RESET=0;
_nop_();
_nop_();
_nop_();
_nop_();
MASTER_RESET=1;
AD9854_delay(30);
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
MASTER_RESET=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
AD9854_delay(500);
AD9854_delay(500);
AD9854_delay(500);
for (i=0;i<40;i++)
{
dats=TAB_Data[i];
AD_Addr=i;
AD9854_ParallelSendByte(AD_Addr,dats);
}
_nop_();
AD_FUD=0;
_nop_();
_nop_();
_nop_();
AD_FUD=1;
AD9854_delay(80);
_nop_();
_nop_();
AD_FUD=0;
while(1)
{
if(OneSec_Flag==1)
{
_nop_();
_nop_();
_nop_();
AD9854_delay(80);
_nop_();
_nop_();
_nop_();
AD9854_delay(80);
_nop_();
for (i=0;i<40;i++)
{
dats=TAB_Data[i];
AD_Addr=i;
AD9854_ParallelSendByte(AD_Addr,dats);
}
_nop_();
AD_FUD=0;
_nop_();
_nop_();
AD9854_delay(80);
AD_FUD=1;
_nop_();
AD9854_delay(80);
_nop_();
_nop_();
AD_FUD=0;
OneSec_Flag=0;
}
_nop_();
_nop_();
}
}
展开阅读全文