|
AD9834频率发生器是AD公司生产的芯片,以下是驱动代码,供参考。
/*------------------------------------------------------------------------------------
***********************AD9834驱动程序********************************
***********************STM32固件函数库V2.0*************************
***********************2011.3.29****************************************
------------------------------------------------------------------------------------*/
#ifndef __AD9834_H
#define __AD9834_H
#include "stm32f4xx.h"
#include "main.h"
#define Triangle_Wave 0x2002
#define Sine_Wave 0x2028
/* AD9834晶振频率 */
#define AD9834_SYSTEM_COLCK 250000000UL //250M
#define AD9834_FSYNC_SET HAL_GPIO_WritePin(AD9834_FSYNC_GPIO_Port,AD9834_FSYNC_Pin,GPIO_PIN_SET)//GPIO_SetBits(AD9834_Control_Port ,AD9834_FSYNC)
#define AD9834_FSYNC_CLR HAL_GPIO_WritePin(AD9834_FSYNC_GPIO_Port,AD9834_FSYNC_Pin,GPIO_PIN_RESET)//GPIO_ResetBits(AD9834_Control_Port ,AD9834_FSYNC)
#define AD9834_SCLK_SET HAL_GPIO_WritePin(AD9834_SCLK_GPIO_Port,AD9834_SCLK_Pin,GPIO_PIN_SET)//GPIO_SetBits(AD9834_Control_Port ,AD9834_SCLK)
#define AD9834_SCLK_CLR HAL_GPIO_WritePin(AD9834_SCLK_GPIO_Port,AD9834_SCLK_Pin,GPIO_PIN_RESET)//GPIO_ResetBits(AD9834_Control_Port ,AD9834_SCLK)
#define AD9834_SDATA_SET HAL_GPIO_WritePin(AD9834_SDATA_GPIO_Port,AD9834_SDATA_Pin,GPIO_PIN_SET)//GPIO_SetBits(AD9834_Control_Port ,AD9834_SDATA)
#define AD9834_SDATA_CLR HAL_GPIO_WritePin(AD9834_SDATA_GPIO_Port,AD9834_SDATA_Pin,GPIO_PIN_RESET)//GPIO_ResetBits(AD9834_Control_Port ,AD9834_SDATA)
#define AD9834_RESET_SET HAL_GPIO_WritePin(AD9834_RESET_GPIO_Port,AD9834_RESET_Pin,GPIO_PIN_SET)//GPIO_SetBits(AD9834_Control_Port ,AD9834_RESET)
#define AD9834_RESET_CLR HAL_GPIO_WritePin(AD9834_RESET_GPIO_Port,AD9834_RESET_Pin,GPIO_PIN_RESET)//GPIO_ResetBits(AD9834_Control_Port ,AD9834_RESET)
#define FREQ_0 0
#define FREQ_1 1
#define DB15 0
#define DB14 0
#define DB13 B28
#define DB12 HLB
#define DB11 FSEL
#define DB10 PSEL
#define DB9 PIN_SW
#define DB8 RESET
#define DB7 SLEEP1
#define DB6 SLEEP12
#define DB5 OPBITEN
#define DB4 SIGN_PIB
#define DB3 DIV2
#define DB2 0
#define DB1 MODE
#define DB0 0
#define CONTROL_REGISTER (DB15<<15)|(DB14<<14)|(DB13<<13)|(DB12<<12)|(DB11<<11)|(DB10<<10)\
|(DB9<<9)|(DB8<<8)|(DB7<<7)|(DB6<<6)|(DB5<<5)|(DB4<<4)|(DB3<<3)|(DB2<<2)|(DB1<<1)|(DB0<<0)
/* AD9834函数声明 */
void AD9834_Write_16Bits(unsigned short data) ; //写一个字到AD9834
void AD9834_Select_Wave(unsigned short initdata) ; //选择输出波形
void Init_AD9834(void);//初始化配置
void AD9834_Set_Freq(unsigned char freq_number,unsigned int freq) ;//选择输出寄存器和输出频率值
#endif /* AD9834_H */
//====================AD9834.c======================//
#include "AD9834.h"
#include "delay.h"
unsigned short BackUpFreqValue;
void DelayUs(unsigned int time)
{
while(time>0)time-=1;
}
/****************************************************************
函数名称: AD9834_Write_16Bits
功 能: 向AD9834写入16为数据
参 数: data -- 要写入的16位数据
返回值 : 无
*****************************************************************/
void AD9834_Write_16Bits(unsigned short data)
{
unsigned char i=0;
AD9834_SCLK_SET;
AD9834_FSYNC_CLR;
for(i=0 ;i<16 ;i++)
{
if(data & 0x8000)
AD9834_SDATA_SET;
else
AD9834_SDATA_CLR;
data <<= 1;
AD9834_SCLK_CLR;
AD9834_SCLK_CLR;
AD9834_SCLK_SET;
AD9834_SCLK_SET;
}
AD9834_FSYNC_SET;
}
/***********************************************************************************
函数名称:AD9834_Select_Wave
功 能:软件为控制,
--------------------------------------------------
IOUT正弦波 ,SIGNBITOUT方波 ,写FREQREG0 ,写PHASE0
ad9834_write_16bit(0x2028) 一次性写FREQREG0
ad9834_write_16bit(0x0038) 单独改写FREQREG0的LSB
ad9834_write_16bit(0x1038) 单独改写FREQREG0的MSB
--------------------------------------------------
IOUT三角波 ,写PHASE0
ad9834_write_16bit(0x2002) 一次性写FREQREG0
ad9834_write_16bit(0x0002) 单独改写FREQREG0的LSB
ad9834_write_16bit(0x1008) 单独改写FREQREG0的MSB
参 数:initdata -- 要输入的命令
返回值 :无
************************************************************************************/
void AD9834_Select_Wave(unsigned short initdata)
{
AD9834_FSYNC_SET;
AD9834_SCLK_SET;
AD9834_RESET_SET;
AD9834_RESET_SET;
AD9834_RESET_CLR;
AD9834_Write_16Bits(initdata);
}
/////////////////////////////////////////////////////////////////////////
void DDSInit()
{
AD9834_Write_16Bits(0x2100);DelayUs(10);
AD9834_Write_16Bits(0x4000);DelayUs(10);
AD9834_Write_16Bits(0x4000);DelayUs(10);
AD9834_Write_16Bits(0xC000);DelayUs(10);//FreqREG0、PhaseREG赋初值0
AD9834_Write_16Bits(0x2D00);DelayUs(10);
AD9834_Write_16Bits(0x8000);DelayUs(10);
AD9834_Write_16Bits(0x8000);DelayUs(10);
AD9834_Write_16Bits(0xE000);DelayUs(10);//FreqREG1、PhaseREG1赋初值0
}
/****************************************************************
函数名称: Init_AD9834
功 能: 初始化AD9834控制引脚
参 数: 无
返回值 : 无
*****************************************************************/
void Init_AD9834(void)
{
// GPIO_InitTypeDef GPIO_InitStructure ;
// GPIO_InitStructure.GPIO_Pin=AD9834_FSYNC | AD9834_SCLK | AD9834_SDATA | AD9834_RESET ;
// GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz ;
// GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT ;
// GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
// GPIO_Init(AD9834_Control_Port ,&GPIO_InitStructure) ;
//
AD9834_FSYNC_SET;
AD9834_SCLK_SET;
AD9834_RESET_SET;DelayUs(10);
AD9834_RESET_SET;DelayUs(10);
AD9834_Write_16Bits(0x2128);
DelayUs(10);DDSInit();
AD9834_FSYNC_SET;
AD9834_SCLK_SET;
AD9834_RESET_SET;DelayUs(10);
AD9834_RESET_SET;DelayUs(10);
AD9834_Write_16Bits(0x2028);//0x2008|正弦波 0x2002|三角波 0x2028|方波
DelayUs(10);
AD9834_Write_16Bits(0xCFFF);//0xC000
DelayUs(10);
}
/****************************************************************
函数名称: AD9834_Set_Freq
功 能: 设置频率值
参 数: freq_number -- 要写入的平率寄存器(FREQ_0或FREQ_1)
freq -- 频率值 (Freq_value(value)=Freq_data(data)*FCLK/2^28)
返回值 : 无
*****************************************************************/
void AD9834_Set_Freq(unsigned char freq_number,unsigned int freq)
{
unsigned int FREQREG;
unsigned short FREQREG_LSB_14BIT;
unsigned short FREQREG_MSB_14BIT;
//freq<<=1;
FREQREG=(unsigned int)(268435456.0/AD9834_SYSTEM_COLCK*freq);
//FREQREG=(u32)(1.073741824*freq);
FREQREG_LSB_14BIT=(unsigned short)FREQREG;
FREQREG_MSB_14BIT=(unsigned short)(FREQREG>>14);
if(freq_number == FREQ_0)
{
FREQREG_LSB_14BIT &= ~(1U<<15);
FREQREG_LSB_14BIT |= 1<<14;
FREQREG_MSB_14BIT &= ~(1U<<15);
FREQREG_MSB_14BIT |= 1<<14;
}
else
{
FREQREG_LSB_14BIT &= ~(1<<14);
FREQREG_LSB_14BIT |= 1U<<15;
FREQREG_MSB_14BIT &= ~(1<<14);
FREQREG_MSB_14BIT |= 1U<<15;
}
if(BackUpFreqValue!=FREQREG_MSB_14BIT)
{
AD9834_Write_16Bits(0x2028);//
AD9834_Write_16Bits(FREQREG_LSB_14BIT);
AD9834_Write_16Bits(FREQREG_MSB_14BIT);
AD9834_Write_16Bits(0x0028);//
}
else
{
AD9834_Write_16Bits(FREQREG_LSB_14BIT);
}
BackUpFreqValue=FREQREG_MSB_14BIT;
}
|
|