前段时间忙着画板子搞运放搞滤波了,程序更新的少,发现MSP430不是太好用,尤其Timer,不过也与我使用内部晶振有关,产生正玄波之前用MSP430发出PWM,再进行滤波变为正弦波太麻烦了,这次改用DDS芯片,今天板子回来一会就调了出来很方便。

AD9850为一款DDS芯片,这里不做什么详细介绍了,有两种接口:serial 和 parrel,两种接口驱动均完成

 /*
* 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.h

以上是头文件完成了pin定义与位操作,并口的数据线操作并没定义,到时候直接用port操作很方便,AD9850的D0-D7与MSP430的P1.0-P1.7对应,一次写入8位很简单。

其中使用了#include "MyType.h"中一些操作:

// C
#define  Set_Bit(val, bitn)  (val |= (/*1 <<*/(bitn)))  
#define  Clr_Bit(val, bitn)  (val &= ~(/*1<<*/(bitn)))  
#define  Get_Bit(val, bitn)  (val & (1<<(bitn)) )

先写的串口的程序:

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

AD9850_INIT_SERIAL

 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; }

AD9850_RESET_SERIAL

 void AD9850_WR_SERIAL(unsigned char w0,double frequence)
{
unsigned char i,w;
long int y;
double x;
//计算频率的HEX值
x=/;//适合125M晶振
//如果时钟频率不为20MHZ,修改该处的频率值,单位MHz !!!
frequence=frequence/;
frequence=frequence*x;
y=frequence;
//写w4数据
w=(y>>=);
for(i=;i<;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>>);
for(i=;i<;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>>);
for(i=;i<;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>>);
for(i=;i<;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=;i<;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; }

AD9850_WR_SERIAL

串行连接时候需要注意pin2-4的连接:

以下是并行部分程序:

 void AD9850_INIT_PARREL(void)
{
AD9850_W_CLK_IO_INIT;
AD9850_FQ_UP_IO_INIT;
AD9850_RESET_IO_INIT;
P1DIR=0xff; }

AD9850_INIT_PARREL

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

AD9850_RESET_PARREL

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

AD9850_WR_PARREL

主函数:

 char mode=; //0:serial   1:parrel
/*
* main.c
*/
int main(void) {
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer mode=; if(mode==)
{ AD9850_INIT_SERIAL();
AD9850_RESET_SERIAL();
AD9850_WR_SERIAL(,);
}
else if(mode==)
{ AD9850_INIT_PARREL();
AD9850_RESET_PARREL();
AD9850_WR_PARREL(,); } while()
{ }
return ;
}

main(void)

个人感受:方便,简单嘿嘿

最新文章

  1. [LeetCode] Word Search II 词语搜索之二
  2. 嵌入式linux下如何尽快播放开机音乐
  3. 使用 lsyncd 本地目录实时备份
  4. EmgnCv进行轮廓寻找和计算物体凸包
  5. 【JAVA】LOG4J使用心得
  6. 菜鸟学习Andriod-弹窗
  7. UI学习笔记---第十四天数据持久化
  8. .Net程序员学习Linux(一)
  9. Day1 - Python基础1 介绍、基本语法、流程控制
  10. JMS 问题java.lang.NoClassDefFoundError: weblogic/security/acl/UserInfo
  11. Delphi 数据转换
  12. 第 9 章 数据管理 - 076 - 使用 Rex-Ray volume
  13. 简单gitblit与Jenkins结合,持续集成
  14. Advertising.csv
  15. python pytz时区设置模块
  16. Centos6.8下编译安装LAMP的操作记录梳理
  17. cJSON学习笔记 续集
  18. 百度Web Uploader组件实现文件上传(一)
  19. linux命令学习——file
  20. 忽略Git仓库中已经存在的文件

热门文章

  1. 网络编程 - join及守护线程
  2. [BOI2008]Elect 选举
  3. 关于ISIS协议 CSNP报文的周期更新理解
  4. vue-cli npm install 失败
  5. odoo domain详解
  6. 《AlwaysRun!》第八次团队作业:Alpha冲刺 第一天
  7. 《阿里巴巴Java开发手册》更新为《Java开发手册》
  8. 【02】Node.js 安装配置(OK)
  9. codevs1018 单词接龙
  10. 用API中的raf复制文件图片等及系统找不到指定的文件的解决办法