⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 使用2410实验箱对AD9852进行控制输出指定频率的正弦波
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzhou ZHIYUAN electronics Co.,LTD.
**                                     
**                                 http://www.zyinside.com
**
**--------------File Info-------------------------------------------------------------------------------
** File Name: main.c
** Last modified Date: 2006-01-11
** Last Version: v1.0
** Description:  MagicARM2410实验箱的基础实验---控制AD9852。
**               
**------------------------------------------------------------------------------------------------------
** Created By: 黄绍斌
** Created date: 2006-01-10
** Version: v1.0
** Descriptions:
**
**------------------------------------------------------------------------------------------------------
** Modified by:Bisu[Shield]
** Modified date:2008-11-18 17:11:30
** Version:v1.1
** Description:使用MCNDS-2410实验箱上面的friendly-arm开发板控制AD9852
--------------------------------------------------------------------------------------------------------
** 接线说明:以下说明为管脚接CON-GPIO的对应引脚 
**			update --> 3
**			RESET  --> 18
**			WR     --> 17
**			D7-D0  --> 12,11,10,9,8,7,34,20
**			A5-A0  --> 6,5,33,32,31,19
**
********************************************************************************************************/
#include  "config.h"

#define SYSTEM_CLOCK (200000000)//定义AD9852系统时钟为200MHz

//关于各个工作模式的宏定义
#define SINGLE_STONE_MODE  (0)
#define FSK_MODE           (1)
#define RAMPED_FSK_MODE    (2)
#define CHIRP_MODE		   (3)
#define BPSK_MODE          (4)
//--------------------------------------------------------------------------------------------------------

/*********************************************************************************************************
** 函数名称 :DelayNS()
** 函数功能 :长软件延时
** 入口参数 :dly	延时参数,值越大,延时越久
** 出口参数 :无
*********************************************************************************************************/
void DelayNS (uint32 dly)
{
	uint32 i;
	
	for ( ; dly>0; dly--)
		for (i=0; i<500; i++);
}

/*********************************************************************************************************
** 函数名称 :setWR()
** 函数功能 :拉高WR
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
void setWR(void)
{
	rGPHDAT = (rGPHDAT & ~(0x200)) | (0x01<<9);
}

/********************************************************************************************************
** 函数名称 :clrWR()
** 函数功能 :拉低WR
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
void clrWR(void)
{
	rGPHDAT = (rGPHDAT & ~(0x200)) | (0x00<<9);
}

/*******************************************************************************************************
** 函数名称 :reset_9852()
** 函数功能 :复位9852
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
void reset_9852(void)
{
	rGPHDAT = (rGPHDAT & ~(0x400)) | 0x400;
	
	DelayNS(100);						   // 将AD9852复位,需10个系统时钟
	
	rGPHDAT = (rGPHDAT & ~(0x400)) | 0x00; //拉低reset
	
	rGPFDAT = (rGPFDAT & ~(0x01)) | 0x00;  //拉低update
}

/*********************************************************************************************************
** 函数名称 :initSys()
** 函数功能 :9852控制系统IO初始化,设定所有的控制管脚均为GPIO的output引脚
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
void initSys (void)
{
    rGPFCON = (rGPFCON & ~(0x03)) | 0x01;//设定GPF0为output
    rGPFUP = (rGPFUP & ~(0x01)) | 0x01;//禁用上拉电阻
    
    rGPHCON = (rGPHCON & ~(0x3c0000)) | (0x05<<18);//设定GPH10和GPH9为output
    rGPHUP = (rGPHUP & ~(0x600)) | (0x03<<9);//禁用上拉电阻
    
    rGPGCON = (rGPGCON & ~(0xc3fcf0)) | 0x415450;//设定GPG11.GPG8-GPG5,GPG3-GPG2为output
    rGPGUP = (rGPGUP & ~(0x9ec)) | 0x9ec;//禁用上拉电阻
     
    rGPBCON = (rGPBCON & ~(0x0f)) | 0x05;//设定GPB1-GPB0为output
    rGPBUP = (rGPBUP & ~(0x03)) | 0x03;//禁用上拉电阻
    
    rGPECON = (rGPECON & ~(0xfc00000)) | 0x5400000;//设定GPE13-GPE11为output
    rGPEUP = (rGPEUP & ~(0x3800)) | 0x3800;	//禁用上拉电阻
    
    rGPFCON = (rGPFCON & ~(0x3c00)) | 0x1400;//设定GPF6-5为output
    rGPFUP = (rGPFUP & ~(0x60)) | 0x60;//禁用上拉电阻
    
    reset_9852();
}

/*********************************************************************************************************
** 函数名称 :inputAddress()
** 函数功能 :通过A5-A0地址线输入地址数据addr
** 入口参数 :addr  输入的地址数据
** 出口参数 :无
************************************************s*********************************************************/
void inputAddress(uint8 addr)
{

	rGPFDAT = (rGPFDAT & ~(0x60)) | (((addr & 0x30)>>4)<<5);
	
	rGPEDAT = (rGPEDAT & ~(0x3800)) | (((addr & 0x0e)>>1)<<11);
	
	rGPBDAT = (rGPBDAT & ~(0x01)) | (addr & 0x01);
}

/*********************************************************************************************************
** 函数名称 :inputData()
** 函数功能 :通过D7-D0数据输入线,输入数据dat
** 入口参数 :dat   输入的数据数据
** 出口参数 :无
*********************************************************************************************************/
void inputData(uint8 dat)
{
	
	rGPGDAT = (rGPGDAT & ~(0x9EC)) | (((dat & 0x80)>>7)<<11) | (((dat & 0x78)>>3)<<5) | (((dat & 0x06)>>1)<<2);
	
	rGPBDAT = (rGPBDAT & ~(0x02)) | ((dat & 0x01)<<1);
}

/*********************************************************************************************************
** 函数名称 :inputAddAndData()
** 函数功能 :通过D7-D0数据输入线,输入数据dat
**			  通过A5-A0地址输入线,输入地址addr
** 入口参数 :addr  输入的地址数据
**			  dat   输入的数据数据
** 出口参数 :无
*********************************************************************************************************/
void inputAddAndData(uint8 addr, uint8 dat)
{	
	 	inputAddress(addr);
	 	inputData(dat);
	 	clrWR();
	    setWR();
}

//以下内容为AD9852数据手册中的寄存器相关配置的子函数
/*********************************************************************************************************
** 函数名称 :setMode()
** 函数功能 :设置9852的工作模式
** 入口参数 :mode      对应9852不同的工作模式
** 出口参数 :无
*********************************************************************************************************/
void setMode(uint8 mode)
{
        setWR();
        
        if(mode == SINGLE_STONE_MODE)
        {        
	    	inputAddAndData(0x1d,0x10);		
		    inputAddAndData(0x1e,0x48);//外接晶振为25M,将其8倍频,将系统时钟设置为200M
			inputAddAndData(0x1f,0x00);	//将模式设置为single tone,将IO/UD脚设置为输入	
			inputAddAndData(0x20,0x00);
		}
		else if(mode == FSK_MODE)
		{
			inputAddAndData(0x1d,0x10);
		   	inputAddAndData(0x1e,0x48);//外接晶振为25M,将其8倍频,将系统时钟设置为200M
			inputAddAndData(0x1f,0x02);//将模式设置为FSK,将IO/UD脚设置为输入	
			inputAddAndData(0x20,0x00);
			DelayNS(1000);//延时一段时间
		}
		else if(mode == RAMPED_FSK_MODE)
		{
			inputAddAndData(0x1d,0x10);
		   	inputAddAndData(0x1e,0x48);//外接晶振为25M,将其8倍频,将系统时钟设置为200M
			inputAddAndData(0x1f,0x24);//将模式设置为RAMPED_FSK,将IO/UD脚设置为输入	
			inputAddAndData(0x20,0x00);
		}
		else if(mode == CHIRP_MODE)
		{
			inputAddAndData(0x1d,0x10);
		   	inputAddAndData(0x1e,0x48);//外接晶振为25M,将其8倍频,将系统时钟设置为200M
			inputAddAndData(0x1f,0x06);//将模式设置为CHRIP,将IO/UD脚设置为输入			
			inputAddAndData(0x20,0x00);
			DelayNS(1000);//短暂延时一段时间
		}
		else if(mode == BPSK_MODE)
		{
			inputAddAndData(0x1d,0x10);
		   	inputAddAndData(0x1e,0x48);//外接晶振为25M,将其8倍频,将系统时钟设置为200M
			inputAddAndData(0x1f,0x08);//将模式设置为CHRIP,将IO/UD脚设置为输入	
			inputAddAndData(0x20,0x00);
		}
}
/*********************************************************************************************************
** 函数名称 :update_9852()
** 函数功能 :更新9852的工作状态(让向前写入的寄存器生效)
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
void update_9852(void)
{
		rGPFDAT = (rGPFDAT & ~(0x01)) | 0x01;//拉高update
		DelayNS(10);
	    rGPFDAT = (rGPFDAT & ~(0x01)) | 0x00;//拉低update
}

/********************************************************************************************************
** 函数名称 :setFre()
** 函数功能 :设置频率
** 入口参数 :freq     设置的频率值(单位Hz)
**            which    需要设置哪一个寄存器 1-->FTW1, 2-->FTW2, 3-->DFW
** 出口参数 :无
*********************************************************************************************************/
void setFre(long int freq, uint8 which)
{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -