AD9854 MSP430 代码总结
//==============================================================
#include <msp430x14x.h>
#include <INTRINSICS.h>
#include "Config.h" //配置头文件,与硬件相关的配置在这里更改
//============================================================================
//单片机和AD9854硬件接口定义
#define DDS_WR_H P1OUT|=BIT0 //(WR) 写使能信号 P1.0输出置高
#define DDS_WR_L P1OUT &= ~BIT0 //(WR) 写使能信号 P1.0输出置低
#define DDS_RD_H P1OUT|=BIT1 //(RD) 读使能信号 P1.2输出置高
#define DDS_RD_L P1OUT &= ~BIT1 //(RD) 读使能信号 P1.2输出置低
#define DDS_RST_H P1OUT|=BIT2 //(RST)复位信号 P1.3输出置高
#define DDS_RST_L P1OUT &= ~BIT2 //(RST)复位信号 P1.3输出置低
#define DDS_UPD_H P1OUT|=BIT3 //(UPD)频率控制字更新信号 P1.1输出置高
#define DDS_UPD_L P1OUT &= ~BIT3 //(UPD)频率控制字更新信号 P1.1输出置低
/******SP串并行 接VCC 用并行模式*******/
#define DDS_FSK_H P1OUT |= BIT5 //fsk
#define DDS_FSK_L P1OUT &= ~BIT5
#define DDS_ADDR_PORT P3OUT //地址口 A0~A5为AD9854地址线 P3
#define DDS_DATA_PORT P5OUT //数据口 DB0~DB7为AD9854数据线 P5
unsigned char FreqWord[6]; //6个字节频率控制字
const ulong Freq_mult_ulong=938249; // 2^48/300000000 整数
const double Freq_mult_doulle=938249.922; //带有小数点
/********************************************************************
初始化IO口子程序
********************************************************************/
void Port_Init()
{
P1SEL = 0x00; //设置IO口为普通I/O模式
P1DIR = 0xff; //IO口方向为输出
P1OUT = 0x00; //初始设置 输出为0
P3SEL = 0x00; //设置IO口为普通I/O模式
P3DIR|= 0xff; //P3^0~P3^5为AD9854地址线 设置为输出
P3OUT = 0x00; //初始设置为00
P5SEL = 0x00; //设置IO口为普通I/O模式
P5DIR = 0xff; //设置IO口方向为输出
P5OUT = 0x00; //初始设置为00
}
/**************************************************************************
* 函数名 :WriteByte
* 描述 : 子函数,从AD9854中写1个字节
* 输入 : strAddr strByte
* 输出 : 无
* 返回值 : 无
* 说明 : 无
**************************************************************************/
void WriteByte(unsigned char strAddr , unsigned char strByte)
{
unsigned char port ; //定义一个8位无符号变量 port
DDS_DATA_PORT = strByte ; //将strByte赋值给P4口
port = DDS_ADDR_PORT ; //将P4口数据赋值给port
port = (port & 0xc0) + strAddr ; //port最高位与次高位不变与strAddr相加
DDS_ADDR_PORT = port ; //将port数据赋值给P4口
DDS_WR_L ; //数据在上升沿锁存
DDS_WR_H ;
}
/**************************************************************************
* 函数名 :ReadByte
* 描述 : 子函数,从AD9854中读取1个字节
* 输入 : strAddr
* 输出 : result
* 返回值 : 0 或 strAddr
* 说明 : 无
*************************************************************************
unsigned char ReadByte(unsigned char strAddr)
{
unsigned char result = 0;
DDS_RD_H; //读使能信号为1
DDS_ADDR_PORT = strAddr; // 将strAddr赋值给P4口
DDS_RD_L; //读使能信号为0
result = DDS_DATA_PORT; //P0口赋值给result
DDS_RD_H; //读使能信号为1
return result; //返回 result的值
}
/**************************************************************************
* 函数名 :Freq_convert
* 描述 : 子函数,频率寄存器1控制字
* 输入 : 无符号字符指针freq的值
* 输出 : 无
* 返回值 : 无
* 说明 : 该算法为多字节相乘算法,公式FTW=(Desired Output Frequency *2N)/SYSCLK
其中N=48,Desird Output Frequency为所需的频率,即Freq,SYSCLK为可编程的系统时钟
FTW为48Bit的频率控制字,即FreqWord[6]
**************************************************************************/
void Freq_convert(long Freq)
{
ulong FreqBuf;
ulong Temp=Freq_mult_ulong;
uchar Array_Freq[4]; //将输入频率因子分为四个字节
Array_Freq[0]=(uchar)Freq;
Array_Freq[1]=(uchar)(Freq>>8);
Array_Freq[2]=(uchar)(Freq>>16);
Array_Freq[3]=(uchar)(Freq>>24);
FreqBuf=Temp*Array_Freq[0];
FreqWord[0]=FreqBuf;
FreqBuf>>=8;
FreqBuf+=(Temp*Array_Freq[1]);
FreqWord[1]=FreqBuf;
FreqBuf>>=8;
FreqBuf+=(Temp*Array_Freq[2]);
FreqWord[2]=FreqBuf;
FreqBuf>>=8;
FreqBuf+=(Temp*Array_Freq[3]);
FreqWord[3]=FreqBuf;
FreqBuf>>=8;
FreqWord[4]=FreqBuf;
FreqWord[5]=FreqBuf>>8;
}
/**************************************************************************
* 函数名 :AD9854_SetDFW
* 描述 : 子函数,频率步进量设置
* 输入 : 无符号字符指针delta的值
* 输出 : 无
* 返回值 : 无
* 说明 : 无
**************************************************************************/
void AD9854_SetDFW(unsigned char *delta)
{
unsigned char i = 0 ;
unsigned char delta_addr = 0 ;
delta_addr = 0x10 ; //48位频率步进量最高位起始地址为 0x10
for( i = 0 ; i < 6 ; i ++ )
{
WriteByte( delta_addr + i , delta[i]);
}
}
/*******************************************************************************
* 函数名 : AD9854_SetUDClk
* 描述 : 子函数,内部时钟寄存器控制字设置
* 输入 : 无符号字符指针uclk的值
* 输出 : 无
* 返回值 : 无
* 说明 : 无
*******************************************************************************/
void AD9854_SetUDClk(unsigned char *uclk)
{
unsigned char i ;
unsigned char uclk_addr = 0 ;
uclk_addr = 0x16 ; //32位更新时钟计数器最高位地址为0x16
for( i = 0 ; i < 4 ; i ++ )
{
WriteByte(uclk_addr + i , uclk[i]);
}
}
/*******************************************************************************
* 函数名 :AD9854_SetSpecialWord
* 描述 : 子函数,设置32位特殊功能寄存器
* 输入 : 无符号字符指针SWord的值 以0x1D为首地址 陆续赋值 写入数据
* 输出 : 无
* 返回值 : 无
* 说明 : 节电控制为0x00, 时钟倍频控制为0x46, 清零控制为0x25, 传输控制模式为0x10
*******************************************************************************/
void AD9854_SetSpecialWord(unsigned char *SWord)
{
unsigned char i ;
unsigned char Special_addr = 0;
Special_addr = 0x1D; //特殊功能寄存器首地址 0x1D
for( i = 0 ; i < 4 ; i ++ )
{
WriteByte( Special_addr + i , SWord[i]);
}
}
/*******************************************************************************
* 函数名 :AD9854_SetOutkeyQ
* 描述 : 子函数,8位输出边沿变化率控制字
* 输入 : 无符号字符 Key_ramp
* 输出 : 无
* 返回值 : 无
* 说明 : 无
*******************************************************************************/
void AD9854_SetOutkeyRamp(unsigned char Key_ramp)
{
WriteByte(0x25, Key_ramp); //8位输出边沿变化率最高位位0x25
}
/*******************************************************************************
* 函数名 :AD9854_SetQDAC
* 描述 : 子函数,12位Q通道DAC输入控制字
* 输入 : 无符号字符指针QDAC的值
* 输出 : 无
* 返回值 : 无
* 说明 : 无
*******************************************************************************/
void AD9854_SetQDAC(unsigned char *QDAC)
{
WriteByte(0x26 , QDAC[0]);
WriteByte(0x27 , QDAC[1]);
}
/**************************************************************************
* 函数名 : AD9854_Reset
* 描述 : 子函数,硬件复位
* 输入 : 无
* 输出 : 无
* 返回值 : 无
* 说明 : 无
**************************************************************************/
void AD9854_Reset(void)
{
DDS_RST_H;
delay_us(10);
DDS_RST_L;
}
/**************************************************************************
* 函数名 :Single_Mode_init
* 描述 : 子函数,AD9854初始化
* 输入 : 无
* 输出 : 无
* 返回值 : 无
* 说明 : 1.复位芯片 2.选择数据输入方式 3.选择数据刷新方式为外部触发方式
*******************************************************************************/
void Single_Mode_init(void)
{
unsigned char mode1[4]={0x10,0x4a,0x00,0x60}; //特殊功能寄存器设置 power down所有模块, PLL大于200MHz 旁路PLL,7倍频,
DDS_WR_H ; //读写端口设置为无效
DDS_RD_H;
DDS_UPD_L ;
AD9854_Reset(); //复位信号
AD9854_SetSpecialWord(mode1);
DDS_UPD_H ;
DDS_UPD_L ;
}
//====================================================================================
//函数名称:void AD9854_SetSine(ulong Freq,uint Shape)
//函数功能:AD9854正弦波产生程序
//入口参数:Freq 频率设置,取值范围为0~(1/2)*SYSCLK
// Shape 幅度设置. 为12 Bit,取值范围为(0~4095) ,取值越大,幅度越大
//出口参数:无
//====================================================================================
void Single_Mode(ulong Freq,uint Shape)
{
uchar count;
uchar Adress;
Adress = 0x04; //选择频率控制字地址的初值
Freq_convert(Freq); //频率转换
for(count=6;count>0;) //写入6字节的频率控制字
{
WriteByte(Adress++,FreqWord[--count]);
}
WriteByte(0x21,Shape>>8); //设置I通道幅度
WriteByte(0x22,(uchar)(Shape&0xff));
WriteByte(0x23,Shape>>8); //设置Q通道幅度
WriteByte(0x24,(uchar)(Shape&0xff));
DDS_UPD_H ;
DDS_UPD_L ;
}
/**************************************************************************
* 函数名 :TRIANGLE_MODE_init
* 描述 : 子函数,AD9854初始化
* 输入 : 无
* 输出 : 无
* 返回值 : 无
* 说明 : 1.复位芯片 2.选择数据输入方式 3.选择数据刷新方式为外部触发方式
*******************************************************************************/
void TRIANGLE_MODE_init(void)
{
unsigned char mode1[4]={0x10,0x4a,0x24,0x60}; //特殊功能寄存器设置 power down所有模块, PLL大于200MHz 旁路PLL,7倍频,
DDS_WR_H ; //读写端口设置为无效
DDS_RD_H;
DDS_UPD_L ;
AD9854_Reset(); //复位信号
AD9854_SetSpecialWord(mode1);
DDS_UPD_H ;
DDS_UPD_L ;
}
//================================================================
// 扫频功能
//================================================================
void TRIANGLE_MODE(ulong Freq_Low,ulong Freq_High,ulong Freq_Up_Down,ulong FreRate)
{
uchar count=6;
uchar Adress1,Adress2,Adress3;
const uint Shape=4000; //幅度设置. 为12 Bit,取值范围为(0~4095)
Adress1=0x04; //选择频率控制字地址的初值
Adress2=0x0a;
Adress3=0x10;
Freq_convert(Freq_Low); //频率1转换
for(count=6;count>0;) //写入6字节的频率控制字
{
WriteByte(Adress1++,FreqWord[--count]);
}
Freq_convert(Freq_High); //频率2转换
for(count=6;count>0;) //写入6字节的频率控制字
{
WriteByte(Adress2++,FreqWord[--count]);
}
Freq_convert(Freq_Up_Down); //步进频率转换
for(count=6;count>0;) //写入6字节的频率控制字
{
WriteByte(Adress3++,FreqWord[--count]);
}
WriteByte(0x1a,(uchar)((FreRate>>16)&0x0f)); //设置斜升速率
WriteByte(0x1b,(uchar)(FreRate>>8));
WriteByte(0x1c,(uchar)FreRate);
WriteByte(0x21,Shape>>8); //设置I通道幅度
WriteByte(0x22,(uchar)(Shape&0xff));
WriteByte(0x23,Shape>>8); //设置Q通道幅度
WriteByte(0x24,(uchar)(Shape&0xff));
DDS_UPD_H ;
DDS_UPD_L ; //更新AD9854输出
}
//================================================================
// 主函数
//================================================================
void main(void)
{
unsigned char udclk[4]={0x00,0xff,0xff,0xff}; //32位更新时钟寄存器
WDT_Init(); //看门狗设置
Clock_Init(); //系统时钟设置
Port_Init();
//AD9854_SetUDClk(udclk); //延长内部刷新时间
/*Single_Mode_init();
Single_Mode(2000000,4000);*/
TRIANGLE_MODE_init();
TRIANGLE_MODE(9000000,15000000,100,30000);
while(1)
{
DDS_FSK_H;
delay_ms(90); //延时时间长,便于观察
DDS_FSK_L;
delay_ms(90);
}
}
AD9854 MSP430 代码总结相关推荐
- Proteus中MSP430与SHT11的IIC通信问题
调了两天,MSP430始终接收不到数据,一直以为是代码的问题,今天无意中看到别人的一片文章,才发现问题出在上拉电阻上.DATA线的上拉电阻不能太大,10k不行,换成了1k就没问题了.mark一下,顺便 ...
- 数字合成器AD9854的使用
在今年暑假准备电赛时接触到了AD9854模块,当时也是花了差不多两天时间才把这个玩意儿琢磨出来,现在写一篇博客来记录一下该模块的使用,或许能给才接触这个模块的小伙伴一些帮助. 本文章是基于官方驱动代码 ...
- MPU6050陀螺仪采集各个角度显示在OLED上
MPU6050 文章目录 MPU6050 前言 一.方法 二.现象 陀螺仪 前言 使用陀螺仪的时候常常会出现初始化不成功的现象 1.I2C通信不正常,检查SDA_IN()和SDA_OUT()是否正确, ...
- MAX262使用说明
1.概述 利用开关电容滤波原理,可以搭建LP/HP/BP/NO滤波器. 内部含有两个相同的滤波单元A/B,每个单元是两节滤波,故一片MAX262可以构成4阶滤波器. 使用时要用到四个参数:中心频率f0 ...
- 隐私合规:收集SDK部分介绍
com.meizu.cloud.pushsdk.SystemReceiver 魅族推送服务是由魅族公司为开发者提供的消息推送服务,开发者可以向集成了魅族 push SDK 的客户端实时地推送通知或者消 ...
- msp430 c语言开发环境,如何使用C语言来编写MSP430的高质量代码
微处理器一般用于特定环境和特定用途,出于成本.功耗和体积的考虑,一般都要求尽量节省使用资源,并且,由于微处理器硬件一般都不支持有符号数.浮点数的运算,且运算位有限,因此,分配变量时必须仔细.另外要说明 ...
- ADS1118的MSP430驱动代码,非常方便移植
/*注意事项,测试使用的是ADS1118的模拟输入三口,AIN3,差分的时候,AIN3作为P,N是设置为GND,get_Voltgage函数是在这个条件下,可以测试-4.096~+4.096V的电压, ...
- MSP430低功耗模式-while循环失效
如下代码实现MSP430G2553单片机两个led交替闪烁 #include <msp430.h> /*** main.c*/ int main(void) {WDTCTL = WDTPW ...
- MSP430常见问题之FLASH存储类
Q1:用IAR Embedded Workbench for MSP430 通过JTAG往MSP430上写程序.为了知道片内程序的版本,必须读出Flash 中内容.什么工具软件可以通过JTAG口实现这 ...
- TCP/IP协议栈在MSP430单片机上的实现
引言 随着信息技术的不断发展,以及人们对日常生活舒适度.方便度要求的提高,信息家电.智能仪表等产品越来越频繁的出现在我们的生活当中:人们也越来越热衷于把家电.仪表等设备连接到Internet 中,从而 ...
最新文章
- 项目中遇到的问题—遍历对象里面的数组
- 解决同一页面中两个iframe互相调用jquery,js函数
- Zimbra高级应用之-双向证书认证(一)
- php yii框架路由,yii框架路由配置
- Fast-SCNN:多分支结构共享低级特征的语义分割网络
- devc++鼠标变成了光标_游戏鼠标选购避坑指南 教你如何轻松选择适合自己的鼠标...
- python经典书籍推荐-7本经典的Python书籍,你都读过了么?
- Python爬虫(第九周)
- windows10系统超全面优化攻略
- 现在的BAT,就是曾经的外企
- 删除文件时提示需要administrator 权限
- 一名程序员的内心独白:我很忙,但我的代码还是很糟糕
- windows server2008 部署项目环境总结
- Milestone 系统架构 及产品白皮书
- CA 认证过程及 https 实现方法
- [经验] PROTEUS仿真学习笔记05 (SPI 协议 外设)——2014_7_15
- 加油站收银软件提高油站运营管理效率?
- 财政预算绩效优秀案例
- ImageJ如何测量物体的面积大小
- cannot import watershed from skimage.morphology
热门文章
- PyCharm控制台Problems提示:Typo: In word ‘___‘
- 关于百度 OpenRASP 的个人拙见
- 2020计算机考研英语国家线,2020考研英语国家分数线?
- IOS开发之——TOM猫(19)
- mysql中字符串汇总_Mysql中常见字符串处理函数汇总
- mysql routines是什么_MySQL入门:Stored Routines 的变数与流程 - Break易站
- java web 图片 加载_Java web开发中加载图片路径的两种方式
- 微信小程序--图片相关问题合辑
- vue项目中对于Scroll事件的节流优化
- CF1428 G1,G2 . Lucky Numbers题解