AD9850驱动程序--MSP430版本
前段时间忙着画板子搞运放搞滤波了,程序更新的少,发现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)
个人感受:方便,简单嘿嘿
AD9850驱动程序--MSP430版本的更多相关文章
- 无法获得VMCI 驱动程序的版本: 句柄无效。
写在前面 最近在电脑上安装了VMware虚拟机,在安装系统的使用,总提示错误“无法获得VMCI 驱动程序的版本: 句柄无效.”.最近刚买的电脑,也不会是系统的问题吧,为了装个虚机,总不能重装系统吧,没 ...
- Vmware error:无法获得 VMCI 驱动程序的版本: 句柄无效。
error:无法获得 VMCI 驱动程序的版本: 句柄无效.驱动程序“vmci.sys”的版本不正确.请尝试重新安装 VMware Workstation.开启模块 DevicePowerOn 的操作 ...
- VMware问题--无法获得 VMCI 驱动程序的版本: 句柄无效
关于VMware问题:无法获得 VMCI 驱动程序的版本: 句柄无效.驱动程序“vmci.sys”的版本不正确 问题截图: 解决 1.根据配置文件路径找到对应的.vmx文件: 2.用编辑器打开,找到v ...
- 无法获得VMCI驱动程序的版本:句柄无效 (亲测有效! )
今天在学习Linux 的时候 启动VM时出现了这个问题, 搞了很久终于弄好了, 就写篇博客来记录一下,帮助一下大家,如果对大家有帮助,还请各位哥哥姐姐点个关注,你的支持就是我坚持下去的动力 ! 文章目 ...
- 无法获得VMCI驱动程序的版本:句柄无效
解决方法: 查找到 vmci0.present="TRUE" 代码,将TRUE更改为FALSE保存即可
- 启动vmware虚拟机报错:“无法获得VMCI驱动程序的版本:句柄无效”
启动vmware虚拟机的时候报错: 找到对应虚拟机的文件夹路径: 用记事本打开CentOS 64位.vmx,找到这么一行: vmci0.present = "TRUE" 把TRUE ...
- 无法获得VMCI 驱动程序的版本: 句柄无效的解决方法
关闭虚拟机,找到安装路径,用记事本打开.vmx结尾的文件 将vmci0.present = "TRUE"改为vmci0.present = "FALSE"保存
- 打开虚拟机提示 无法获得vmci 驱动程序的版本:句柄无效
我从另一台电脑复制过来虚拟机,提示如题. 找到 我的虚拟机的 *.vmx文件(如NeoKylin.vmx),其中有 vmci0.present = "TRUE",将TRUE改为 ...
- 关于VMware问题:无法获得 VMCI 驱动程序的版本: 句柄无效。驱动程序“vmci.sys”的版本不正确
有的童鞋可能安装虚拟机时出现了下边这样的错误,莫慌,下面咋们来解决!!! 1.首先,找到你的安装虚拟机的目录下有一个.vmx的文件 找到这个文件,用编辑器打开,将该值改为FALSE即可!
随机推荐
- Extjs选中多行Grid提交
要实现的效果如图:可以选择多行grid然后提交给后台 1,Extjs中grid如何可以选择多行? 定义一个grid,将色了Type设置为多选即可 selType: 'checkboxmodel', 2 ...
- Flask保存或解压上传的文件
import os import uuid import shutil import zipfile from flask import Flask, render_template, request ...
- 日常操作之如何打开windows注册表
1.打开注册表:第一步按“win+R”或者点击开始菜单,找到运行,在运行输入框里面输入“regedit”.
- Python数据分析与展示(1)-数据分析之表示(2)-NumPy数据存取与函数
NumPy数据存取与函数 数据的CSV文件存取 CSV文件 CSV(Comma-Separated Value,逗号分隔值) CSV是一种常见的文件格式,用来存储批量数据. 将数据写入CSV文件 np ...
- Python-函数和代码复用
函数的定义与使用 >函数的理解与定义 函数是一段代码的表示 -函数是一段具有特定功能的.可重用的语句组 -函数是一种功能的抽象,一般函数表达特定功能 -两个作用:降低编程难度 和 代码复用 de ...
- 在vue项目中使用stylus来实现移动端的1px
1.目录结构(vue项目,但是并不局限于vue) 2.首先定义一个mixin.styl文件 border-1px($color) position: relative &:after disp ...
- FJoi2017 1月20日模拟赛 交错和(等差数列+rmq)
[题目描述] 无限循环数字串S由长度为n的循环节s构成.设s为12345(n=5),则数字串S为123451234512345… 设Si为S的第i位数字,在上面的例子中,S1=1,S2=2,S6=1. ...
- mybatis写当天 当月的数据 时间段数据https://www.cnblogs.com/xzjf/p/7600533.html
mybatis写当天 当月的数据 时间段数据----https://www.cnblogs.com/xzjf/p/7600533.html
- BNUOJ 13358 Binary Apple Tree
Binary Apple Tree Time Limit: 1000ms Memory Limit: 16384KB This problem will be judged on Ural. Orig ...
- nyoj 95 众数问题(set)
众数问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 所谓众数,就是对于给定的含有N个元素的多重集合,每个元素在S中出现次数最多的成为该元素的重数, 多重集合S重 ...