?? 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 + -