AD9850驱动程序--MSP430版本
2024-09-05 07:11:59
前段时间忙着画板子搞运放搞滤波了,程序更新的少,发现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)
个人感受:方便,简单嘿嘿
最新文章
- [LeetCode] Word Search II 词语搜索之二
- 嵌入式linux下如何尽快播放开机音乐
- 使用 lsyncd 本地目录实时备份
- EmgnCv进行轮廓寻找和计算物体凸包
- 【JAVA】LOG4J使用心得
- 菜鸟学习Andriod-弹窗
- UI学习笔记---第十四天数据持久化
- .Net程序员学习Linux(一)
- Day1 - Python基础1 介绍、基本语法、流程控制
- JMS 问题java.lang.NoClassDefFoundError: weblogic/security/acl/UserInfo
- Delphi 数据转换
- 第 9 章 数据管理 - 076 - 使用 Rex-Ray volume
- 简单gitblit与Jenkins结合,持续集成
- Advertising.csv
- python pytz时区设置模块
- Centos6.8下编译安装LAMP的操作记录梳理
- cJSON学习笔记 续集
- 百度Web Uploader组件实现文件上传(一)
- linux命令学习——file
- 忽略Git仓库中已经存在的文件