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

📄 ad9954.c

📁 单片机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;//ram0
PS1=0;
 AD9954_SENDBYTE(0x07);
 AD9954_SENDBYTE(0x01);//ramp rate=0x0010
 AD9954_SENDBYTE(0x00);
 AD9954_SENDBYTE(0x01);//final address:0x001
 AD9954_SENDBYTE(0x00);//start address:0x000;
 AD9954_SENDBYTE(0x00);//RAM0工作于模式0,不停留位没有激活
 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);*/
 AD9954_SENDBYTE(0x00);//相位控制字
 AD9954_SENDBYTE(0x00);
 AD9954_SENDBYTE(0x00);
 AD9954_SENDBYTE(0x00);

 UPDATE();
 PS0=0;//ram1
 PS1=1;
 AD9954_SENDBYTE(0x08);
 AD9954_SENDBYTE(0x01);//ramp rate=0x0010
 AD9954_SENDBYTE(0x00);
 AD9954_SENDBYTE(0x03);//final address:0x0003
 AD9954_SENDBYTE(0x08);//start address:0x0002
 AD9954_SENDBYTE(0x00);//RAM1工作于模式0,不停留位没有激活
 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);*/
 AD9954_SENDBYTE(0x40);//相位控制字
 AD9954_SENDBYTE(0x00);
 AD9954_SENDBYTE(0x00);
 AD9954_SENDBYTE(0x00);
 UPDATE();
 PS0=1;//ram2
 PS1=0;
 AD9954_SENDBYTE(0x09);
 AD9954_SENDBYTE(0x01);//ramp rate=0x0010
 AD9954_SENDBYTE(0x00);
 AD9954_SENDBYTE(0x05);//final address:0x0005
 AD9954_SENDBYTE(0x10);//start address:0x0004
 AD9954_SENDBYTE(0x00);
 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);*/
  AD9954_SENDBYTE(0x80);//相位控制字
 AD9954_SENDBYTE(0x00);
 AD9954_SENDBYTE(0x00);
 AD9954_SENDBYTE(0x00);
   UPDATE();
 PS0=1;//ram3
 PS1=1;
 AD9954_SENDBYTE(0x0a);
 AD9954_SENDBYTE(0x01);//ramp rate=0x0010
 AD9954_SENDBYTE(0x00);
 AD9954_SENDBYTE(0x07);//final address:0x0007
 AD9954_SENDBYTE(0x18);//start address:0x0006
 AD9954_SENDBYTE(0x00);  
 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);//相位控制字
 AD9954_SENDBYTE(0xc0);
 AD9954_SENDBYTE(0x00);
 AD9954_SENDBYTE(0x00);
  UPDATE();
   AD9954_SENDBYTE(0x00);//地址0写操作
 AD9954_SENDBYTE(0xc0);//打开RAM控制位驱动FTW
 AD9954_SENDBYTE(0x00);
 AD9954_SENDBYTE(0x00);
 AD9954_SENDBYTE(0x40);
   UPDATE();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -