📄 ad9954.c
字号:
#include <reg51.h>
#include "AD9954.h"
unsigned long CFR1 = 0;
unsigned long CFR1SLAVE = 0x00800000;
unsigned long CFR2 = 0x00000024;
unsigned long ASF;
unsigned long ARR;
unsigned long FTW0;
unsigned long POW0;
unsigned long FTW1;
unsigned long NLSCW;
unsigned long PLSCW;
unsigned long multfreq = 0xffffffff; //计算频率控制字的系数
/***********************************************************************
** 函数名称: 端口操作
** 功能描述: AD9954端口基本操作
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
***********************************************************************/
void SCLK_0(void)
{
SCLK = 0;
}
void SCLK_1(void)
{
SCLK = 2;
}
void SDIO_0(void)
{
SDIO = 0;
}
void SDIO_1(void)
{
SDIO = 1;
}
void CS_Enable(void)
{
CS = 0;
}
void CS_Disable(void)
{
CS = 1;
}
void CS2_Enable(void)
{
CS2 = 0;
}
void CS2_Disable(void)
{
CS2 = 1;
}
void IO_UPDATE_0(void)
{
IO_UPDATE = 0;
}
void IO_UPDATE_1(void)
{
IO_UPDATE = 1;
}
void IO_SYNC_1(void)
{
IO_SYNC = 1;
}
void IO_SYNC_0(void)
{
IO_SYNC = 0;
}
void PS0_Set_High(void)
{
PS0 = 1;
}
void PS0_Set_Low(void)
{
PS0 = 0;
}
void PS1_Set_High(void)
{
PS1 = 1;
}
void PS1_Set_Low(void)
{
PS1 = 0;
}
/***********************************************************************
** 函数名称: IO9954_Init
** 功能描述: IO_Init
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
***********************************************************************/
void IO9954_Init()
{
CS2 = 0;
P0 = 0x00;
}
/***********************************************************************
** 函数名称: nNop
** 功能描述: US级软件延时(不精确)
** 输 入: 延时参数,值越大时延时越久
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
***********************************************************************/
void nNop(unsigned long nValue)
{
unsigned long i;
for(i=nValue;i>0;i--);
}
/***********************************************************************
** 函数名称: WriteByte
** 功能描述: 向AD9954发送一字节数据 MSB FIRST
** 输 入: unsigned char data 发送的数据
** 输 出: 无
** 全局变量: 无
** 调用模块: 端口操作 nNop
***********************************************************************/
void WriteByte(unsigned char Data)
{
unsigned char k;
for(k=0;k<8;k++)
{
SCLK_0();
nNop(4);
if((Data&0x80) == 0x80)
SDIO_1();
else
SDIO_0();
Data = Data << 1;
nNop(2);
SCLK_1();
nNop(4);
}
}
/***********************************************************************
** 函数名称: ReadByte
** 功能描述: 从AD9954读取一字节数据 MSB FIRST
** 输 入: 无
** 输 出: unsigned char 读回的数据
** 全局变量: 无
** 调用模块: 端口操作
***********************************************************************/
unsigned char ReadByte(void)
{
unsigned char Data=0;
unsigned char k;
SDIO = 0;
for(k=0;k<8;k++)
{
SCLK_0();
nNop(1);
nNop(1);
SCLK_1();
nNop(1);
nNop(1);
Data = Data << 1;
if(SDIO)
{
Data |= 0x01;
}
}
SDIO = 1;
return Data;
}
/***********************************************************************
** 函数名称: RW_Reg
** 功能描述: AD9954读写寄存器操作
** 输 入: unsigned char addr 寄存器地址
** unsigned char *buf 写寄存器: 指向发送数据的指针
** 读寄存器: 指向读回数据的指针
** unsigned char num 发送或读回的数据长度 num Byte
** unsigned char rw 读写选择 1 读 0 写
** 输 出: 无
** 全局变量: 无
** 调用模块: ReadByte WriteByte
***********************************************************************/
void RW_Reg(unsigned char addr,unsigned char *buf,unsigned char num,
unsigned char rw)
{
unsigned char ins;// instruction byte
if(rw == 1)
{
ins = addr | 0x80;
WriteByte(ins);
do{
buf[num-1] = ReadByte();
num--;
nNop(5);
}
while(num);
}
else
{
ins = addr;
WriteByte(ins);
do{
WriteByte(buf[num-1]);
num--;
nNop(5);
}
while(num);
}
}
/***********************************************************************
** 函数名称: AD9954_Write_Reg
** 功能描述: AD9954写寄存器操作
** 输 入: unsigned long command 写入寄存器的指令
** unsigned char num 发送或读回的数据长度 num Byte
** unsigned char addr 寄存器地址
** 输 出: 无
** 全局变量: 无
** 调用模块: RW_Reg
***********************************************************************/
void AD9954_Write_Reg(unsigned long command,unsigned char num,unsigned char addr)
{
unsigned char temp_com[5] = {0,0,0,0,0};
unsigned char i;
unsigned long temp;
temp = command;
for(i = 0;i < num;i++)
{
temp_com[i] = (temp & 0xff);
temp = temp >> 8;
}
RW_Reg(addr,temp_com,num,0);
}
/***********************************************************************
** 函数名称: FTW_Float
** 功能描述: 将浮点型频率值MHZ 转换成频率控制字
** 输 入: float freqfloat 浮点型频率值MHZ
** 输 出: unsigned long 4 byte 频率控制字
** 全局变量: 无
** 调用模块: 无
***********************************************************************/
unsigned long FTW_Float(float freqfloat)
{
unsigned long temp = 0;
float freqf = 0;
freqf = freqfloat / 400; //AD9954主频400MHZ
temp = (freqf * multfreq);
return(temp);
}
/***********************************************************************
** 函数名称: 更新寄存器操作
** 功能描述: 每次更新寄存器的固定操作
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
***********************************************************************/
void AD9954_Updata_First(void)
{
IO9954_Init();
CS_Enable();
IO_SYNC_1();
nNop(40);
IO_SYNC_0();
IO_UPDATE_0();
}
void AD9954_Updata_Final(void)
{
CS_Disable();
nNop(20);
IO_UPDATE_1();
}
/*****************************************************************************
* Single-Tone Mode
******************************************************************************/
/***********************************************************************
** 函数名称: AD9954_SingleTone_Init
** 功能描述: AD9954 Single-Tone Mode 初始化
** 输 入: 无
** 输 出: 无
** 全局变量: CFR1 CFR2 AD9954 功能控制寄存器
** 调用模块: AD9954_Write_Reg
***********************************************************************/
void AD9954_SingleTone_Init(void)
{
CFR1 = 0x00000000;
AD9954_Updata_First();
AD9954_Write_Reg(CFR2,3,0x01); //控制寄存器2
AD9954_Write_Reg(CFR1,4,0x00); //控制寄存器1
AD9954_Updata_Final();
}
/***********************************************************************
** 函数名称: AD9954_SingleTone_Freq
** 功能描述: 更新频率控制
** 输 入: 无
** 输 出: 无
** 全局变量: FTW0
** 调用模块: AD9954_Write_Reg 更新寄存器操作
***********************************************************************/
void AD9954_SingleTone_Freq(float freq)
{
FTW0 = FTW_Float(freq);
AD9954_Updata_First();
AD9954_Write_Reg(FTW0,4,0x04); //设置全局输出频率
AD9954_Updata_Final();
}
/***********************************************************************
** 函数名称: AD9954_Amplitude_Change
** 功能描述: 手动改变输出幅度
** 输 入: 无
** 输 出: 无
** 全局变量: ASF
** 调用模块: AD9954_Write_Reg 更新寄存器操作
***********************************************************************/
void AD9954_Amplitude_Change(void)
{
CFR1 |= OSKEN;
CFR1 &= ~AOSK;
AD9954_Updata_First();
AD9954_Write_Reg(CFR1,4,0x00);
AD9954_Write_Reg(ASF,2,0x02);
AD9954_Updata_Final();
}
/***********************************************************************
** 函数名称: AD9954_Phase_Change
** 功能描述: 改变输出相角 0<=phase<=360
** 输 入: double phase 浮点型相角值
** 输 出: 无
** 全局变量: POW0
** 调用模块: AD9954_Write_Reg 更新寄存器操作
***********************************************************************/
void AD9954_Phase_Change(double phase) // 0<=phase<=360
{
POW0=(unsigned int)(phase*45.511111111);
AD9954_Updata_First();
AD9954_Write_Reg(POW0,2,0x05);
AD9954_Updata_Final();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -