1、//========================AD9850.h=============================// /*-------------------------------------------- AD9850驱动程序 ----------------------------------------------*/ #ifndef __AD9850_H #define __AD9850_H /*选择数据通信方式,只能选择一个*/ //#define MODE_SEIAL //串行模式 #define MODE_PARALL
2、EL //并行模式 #define AD9850_SYSTEM_COLCK 100000000 /* AD9850 控制和数据引脚定义 */ #define AD9850_CONTROL_PORT GPIOA #define AD9850_FQUD GPIO_Pin_2 #define AD9850_WCLK GPIO_Pin_3 #define AD9850_RST GPIO_Pin_4 #ifdef MODE_PARALLEL //并行模式数据口0~7 #define AD9850_DATA_PORT GPIOC #endif #ifdef
3、 MODE_SEIAL //串行模式数据口 #define AD9850_DATA GPIO_Pin_5 #define AD9850_DATA_Write_1 GPIO_WriteBit(AD9850_CONTROL_PORT,AD9850_DATA,Bit_SET) #define AD9850_DATA_Write_0 GPIO_WriteBit(AD9850_CONTROL_PORT,AD9850_DATA,Bit_RESET) #endif #define AD9850_WCLK_SET GPIO_WriteBit(AD9850_C
4、ONTROL_PORT,AD9850_WCLK,Bit_SET) #define AD9850_WCLK_CLR GPIO_WriteBit(AD9850_CONTROL_PORT,AD9850_WCLK,Bit_RESET) #define AD9850_FQUD_SET GPIO_WriteBit(AD9850_CONTROL_PORT,AD9850_FQUD,Bit_SET) #define AD9850_FQUD_CLR GPIO_WriteBit(AD9850_CONTROL_PORT,AD9850_FQUD,Bit_RESET) #define AD985
5、0_RST_SET GPIO_WriteBit(AD9850_CONTROL_PORT,AD9850_RST,Bit_SET) #define AD9850_RST_CLR GPIO_WriteBit(AD9850_CONTROL_PORT,AD9850_RST,Bit_RESET) /* 串行模式操作函数 */ #ifdef MODE_SEIAL extern void AD9850_Reset_Sreial(void) ; extern void AD9850_Write_Serial(unsigned char W0,unsigned long freq
6、) ; #endif /* 并行模式操作函数 */ #ifdef MODE_PARALLEL extern void AD9850_Reset_Parallel(void) ; extern void AD9850_Write_Parallel(unsigned char W0,unsigned long freq) ; #endif extern void Init_AD9850(void) ; #endif /* AD8950_H */ //==================================================================
7、// //=========================AD9850.c=================================// #include "stm32f10x_lib.h" #include "AD9850.h" /******************************************** 函数名称:AD9850_Delay 功 能:AD9850延时函数 参 数:z - 延时长度 返回值 :无 *********************************************/ void AD9850_Dela
8、y(unsigned int z) { for(;z>0;z--) {;} } /*--------------------并行模式-----------------------*/ #ifdef MODE_PARALLEL /******************************************** 函数名称:AD9850_Reset_Parallel 功 能:在并行模式下复位AD9850 参 数:无 返回值 :无 *********************************************/ void
9、 AD9850_Reset_Parallel(void) { AD9850_WCLK_CLR ; AD9850_FQUD_CLR ; //RST信号 AD9850_RST_CLR ; AD9850_RST_SET ; AD9850_Delay(0xFFFF) ; AD9850_RST_CLR ; } /******************************************** 函数名称:AD9850_Write_Parallel 功 能:在并行模式下写AD9850寄存器 参 数:W0 -
10、 W0寄存器的值 freq - 频率值 返回值 :无 *********************************************/ void AD9850_Write_Parallel(unsigned char W0,unsigned long freq) { unsigned char wdata ; unsigned long y=(unsigned long)(4294967295/AD9850_SYSTEM_COLCK) ; y *= freq ; wdata=W0 ; //写w0
11、GPIO_Write(AD9850_DATA_PORT ,wdata) ; AD9850_WCLK_SET ; AD9850_WCLK_CLR ; wdata=y>>24 ; //写w1 GPIO_Write(AD9850_DATA_PORT ,wdata) ; AD9850_WCLK_SET ; AD9850_WCLK_CLR ; wdata=y>>16 ; //写w2 GPIO_Write(AD9850_DATA_PORT ,wdata) ; AD9850_WCLK_SET
12、 ; AD9850_WCLK_CLR ; wdata=y>>8 ; //写w3 GPIO_Write(AD9850_DATA_PORT ,wdata) ; AD9850_WCLK_SET ; AD9850_WCLK_CLR ; wdata=y>>0 ; //写w4 GPIO_Write(AD9850_DATA_PORT ,wdata) ; AD9850_WCLK_SET ; AD9850_WCLK_CLR ; AD9850_FQUD_SET ; //移入
13、使能 AD9850_Delay(0xFFFF) ; AD9850_FQUD_CLR ; } #endif /* MODE_PARALLEL */ /*------------------------并行模式-------------------------*/ /*---------------------------------------------------------*/ /*------------------------串行模式-------------------------*/ #ifdef MODE_SEIAL /*************
14、 函数名称:AD9850_Reset_Sreial 功 能:在串行模式下复位AD9850 参 数:无 返回值 :无 *********************************************/ void AD9850_Reset_Sreial(void) { AD9850_WCLK_CLR ; AD9850_FQUD_CLR ; //RST信号 AD9850_RST_CLR ; AD9850_RST_SET ; AD9850_De
15、lay(0xFFFF) ; AD9850_RST_CLR ; //WCLK信号 AD9850_WCLK_CLR ; AD9850_WCLK_SET ; AD9850_Delay(0xFFFF) ; AD9850_WCLK_CLR ; //FQUD信号 AD9850_FQUD_CLR ; AD9850_FQUD_SET ; AD9850_Delay(0xFFFF) ; AD9850_FQUD_CLR ; } /*************************************
16、 函数名称:AD9850_Write_Serial 功 能:在串行模式下写AD9850寄存器 参 数:W0 - W0寄存器的值 freq - 频率值 返回值 :无 *********************************************/ void AD9850_Write_Serial(unsigned char W0,unsigned long freq) { unsigned char i,wdata ; unsigned long y ; y = (unsigned lon
17、g )268435456.0/AD9850_SYSTEM_COLCK*freq ; wdata = y>>0 ; //写w4 for(i=0 ;i<8 ;i++) { if(wdata & 0x01) AD9850_DATA_Write_1 ; else AD9850_DATA_Write_0 ; AD9850_WCLK_SET ; wdata >>= 1 ; AD9850_WCLK_CLR ; }
18、 wdata = y>>8 ; //写w3 for(i=0 ;i<8 ;i++) { if(wdata & 0x01) AD9850_DATA_Write_1 ; else AD9850_DATA_Write_0 ; AD9850_WCLK_SET ; wdata >>= 1 ; AD9850_WCLK_CLR ; } wdata = y>>16 ; //写w2 for(i=0 ;i<8 ;i++)
19、 { if(wdata & 0x01) AD9850_DATA_Write_1 ; else AD9850_DATA_Write_0 ; AD9850_WCLK_SET ; wdata >>= 1 ; AD9850_WCLK_CLR ; } wdata = y>>24 ; //写w1 for(i=0 ;i<8 ;i++) { if(wdata & 0x01) AD985
20、0_DATA_Write_1 ; else AD9850_DATA_Write_0 ; AD9850_WCLK_SET ; wdata >>= 1 ; AD9850_WCLK_CLR ; } wdata = W0 ; //写w0 for(i=0 ;i<8 ;i++) { if(wdata & 0x01) AD9850_DATA_Write_1 ; else AD9850_DATA
21、Write_0 ; AD9850_WCLK_SET ; wdata >>= 1 ; AD9850_WCLK_CLR ; } AD9850_FQUD_SET ; //移入使能 AD9850_Delay(0xFFFF) ; AD9850_FQUD_CLR ; } #endif /* MODE_SERIAL */ /*------------------------串行模式-------------------------*/ /*--------------------------
22、/ /******************************************** 函数名称:Init_AD9834 功 能:初始化AD9834 参 数:无 返回值 :无 *********************************************/ void Init_AD9850(void) { #ifdef MODE_SEIAL //串行模式 GPIO_InitTypeDef GPIO_InitStructure ; GPIO_InitStru
23、cture.GPIO_Pin = AD9850_WCLK | AD9850_FQUD | AD9850_RST | AD9850_DATA ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(AD9850_CONTROL_PORT ,&GPIO_InitStructure) ; AD9850_Reset_Sreial() ; #endif #ifdef MO
24、DE_PARALLEL //并行模式 GPIO_InitTypeDef GPIO_InitStructure ; GPIO_InitStructure.GPIO_Pin = AD9850_WCLK | AD9850_FQUD | AD9850_RST ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(AD9850_CONTROL_PORT ,&GPIO_InitStruct
25、ure) ; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(AD9850_DATA_PORT ,&GPIO_InitStructure) ; AD9850_Reset_Parallel() ; #endif } //================================================================// 写得一般,希望大家能给出点建议!






