📄 main.c
字号:
/****************************************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 + -