OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5497|回复: 2

DDS AD9850驱动 串口+并口

[复制链接]

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2013-10-22 14:56:31 | 显示全部楼层 |阅读模式

/*
 * AD9850.h
 *
 *  Created on: 2013-7-12
 *      Author: Allen
 */

#ifndef AD9850_H_
#define AD9850_H_

#include  <MSP430G2553.h>
#include "MyType.h"


//----------------------------------------------------------------------------------
//AD9850:W_CLK P2.5
#define  AD9850_W_CLK_DIR   (P2DIR)
#define  AD9850_W_CLK_OUT   (P2OUT)
#define  AD9850_W_CLK_PIN_NUM  (BIT5)

#define  AD9850_W_CLK_IO_INIT  (Set_Bit(P2DIR,AD9850_W_CLK_PIN_NUM))
#define  AD9850_W_CLK_H       (Set_Bit(P2OUT,AD9850_W_CLK_PIN_NUM))
#define  AD9850_W_CLK_L       (Clr_Bit(P2OUT,AD9850_W_CLK_PIN_NUM))

//----------------------------------------------------------------------------------
//AD9850:FQ_UP P2.4
#define  AD9850_FQ_UP_DIR   (P2DIR)
#define  AD9850_FQ_UP_OUT   (P2OUT)
#define  AD9850_FQ_UP_PIN_NUM  (BIT4)

#define  AD9850_FQ_UP_IO_INIT  (Set_Bit(P2DIR,AD9850_FQ_UP_PIN_NUM))
#define  AD9850_FQ_UP_H       (Set_Bit(P2OUT,AD9850_FQ_UP_PIN_NUM))
#define  AD9850_FQ_UP_L       (Clr_Bit(P2OUT,AD9850_FQ_UP_PIN_NUM))

//----------------------------------------------------------------------------------
//AD9850:RESET P2.3
#define  AD9850_RESET_DIR   (P2DIR)
#define  AD9850_RESET_OUT   (P2OUT)
#define  AD9850_RESET_PIN_NUM  (BIT3)

#define  AD9850_RESET_IO_INIT  (Set_Bit(P2DIR,AD9850_RESET_PIN_NUM))
#define  AD9850_RESET_H       (Set_Bit(P2OUT,AD9850_RESET_PIN_NUM))
#define  AD9850_RESET_L       (Clr_Bit(P2OUT,AD9850_RESET_PIN_NUM))

//----------------------------------------------------------------------------------
//AD9850:BIT_DATA P1.7
#define  AD9850_BIT_DATA_DIR   (P1DIR)
#define  AD9850_BIT_DATA_OUT   (P1OUT)
#define  AD9850_BIT_DATA_PIN_NUM  (BIT7)

#define  AD9850_BIT_DATA_IO_INIT  (Set_Bit(P1DIR,AD9850_BIT_DATA_PIN_NUM))
#define  AD9850_BIT_DATA_H   (Set_Bit(P1OUT,AD9850_BIT_DATA_PIN_NUM))
#define  AD9850_BIT_DATA_L   (Clr_Bit(P1OUT,AD9850_BIT_DATA_PIN_NUM))


extern void AD9850_INIT_SERIAL(void);

extern void AD9850_RESET_SERIAL(void);

extern void AD9850_WR_SERIAL(unsigned char w0,double frequence);

extern void AD9850_INIT_PARREL(void);

extern void AD9850_RESET_PARREL(void);

extern void AD9850_WR_PARREL(unsigned char w0,double frequence);

#endif /* LED_H_ */





/*
 * AD9850.c
 *
 *  Created on: 2013-10-15
 *      Author: Allen
 */

#include "AD9850.h"
#include  <MSP430G2553.h>

void AD9850_INIT_SERIAL(void)
{
 AD9850_W_CLK_IO_INIT;
 AD9850_FQ_UP_IO_INIT;
 AD9850_RESET_IO_INIT;
 AD9850_BIT_DATA_IO_INIT;
}

void AD9850_RESET_SERIAL(void)
{
 AD9850_W_CLK_L;
 AD9850_FQ_UP_L;
    //rest信号
 AD9850_RESET_L;
    AD9850_RESET_H;
    AD9850_RESET_L;
    //w_clk信号
    AD9850_W_CLK_L;
    AD9850_W_CLK_H;
    AD9850_W_CLK_L;
    //fq_up信号
    AD9850_FQ_UP_L;
    AD9850_FQ_UP_H;
    AD9850_FQ_UP_L;

}

void AD9850_WR_SERIAL(unsigned char w0,double frequence)
{
 unsigned char i,w;
 long int y;
 double x;
 //计算频率的HEX值
 x=4294967295/20;//适合125M晶振
 //如果时钟频率不为20MHZ,修改该处的频率值,单位MHz  !!!
 frequence=frequence/1000000;
 frequence=frequence*x;
 y=frequence;
 //写w4数据
 w=(y>>=0);
 for(i=0;i<8;i++)
 {
//    ad9850_bit_data=(w>>i)&0x01;
    if((w>>i)&0x01)
      AD9850_BIT_DATA_H;
       else
      AD9850_BIT_DATA_L;
    AD9850_W_CLK_H;
    AD9850_W_CLK_L;
 }
 //写w3数据
 w=(y>>8);
 for(i=0;i<8;i++)
 {
     if((w>>i)&0x01)
    AD9850_BIT_DATA_H;
     else
    AD9850_BIT_DATA_L;
     AD9850_W_CLK_H;
     AD9850_W_CLK_L;
 }
 //写w2数据
 w=(y>>16);
 for(i=0;i<8;i++)
 {
     if((w>>i)&0x01)
    AD9850_BIT_DATA_H;
     else
    AD9850_BIT_DATA_L;
     AD9850_W_CLK_H;
     AD9850_W_CLK_L;
 }
 //写w1数据
 w=(y>>24);
 for(i=0;i<8;i++)
 {
     if((w>>i)&0x01)
    AD9850_BIT_DATA_H;
     else
    AD9850_BIT_DATA_L;
     AD9850_W_CLK_H;
     AD9850_W_CLK_L;
 }
 //写w0数据
 w=w0;
 for(i=0;i<8;i++)
 {
     if((w>>i)&0x01)
    AD9850_BIT_DATA_H;
     else
    AD9850_BIT_DATA_L;
     AD9850_W_CLK_H;
     AD9850_W_CLK_L;
 }
 //移入始能
 AD9850_FQ_UP_H;
 AD9850_FQ_UP_L;

}


void AD9850_INIT_PARREL(void)
{
 AD9850_W_CLK_IO_INIT;
 AD9850_FQ_UP_IO_INIT;
 AD9850_RESET_IO_INIT;
 1DIR=0xff;

}


void AD9850_RESET_PARREL(void)
{
 AD9850_W_CLK_L;
 AD9850_FQ_UP_L;
 //rest信号
 AD9850_RESET_L;
 AD9850_RESET_H;
 AD9850_RESET_L;
}


void AD9850_WR_PARREL(unsigned char w0,double frequence)
{
 unsigned char w;
 long int y;
 double x;
 //计算频率的HEX值
 x=4294967295/20;//适合20M晶振
 //如果时钟频率不为20MHZ,修改该处的频率值,单位MHz !!!
 frequence=frequence/1000000;
 frequence=frequence*x;
 y=frequence;
 //写w0数据
 w=w0;
 1OUT=w;      //w0
 AD9850_W_CLK_H;
 AD9850_W_CLK_L;
 //写w1数据
 w=(y>>24);
 1OUT=w;      //w1
 AD9850_W_CLK_H;
 AD9850_W_CLK_L;
 //写w2数据
 w=(y>>16);
 1OUT=w;      //w2
 AD9850_W_CLK_H;
 AD9850_W_CLK_L;
 //写w3数据
 w=(y>>8);
 1OUT=w;      //w3
 AD9850_W_CLK_H;
 AD9850_W_CLK_L;
 //写w4数据
 w=(y>>0);
 1OUT=w;      //w4
 AD9850_W_CLK_H;
 AD9850_W_CLK_L;
 //移入始能
 AD9850_FQ_UP_H;
 AD9850_FQ_UP_L;

}




 

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2013-10-22 16:24:37 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

20

帖子

0

精华

高级会员

Rank: 4

积分
543
金钱
543
注册时间
2013-8-22
在线时间
40 小时
发表于 2017-1-3 14:09:59 | 显示全部楼层
楼主发帖辛苦了,谢谢分享!!!!!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-5-29 05:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表