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即可!
随机推荐
- Microsoft SQL Server 存储过程
Microsoft SQL Server 存储过程 TRIGGER DDL触发器:主要用于防止对数据库架构.视图.表.存储过程等进行的某些修改:DDL事件是指对数据库CREATE,ALTER,DROP ...
- vue-quill-editor + element-ui upload实现富文本图片上传
代码贴上 <template> <div class="quill-editor-example"> <div class="box&quo ...
- case when里的like功能 ////// 截取(substr)
case when里的like功能 假如要用到case when又要用到like这样的功能,即如果字符串包含‘语文’就怎么怎么样,包含‘数学’就怎么怎么样,包含‘英语’就怎么怎么样,like是用于wh ...
- C++ Error C2662 cannot convert 'this' pointer from 'const *'
---恢复内容开始--- 这个错误在于一点:常量对象只能调用常量成员(函数\变量),不能调用非常量成员.另一方面,非常量对象,既可以调用常量成员,又可以调用非常量成员. class A { publi ...
- NOIP 2018 真・退役记
目录 NOIp 2018 真・退役记 7.01 7.05 \(summary\) 7.12 7.18 7.26 - 7.27 8.2 8.3 8.3 8.7 8.9 8.20 8.24 8.27 8. ...
- [luogu3067 USACO12OPEN] 平衡的奶牛群
传送门 Solution 折半搜索模板题 考虑枚举每个点在左集合和右集合或者不在集合中,然后排序合并即可 Code //By Menteur_Hxy #include <cmath> #i ...
- CCF201703-2 学生排队 java(100分)
试题编号: 201703-2 试题名称: 学生排队 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 体育老师小明要将自己班上的学生按顺序排队.他首先让学生按学号从小到大的顺序排 ...
- js之循环语句
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Mongodb学习总结(2)——MongoDB与MySQL区别及其使用场景对比
对于只有SQL背景的人来说,想要深入研究NoSQL似乎是一个艰巨的任务,MySQL与MongoDB都是开源常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数 ...
- SQL 快速参考-----http://www.runoob.com/sql/sql-quickref.html
http://www.runoob.com/sql/sql-quickref.html SQL 快速参考