通过gpio口串行配置a9850的信号输出频率

ad9850_wr_serial(w0写入数据, 频率(HZ));

调用格式:

1
2
ad9850_init_serial();
ad9850_wr_serial(0x00, 10000000.0); // 设为10MHz

a9850.h

1
2
3
4
5
6
7
8
9
10

#ifndef __AD9850_H__
#define __AD9850_H__

#include "headfile.h"
void ad9850_init_serial(void);
void ad9850_wr_serial(unsigned char w0, const double frequence);

#endif

a9850.C

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92

#include "ti_msp_dl_config.h"
#include "ad9850.h"
#include <stdio.h>


#define ad9850_w_clk(bit) ((bit) == 0 ? DL_GPIO_clearPins(GPIOA, GPIO_AD9850_PIN_W_CLK_PIN) : DL_GPIO_setPins(GPIOA, GPIO_AD9850_PIN_W_CLK_PIN) )
#define ad9850_fq_ud(bit) ((bit) == 0 ? DL_GPIO_clearPins(GPIOB, GPIO_AD9850_PIN_FQ_UD_PIN) : DL_GPIO_setPins(GPIOB, GPIO_AD9850_PIN_FQ_UD_PIN) )
#define ad9850_rest(bit) ((bit) == 0 ? DL_GPIO_clearPins(GPIOA, GPIO_AD9850_PIN_REST_PIN) : DL_GPIO_setPins(GPIOA, GPIO_AD9850_PIN_REST_PIN) )
#define ad9850_bit_data(bit) ((bit) == 0 ? DL_GPIO_clearPins(GPIOA, GPIO_AD9850_PIN_BIT_DATA_PIN) : DL_GPIO_setPins(GPIOA, GPIO_AD9850_PIN_BIT_DATA_PIN) )

// 串行初始化
void ad9850_init_serial(void) {
ad9850_w_clk(0);
ad9850_fq_ud(0);

//rest信号
ad9850_rest(0);
ad9850_rest(1);
ad9850_rest(0);

//w_clk信号
ad9850_w_clk(0);
ad9850_w_clk(1);
ad9850_w_clk(0);

//fq_up信号
ad9850_fq_ud(0);
ad9850_fq_ud(1);
ad9850_fq_ud(0);
}

//***************************************************//
// 向ad9850中写命令与数据(串口) //
//---------------------------------------------------//
void ad9850_wr_serial(unsigned char w0, const double frequence) {
unsigned char i = 0, w = 0;
long long y = 0;
long double x = 0.0f;
//计算频率的HEX值
x = 4294967295.0/125.0;//适合125M晶振
long double freq = frequence;
freq = freq / 1000000.0 * x;
y = freq;
//写w4数据
w=(y>>=0);
for(i=0;i<8;i++) {
uint8_t data = (w>>i)&0x01;
ad9850_bit_data(data);
ad9850_w_clk(1);
ad9850_w_clk(0);
}
//写w3数据
w=(y>>8);
for(i=0;i<8;i++) {
uint8_t data = (w>>i)&0x01;
ad9850_bit_data(data);
ad9850_w_clk(1);
ad9850_w_clk(0);
}
//写w2数据
w=(y>>16);
for(i=0;i<8;i++) {
uint8_t data = (w>>i)&0x01;
ad9850_bit_data(data);
ad9850_w_clk(1);
ad9850_w_clk(0);
}
//写w1数据
w=(y>>24);
for(i=0;i<8;i++) {
uint8_t data = (w>>i)&0x01;
ad9850_bit_data(data);
ad9850_w_clk(1);
ad9850_w_clk(0);

}
//写w0数据
w=w0;
for(i=0;i<8;i++) {
uint8_t data = (w>>i)&0x01;
ad9850_bit_data(data);
ad9850_w_clk(1);
ad9850_w_clk(0);

}
//移入始能
ad9850_fq_ud(1);
ad9850_fq_ud(0);

}