AD9854驱动程序设计.docx
- 文档编号:13257610
- 上传时间:2023-06-12
- 格式:DOCX
- 页数:27
- 大小:19.54KB
AD9854驱动程序设计.docx
《AD9854驱动程序设计.docx》由会员分享,可在线阅读,更多相关《AD9854驱动程序设计.docx(27页珍藏版)》请在冰点文库上搜索。
AD9854驱动程序设计
//=====================================================================
//AD9854驱动程序设计
//硬件连接:
P0——Data;
//P2——Adr;
//RESET——P3^7;
//UDCLK——P3^6;
//WR——P3.5;
//RD——p3.4;
//FDATA——P3^3;
//OSK——P3^2;
//VDD--逻辑电源(3.3V)
//VSS--GND(0V)
//AD9854.c
//writer:
谷雨2008年8月22日~24日于EDA实验室
//说明:
本程序基于硬件的外接晶振为20MHZ
//=====================================================================
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
#defineulongunsignedlong
ucharFreqWord[6];//6个字节频率控制字
//**********************以下为系统时钟以及其相关变量设置**************************
/*
此处根据自己的需要设置系统时钟以及与其相关的因子,一次需且只需开启一个
CLK_Set为时钟倍频设置,可设置4~20倍倍频,但最大不能超过300MHZ
Freq_mult_ulong和Freq_mult_doulle均为2的48次方除以系统时钟,一个为长整形,一个为双精度型
*/
/*
#defineCLK_Set4
constulongFreq_mult_ulong=3518437;
constdoubleFreq_mult_doulle=3518437.2088832;
*/
/*
#defineCLK_Set5
constulongFreq_mult_ulong=2814750;
constdoubleFreq_mult_doulle=2814749.76710656;
*/
#defineCLK_Set6
constulongFreq_mult_ulong=2345625;
constdoubleFreq_mult_doulle=2345624.80592213;
/*
#defineCLK_Set7
constulongFreq_mult_ulong=2010536;
constdoubleFreq_mult_doulle=2010535.54793326;
*/
/*
#defineCLK_Set8
constulongFreq_mult_ulong=1759219;
constdoubleFreq_mult_doulle=1759218.6044416;
*/
/*
#defineCLK_Set9
constulongFreq_mult_ulong=1563750;
constdoubleFreq_mult_doulle=1563749.87061476;
*/
/*
#defineCLK_Set10
constulongFreq_mult_ulong=1407375;
constdoubleFreq_mult_doulle=1407374.88355328;
*/
/*
#defineCLK_Set11
constulongFreq_mult_ulong=1279432;
constdoubleFreq_mult_doulle=1279431.712321164;
*/
/*
#defineCLK_Set12
constulongFreq_mult_ulong=1172812;
constdoubleFreq_mult_doulle=1172812.402961067;
*/
/*
#defineCLK_Set13
constulongFreq_mult_ulong=1082596;
constdoubleFreq_mult_doulle=1082596.064271754;
*/
/*
#defineCLK_Set14
constulongFreq_mult_ulong=1005268;
constdoubleFreq_mult_doulle=1005267.773966629;
*/
/*
#defineCLK_Set15
constulongFreq_mult_ulong=938250;
constdoubleFreq_mult_doulle=938249.9223688533;
*/
//**************************修改硬件时要修改的部分********************************
#defineAD9854_DataBusP0
#defineAD9854_AdrBusP2
sbitAD9854_RST=P3^7;//AD9854复位端口
sbitAD9854_UDCLK=P3^6;//AD9854更新时钟
sbitAD9854_WR=P3^5;//AD9854写使能,低有效
sbitAD9854_RD=P3^4;//AD9854读使能,低有效
sbitAD9854_FDATA=P3^3;//AD9854FSK,PSK控制
sbitAD9854_OSK=P3^2;//AD9854OSK控制端
//**************************以下部分为函数定义********************************
staticvoidAD9854_WR_Byte(ucharaddr,uchardat);
externvoidAD9854_Init(void);
staticvoidFreq_convert(longFreq);
externvoidAD9854_SetSine(ulongFreq,uintShape);
staticvoidFreq_double_convert(doubleFreq);
externvoidAD9854_SetSine_double(doubleFreq,uintShape);
externvoidAD9854_InitFSK(void);
externvoidAD9854_SetFSK(ulongFreq1,ulongFreq2);
externvoidAD9854_InitBPSK(void);
externvoidAD9854_SetBPSK(uintPhase1,uintPhase2);
externvoidAD9854_InitOSK(void);
externvoidAD9854_SetOSK(ucharRateShape);
externvoidAD9854_InitAM(void);
externvoidAD9854_SetAM(uintShape);
externvoidAD9854_InitRFSK(void);
externvoidAD9854_SetRFSK(ulongFreq_Low,ulongFreq_High,ulongFreq_Up_Down,ulongFreRate);
staticvoiddelay(uintus);
//====================================================================================
//函数名称:
voidAD9854_WR_Byte(ucharaddr,uchardat)
//函数功能:
AD9854并行口写入数据
//入口参数:
addr6位地址
//dat写入的数据
//出口参数:
无
//====================================================================================
voidAD9854_WR_Byte(ucharaddr,uchardat)
{
AD9854_AdrBus=(addr&0x3f)|(P2&0xc0);
AD9854_DataBus=dat;
AD9854_WR=0;
AD9854_WR=1;
}
//====================================================================================
//函数名称:
voidAD9854_Init(void)
//函数功能:
AD9854初始化
//入口参数:
无
//出口参数:
无
//====================================================================================
voidAD9854_Init(void)
{
AD9854_WR=1;//将读、写控制端口设为无效
AD9854_RD=1;
AD9854_UDCLK=0;
AD9854_RST=1;//复位AD9854
AD9854_RST=0;
AD9854_WR_Byte(0x1d,0x10);//关闭比较器
AD9854_WR_Byte(0x1e,CLK_Set);//设置系统时钟倍频
AD9854_WR_Byte(0x1f,0x00);//设置系统为模式0,由外部更新
AD9854_WR_Byte(0x20,0x60);//设置为可调节幅度,取消插值补偿
AD9854_UDCLK=1;//更新AD9854输出
AD9854_UDCLK=0;
}
//====================================================================================
//函数名称:
voidFreq_convert(longFreq)
//函数功能:
正弦信号频率数据转换
//入口参数:
Freq需要转换的频率,取值从0~SYSCLK/2
//出口参数:
无但是影响全局变量FreqWord[6]的值
//说明:
该算法位多字节相乘算法,有公式FTW=(DesiredOutputFrequency×2N)/SYSCLK
//得到该算法,其中N=48,DesiredOutputFrequency为所需要的频率,即Freq,SYSCLK
//为可编程的系统时钟,FTW为48Bit的频率控制字,即FreqWord[6]
//====================================================================================
voidFreq_convert(longFreq)
{
ulongFreqBuf;
ulongTemp=Freq_mult_ulong;
ucharArray_Freq[4];//将输入频率因子分为四个字节
Array_Freq[0]=(uchar)Freq;
Array_Freq[1]=(uchar)(Freq>>8);
Array_Freq[2]=(uchar)(Freq>>16);
Array_Freq[3]=(uchar)(Freq>>24);
FreqBuf=Temp*Array_Freq[0];
FreqWord[0]=FreqBuf;
FreqBuf>>=8;
FreqBuf+=(Temp*Array_Freq[1]);
FreqWord[1]=FreqBuf;
FreqBuf>>=8;
FreqBuf+=(Temp*Array_Freq[2]);
FreqWord[2]=FreqBuf;
FreqBuf>>=8;
FreqBuf+=(Temp*Array_Freq[3]);
FreqWord[3]=FreqBuf;
FreqBuf>>=8;
FreqWord[4]=FreqBuf;
FreqWord[5]=FreqBuf>>8;
}
//====================================================================================
//函数名称:
voidAD9854_SetSine(ulongFreq,uintShape)
//函数功能:
AD9854正弦波产生程序
//入口参数:
Freq频率设置,取值围为0~(1/2)*SYSCLK
//Shape幅度设置.为12Bit,取值围为(0~4095),取值越大,幅度越大
//出口参数:
无
//====================================================================================
voidAD9854_SetSine(ulongFreq,uintShape)
{
ucharcount;
ucharAdress;
Adress=0x04;//选择频率控制字地址的初值
Freq_convert(Freq);//频率转换
for(count=6;count>0;)//写入6字节的频率控制字
{
AD9854_WR_Byte(Adress++,FreqWord[--count]);
}
AD9854_WR_Byte(0x21,Shape>>8);//设置I通道幅度
AD9854_WR_Byte(0x22,(uchar)(Shape&0xff));
AD9854_WR_Byte(0x23,Shape>>8);//设置Q通道幅度
AD9854_WR_Byte(0x24,(uchar)(Shape&0xff));
AD9854_UDCLK=1;//更新AD9854输出
AD9854_UDCLK=0;
}
//====================================================================================
//函数名称:
voidFreq_doublt_convert(doubleFreq)
//函数功能:
正弦信号频率数据转换
//入口参数:
Freq需要转换的频率,取值从0~SYSCLK/2
//出口参数:
无但是影响全局变量FreqWord[6]的值
//说明:
有公式FTW=(DesiredOutputFrequency×2N)/SYSCLK得到该函数,
//其中N=48,DesiredOutputFrequency为所需要的频率,即Freq,SYSCLK
//为可编程的系统时钟,FTW为48Bit的频率控制字,即FreqWord[6]
//注意:
该函数与上面函数的区别为该函数的入口参数为double,可使信号的频率更精确
//谷雨建议在100HZ以下用本函数,在高于100HZ的情况下用函数voidFreq_convert(longFreq)
//====================================================================================
voidFreq_double_convert(doubleFreq)
{
ulongLow32;
uintHigh16;
doubleTemp=Freq_mult_doulle;//23ca99为2的48次方除以120M
Freq*=(double)(Temp);
//100000000000000000000000000000000=4294967295
High16=(int)(Freq/4294967295);//2^32=4294967295
Freq-=(double)High16*4294967295;
Low32=(ulong)Freq;
FreqWord[0]=Low32;
FreqWord[1]=Low32>>8;
FreqWord[2]=Low32>>16;
FreqWord[3]=Low32>>24;
FreqWord[4]=High16;
FreqWord[5]=High16>>8;
}
//====================================================================================
//函数名称:
voidAD9854_SetSine_double(doubleFreq,uintShape)
//函数功能:
AD9854正弦波产生程序
//入口参数:
Freq频率设置,取值围为0~1/2*SYSCLK
//Shape幅度设置.为12Bit,取值围为(0~4095)
//出口参数:
无
//====================================================================================
voidAD9854_SetSine_double(doubleFreq,uintShape)
{
ucharcount=0;
ucharAdress;
Adress=0x04;//选择频率控制字1地址的初值
Freq_double_convert(Freq);//频率转换
for(count=6;count>0;)//写入6字节的频率控制字
{
AD9854_WR_Byte(Adress++,FreqWord[--count]);
}
AD9854_WR_Byte(0x21,Shape>>8);//设置I通道幅度
AD9854_WR_Byte(0x22,(uchar)(Shape&0xff));
AD9854_WR_Byte(0x23,Shape>>8);//设置Q通道幅度
AD9854_WR_Byte(0x24,(uchar)(Shape&0xff));
AD9854_UDCLK=1;//更新AD9854输出
AD9854_UDCLK=0;
}
//====================================================================================
//函数名称:
voidAD9854_InitFSK(void)
//函数功能:
AD9854的FSK初始化
//入口参数:
无
//出口参数:
无
//====================================================================================
voidAD9854_InitFSK(void)
{
AD9854_WR=1;//将读、写控制端口设为无效
AD9854_RD=1;
AD9854_UDCLK=0;
AD9854_RST=1;//复位AD9854
AD9854_RST=0;
AD9854_WR_Byte(0x1d,0x10);//关闭比较器
AD9854_WR_Byte(0x1e,CLK_Set);//设置系统时钟倍频
AD9854_WR_Byte(0x1f,0x02);//设置系统为模式1,由外部更新
AD9854_WR_Byte(0x20,0x60);//设置为可调节幅度,取消插值补偿
AD9854_UDCLK=1;//更新AD9854输出
AD9854_UDCLK=0;
}
//====================================================================================
//函数名称:
voidAD9854_SetFSK(ulongFreq1,ulongFreq2)
//函数功能:
AD9854的FSK设置
//入口参数:
Freq1FSK频率1
//Freq2FSK频率2
//出口参数:
无
//====================================================================================
voidAD9854_SetFSK(ulongFreq1,ulongFreq2)
{
ucharcount=6;
ucharAdress1,Adress2;
constuintShape=4000;//幅度设置.为12Bit,取值围为(0~4095)
Adress1=0x04;//选择频率控制字1地址的初值
Adress2=0x0a;//选择频率控制字2地址的初值
Freq_convert(Freq1);//频率转换1
for(count=6;count>0;)//写入6字节的频率控制字
{
AD9854_WR_Byte(Adress1++,FreqWord[--count]);
}
Freq_convert(Freq2);//频率转换2
for(count=6;count>0;)//写入6字节的频率控制字
{
AD9854_WR_Byte(Adress2++,FreqWord[--count]);
}
AD9854_WR_Byte(0x21,Shape>>8);//设置I通道幅度
AD9854_WR_Byte(0x22,(uchar)(Shape&0xff));
AD9854_WR_Byte(0x23,Shape>>8);//设置Q通道幅度
AD9854_WR_Byte(0x24,(uchar)(Shape&0xff));
AD9854_UDCLK=1;//更新AD9854输出
AD9854_UDCLK=0;
}
//=======================================
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AD9854 驱动程序 设计
![提示](https://static.bingdoc.com/images/bang_tan.gif)