📄 driver9954.c
字号:
#include "includes.h"
//sbit OSK=
//sbit IOSYNC=
void delay(uint i)
{
while(i--);
}
void AD9954_RESET(void)
{
RESET=0;
RESET=1;
delay(100);
RESET=0;
CS=0;
SCLK=1;
}
void AD9954_SENDBYTE(uchar dat)//发送一个字节的内容
{
uchar i=8;
while(i--)
{
SCLK=0;
if(dat&0x80)
{
SDIO=1;
}
else
{
SDIO=0;
}
SCLK=1;
dat<<= 1;
}
}
void UPDATE(void)
{
IOUPDATE=0;
IOUPDATE=1;
delay(10);
IOUPDATE=0;
}
void AD9954_Initial(void)
{
//single tone
AD9954_SENDBYTE(0x00);//地址0写操作
AD9954_SENDBYTE(0x00);//
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x40);
//linear sweep mode
/*AD9954_SENDBYTE(0x00);//地址0写操作
AD9954_SENDBYTE(0x00);//
AD9954_SENDBYTE(0x20);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x40);*/
//
AD9954_SENDBYTE(0x01);//地址1写操作
AD9954_SENDBYTE(0x00);//
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x44);//8倍频,打开VCO控制高位,系统时钟倍频后为400M
}
void AD9954_SETFRE(float f)//single tone
{
union
{
unsigned long int det1;
struct{uchar dhh;uchar dhl;uchar dlh;uchar dll; }det2;
}dat;
dat.det1=10.7374*f;//det=(f/fclk)x2^32=10.7374xf
AD9954_SENDBYTE(0x04);//FTW0地址
AD9954_SENDBYTE(dat.det2.dhh);//频率控制字
AD9954_SENDBYTE(dat.det2.dhl);
AD9954_SENDBYTE(dat.det2.dlh);
AD9954_SENDBYTE(dat.det2.dll);
UPDATE();
}
void LINEARSWEEP(float f1,float f2)//linear sweep mode
{
union
{
unsigned long int det1;
struct{uchar dhh;uchar dhl;uchar dlh;uchar dll; }det2;
}dat;
dat.det1=10.7374*f1;
AD9954_SENDBYTE(0x04);//FTW0地址
AD9954_SENDBYTE(dat.det2.dhh);//频率控制字
AD9954_SENDBYTE(dat.det2.dhl);
AD9954_SENDBYTE(dat.det2.dlh);
AD9954_SENDBYTE(dat.det2.dll);
dat.det1=10.7374*f2;
AD9954_SENDBYTE(0x06);//FTW1地址
AD9954_SENDBYTE(dat.det2.dhh);//频率控制字
AD9954_SENDBYTE(dat.det2.dhl);
AD9954_SENDBYTE(dat.det2.dlh);
AD9954_SENDBYTE(dat.det2.dll);
AD9954_SENDBYTE(0x07);//NLSCW
AD9954_SENDBYTE(0x01);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x1b);
AD9954_SENDBYTE(0xf4);
AD9954_SENDBYTE(0x08);//RLSCW
AD9954_SENDBYTE(0x01);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x01);
AD9954_SENDBYTE(0xa3);
AD9954_SENDBYTE(0x6f);
UPDATE();
}
//实现4相的FSK
void DirectSwitchFSK(float f1,float f2,float f3,float f4)
{
union
{
unsigned long int det1;
struct{uchar dhh;uchar dhl;uchar dlh;uchar dll; }det2;
}dat;
AD9954_SENDBYTE(0x00);//地址0写操作
AD9954_SENDBYTE(0x00);//打开RAM控制位驱动FTW
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x40);
//
AD9954_SENDBYTE(0x01);//地址1写操作
AD9954_SENDBYTE(0x00);//
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x44);//8倍频,打开VCO控制高位,系统时钟倍频后为400M
PS0=0;
PS1=0;
AD9954_SENDBYTE(0x07);
AD9954_SENDBYTE(0x01);//ramp rate=0x0010
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);//final address:0x000
AD9954_SENDBYTE(0x00);//start address:0x000;
AD9954_SENDBYTE(0x00);//RAM0工作于模式0,不停留位没有激活
UPDATE();
dat.det1=10.7374*f1;
AD9954_SENDBYTE(0x0b);
AD9954_SENDBYTE(dat.det2.dhh);//频率控制字
AD9954_SENDBYTE(dat.det2.dhl);
AD9954_SENDBYTE(dat.det2.dlh);
AD9954_SENDBYTE(dat.det2.dll);
PS0=1;//ram1
PS1=0;
AD9954_SENDBYTE(0x08);
AD9954_SENDBYTE(0x01);//ramp rate=0x0010
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x01);//final address:0x0001
AD9954_SENDBYTE(0x04);//start address:0x0001
AD9954_SENDBYTE(0x00);//RAM1工作于模式0,不停留位没有激活
UPDATE();
dat.det1=10.7374*f2;
AD9954_SENDBYTE(0x0b);
AD9954_SENDBYTE(dat.det2.dhh);//频率控制字
AD9954_SENDBYTE(dat.det2.dhl);
AD9954_SENDBYTE(dat.det2.dlh);
AD9954_SENDBYTE(dat.det2.dll);
PS0=0;//ram2
PS1=1;
AD9954_SENDBYTE(0x09);
AD9954_SENDBYTE(0x01);//ramp rate=0x0010
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x02);//final address:0x0002
AD9954_SENDBYTE(0x08);//start address:0x0002
AD9954_SENDBYTE(0x00);
UPDATE();
dat.det1=10.7374*f3;
AD9954_SENDBYTE(0x0b);
AD9954_SENDBYTE(dat.det2.dhh);//频率控制字
AD9954_SENDBYTE(dat.det2.dhl);
AD9954_SENDBYTE(dat.det2.dlh);
AD9954_SENDBYTE(dat.det2.dll);
PS0=1;//ram3
PS1=1;
AD9954_SENDBYTE(0x0a);
AD9954_SENDBYTE(0x01);//ramp rate=0x0010
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x03);//final address:0x0003
AD9954_SENDBYTE(0x0c);//start address:0x0003
AD9954_SENDBYTE(0x00);
UPDATE();
dat.det1=10.7374*f4;
AD9954_SENDBYTE(0x0b);
AD9954_SENDBYTE(dat.det2.dhh);//频率控制字
AD9954_SENDBYTE(dat.det2.dhl);
AD9954_SENDBYTE(dat.det2.dlh);
AD9954_SENDBYTE(dat.det2.dll);
AD9954_SENDBYTE(0x00);//地址0写操作
AD9954_SENDBYTE(0x80);//打开RAM控制位驱动FTW
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x40);
UPDATE();
}
void DirectSwitchPSK(float f,float phase1,float phase2,float phase3,float phase4)
{
union
{
unsigned int det1;
struct{uchar dh;uchar dl; }det2;
}dat;
AD9954_SENDBYTE(0x00);//地址0写操作
AD9954_SENDBYTE(0x00);//打开RAM控制位驱动FTW
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x40);
//
AD9954_SENDBYTE(0x01);//地址1写操作
AD9954_SENDBYTE(0x00);//
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x44);//8倍频,打开VCO控制高位,系统时钟倍频后为400M
AD9954_SETFRE(f);//载波频率
PS0=0;
PS1=0;
AD9954_SENDBYTE(0x07);
AD9954_SENDBYTE(0x01);//ramp rate=0x0010
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);//final address:0x000
AD9954_SENDBYTE(0x00);//start address:0x000;
AD9954_SENDBYTE(0x00);//RAM0工作于模式0,不停留位没有激活
UPDATE();
dat.det1=45.51*phase1;
dat.det1=dat.det1<<2;
AD9954_SENDBYTE(0x0b);
AD9954_SENDBYTE(dat.det2.dh);//频率控制字
AD9954_SENDBYTE(dat.det2.dl);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
PS0=1;//ram1
PS1=0;
AD9954_SENDBYTE(0x08);
AD9954_SENDBYTE(0x01);//ramp rate=0x0010
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x01);//final address:0x0001
AD9954_SENDBYTE(0x04);//start address:0x0001
AD9954_SENDBYTE(0x00);//RAM1工作于模式0,不停留位没有激活
UPDATE();
dat.det1=45.51*phase2;
dat.det1=dat.det1<<2;
AD9954_SENDBYTE(0x0b);
AD9954_SENDBYTE(dat.det2.dh);//频率控制字
AD9954_SENDBYTE(dat.det2.dl);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
PS0=0;//ram2
PS1=1;
AD9954_SENDBYTE(0x09);
AD9954_SENDBYTE(0x01);//ramp rate=0x0010
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x02);//final address:0x0002
AD9954_SENDBYTE(0x08);//start address:0x0002
AD9954_SENDBYTE(0x00);
UPDATE();
dat.det1=45.51*phase3;
dat.det1=dat.det1<<2;
AD9954_SENDBYTE(0x0b);
AD9954_SENDBYTE(dat.det2.dh);//频率控制字
AD9954_SENDBYTE(dat.det2.dl);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
PS0=1;//ram3
PS1=1;
AD9954_SENDBYTE(0x0a);
AD9954_SENDBYTE(0x01);//ramp rate=0x0010
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x03);//final address:0x0003
AD9954_SENDBYTE(0x0c);//start address:0x0003
AD9954_SENDBYTE(0x00);
UPDATE();
dat.det1=45.51*phase4;
dat.det1=dat.det1<<2;
AD9954_SENDBYTE(0x0b);
AD9954_SENDBYTE(dat.det2.dh);//频率控制字
AD9954_SENDBYTE(dat.det2.dl);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);//地址0写操作
AD9954_SENDBYTE(0xc0);//打开RAM控制位驱动FTW
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x40);
UPDATE();
}
void ManualAM(uchar amp)
{
AD9954_SENDBYTE(0x00);//地址0写操作
AD9954_SENDBYTE(0x02);//手动打开OSK打开
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x40);
AD9954_SENDBYTE(0x02);//幅度
if(amp==0)
{
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
}
else
{
AD9954_SENDBYTE(0xff);
AD9954_SENDBYTE(0xff);
}
UPDATE();
}
void ContinuousRecirculation(void)
{
union
{
unsigned long int det1;
struct{uchar dhh;uchar dhl;uchar dlh;uchar dll; }det2;
}dat;
uchar i;
float f;
AD9954_SENDBYTE(0x00);//地址0写操作
AD9954_SENDBYTE(0x00);//打开RAM控制位驱动FTW
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x40);
//
AD9954_SENDBYTE(0x01);//地址1写操作
AD9954_SENDBYTE(0x00);//
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x44);//8倍频,打开VCO控制高位,系统时钟倍频后为400M
PS0=0;
PS1=0;
AD9954_SENDBYTE(0x07);
AD9954_SENDBYTE(0x00);//ramp rate=0x0001
AD9954_SENDBYTE(0x10);
AD9954_SENDBYTE(0x31);//final address:0x031
AD9954_SENDBYTE(0x00);//start address:0x000;
AD9954_SENDBYTE(0x80);//RAM0工作于模式4,不停留位没有激活
UPDATE();
f=100000;
AD9954_SENDBYTE(0x0b);
for(i=0;i<50;i++)
{
dat.det1=10.7374*f;
AD9954_SENDBYTE(dat.det2.dhh);//频率控制字
AD9954_SENDBYTE(dat.det2.dhl);
AD9954_SENDBYTE(dat.det2.dlh);
AD9954_SENDBYTE(dat.det2.dll);
// UPDATE();
f=f+1000;
}
PS0=1;
PS1=0;
AD9954_SENDBYTE(0x08);
AD9954_SENDBYTE(0x00);//ramp rate=0x0001
AD9954_SENDBYTE(0x10);
AD9954_SENDBYTE(0x63);//final address:0x063
AD9954_SENDBYTE(0xc8);//start address:0x032;
AD9954_SENDBYTE(0x80);//RAM0工作于模式4,不停留位没有激活
UPDATE();
f=2000;
AD9954_SENDBYTE(0x0b) ;
for(i=0;i<50;i++)
{
dat.det1=10.7374*f;
AD9954_SENDBYTE(dat.det2.dhh);//频率控制字
AD9954_SENDBYTE(dat.det2.dhl);
AD9954_SENDBYTE(dat.det2.dlh);
AD9954_SENDBYTE(dat.det2.dll);
// UPDATE();
f=f+100;
}
UPDATE();
AD9954_SENDBYTE(0x00);//地址0写操作
AD9954_SENDBYTE(0x80);//打开RAM控制位驱动FTW
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x40);
UPDATE();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -