⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 driver9954.c

📁 DDS AD9954基于单片机的驱动程序。。。希望对大家有用
💻 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 + -