1
+ #include " DDSUnit.h"
2
+
3
+ void DDSUnit::writeDDSReg (uint8_t addr, uint8_t data)
4
+ {
5
+ // Serial.printf("ADDR:%02X,DATA:%02X\r\n",addr,data);
6
+ _pwire->beginTransmission (DDS_UNIT_I2CADDR);
7
+ _pwire->write (addr);
8
+ _pwire->write (data);
9
+ _pwire->endTransmission ();
10
+ }
11
+
12
+ void DDSUnit::writeDDSReg (uint8_t addr, uint8_t * data, size_t size )
13
+ {
14
+ _pwire->beginTransmission (DDS_UNIT_I2CADDR);
15
+ _pwire->write (addr);
16
+ for (size_t i = 0 ; i < size; i++)
17
+ {
18
+ _pwire->write (data[i]);
19
+ }
20
+ _pwire->endTransmission ();
21
+ }
22
+
23
+ uint8_t DDSUnit::readDDSReg (uint8_t addr)
24
+ {
25
+ uint8_t data;
26
+ _pwire->beginTransmission (DDS_UNIT_I2CADDR);
27
+ _pwire->write (addr);
28
+ _pwire->endTransmission ();
29
+ _pwire->requestFrom (DDS_UNIT_I2CADDR, 1 );
30
+ data = _pwire->read ();
31
+ _pwire->endTransmission ();
32
+
33
+ return data;
34
+ }
35
+
36
+ void DDSUnit::readDDSRegs (uint8_t addr,uint8_t * dataptr,uint8_t size)
37
+ {
38
+ _pwire->beginTransmission (DDS_UNIT_I2CADDR);
39
+ _pwire->write (addr);
40
+ _pwire->endTransmission ();
41
+ _pwire->requestFrom (DDS_UNIT_I2CADDR, (int )size);
42
+ for (int i = 0 ; i < 6 ; i++)
43
+ {
44
+ dataptr[i] = _pwire->read ();
45
+ }
46
+ _pwire->endTransmission ();
47
+ }
48
+
49
+ int DDSUnit::begin ( TwoWire *p )
50
+ {
51
+ _pwire = p;
52
+
53
+ char snStr[7 ];
54
+ memset (snStr,0 ,sizeof (char )*7 );
55
+ readDDSRegs (DDS_DESC_ADDR,(uint8_t *)snStr,6 );
56
+
57
+ String desc (snStr);
58
+
59
+ Serial.printf (" sn:%s\r\n " ,snStr);
60
+
61
+ return ( desc == String (" ad9833" )) ? 0 : -1 ;
62
+ }
63
+
64
+ void DDSUnit::setFreq ( uint8_t reg ,uint64_t freq )
65
+ {
66
+ freq = freq * 268435456 / DDS_FMCLK;
67
+
68
+ uint8_t sendbuff[4 ] = {0 ,0 ,0 ,0 };
69
+ sendbuff[0 ] |= ((( freq >> 24 ) & 0xff ) | ( reg == 1 ) ? 0xC0 : 0x80 );
70
+ sendbuff[1 ] |= (( freq >> 16 ) & 0xff );
71
+ sendbuff[2 ] |= (( freq >> 8 ) & 0xff );
72
+ sendbuff[3 ] |= ( freq & 0xff );
73
+ writeDDSReg (DDS_FREQ_ADDR,sendbuff,4 );
74
+ }
75
+
76
+ void DDSUnit::setPhase ( uint8_t reg ,uint32_t phase )
77
+ {
78
+ uint8_t sendbuff[2 ] = {0 ,0 };
79
+ phase = phase * 2048 / 360 ;
80
+ sendbuff[0 ] |= ((( phase >> 8 ) & 0xff ) | (( reg == 1 ) ? 0xC0 : 0x80 ));
81
+ sendbuff[1 ] |= ( phase & 0xff );
82
+
83
+ // Serial.printf("%02X %02X",sendbuff[0],sendbuff[1]);
84
+ writeDDSReg (DDS_PHASE_ADDR,sendbuff,2 );
85
+ }
86
+
87
+ void DDSUnit::setFreqAndPhase ( uint8_t freg, uint64_t freq, uint8_t preg, uint32_t phase )
88
+ {
89
+ uint8_t sendbuff[6 ] = {0 ,0 ,0 ,0 ,0 ,0 };
90
+
91
+ freq = freq * 268435456 / DDS_FMCLK;
92
+ sendbuff[0 ] |= ((( freq >> 24 ) & 0xff ) | ( freg == 1 ) ? 0xC0 : 0x80 );
93
+ sendbuff[1 ] |= (( freq >> 16 ) & 0xff );
94
+ sendbuff[2 ] |= (( freq >> 8 ) & 0xff );
95
+ sendbuff[3 ] |= ( freq & 0xff );
96
+
97
+ phase = phase * 2048 / 360 ;
98
+ sendbuff[4 ] |= ((( phase >> 8 ) & 0xff ) | (( preg == 1 ) ? 0xC0 : 0x80 ));
99
+ sendbuff[5 ] |= ( phase & 0xff );
100
+
101
+ writeDDSReg (DDS_FREQ_ADDR,sendbuff,6 );
102
+ }
103
+
104
+ void DDSUnit::setMode ( DDSmode mode )
105
+ {
106
+ writeDDSReg (DDS_MODE_ADDE,0x80 | mode );
107
+ }
108
+
109
+ void DDSUnit::setCTRL (uint8_t ctrlbyte)
110
+ {
111
+ writeDDSReg (DDS_CTRL_ADDR,0x80 | ctrlbyte );
112
+ }
113
+
114
+ void DDSUnit::selectFreqReg ( uint8_t num )
115
+ {
116
+ uint8_t reg = readDDSReg (DDS_CTRL_ADDR);
117
+ reg &= (~0x40 );
118
+ writeDDSReg (DDS_CTRL_ADDR,reg | 0x80 | ( num == 1 ) ? 0x40 : 0 );
119
+ }
120
+
121
+ void DDSUnit::selectPhaseReg ( uint8_t num )
122
+ {
123
+ uint8_t reg = readDDSReg (DDS_CTRL_ADDR);
124
+ reg &= (~0x20 );
125
+ writeDDSReg (DDS_CTRL_ADDR, reg | 0x80 | ( num == 1 ) ? 0x20 : 0 );
126
+ }
127
+
128
+ void DDSUnit::quickOUT (DDSmode mode, uint64_t freq, uint32_t phase)
129
+ {
130
+ if ( mode <= kSQUAREMode )
131
+ {
132
+ setFreqAndPhase (0 ,freq,0 ,phase);
133
+ }
134
+ writeDDSReg ( 0x20 ,0x80 | mode );
135
+ writeDDSReg ( 0x21 ,0x80 );
136
+ }
137
+
138
+ void DDSUnit::OUT ( uint8_t freqnum,uint8_t phasenum )
139
+ {
140
+ uint8_t reg = readDDSReg (DDS_CTRL_ADDR);
141
+ reg &= (~0x60 );
142
+ writeDDSReg (DDS_CTRL_ADDR, reg | 0x80 | (( freqnum == 1 ) ? 0x40 : 0 ) | (( phasenum == 1 ) ? 0x20 : 0 ));
143
+ }
144
+
145
+ void DDSUnit::setSleep (uint8_t level)
146
+ {
147
+ uint8_t reg = readDDSReg (DDS_CTRL_ADDR);
148
+ reg &= (~0x18 );
149
+ reg |= ( level == 1 ) ? 0x10 : 0 ;
150
+ reg |= ( level == 2 ) ? 0x08 : 0 ;
151
+ writeDDSReg ( DDS_CTRL_ADDR, 0x80 | reg );
152
+ }
153
+
154
+ void DDSUnit::reset ()
155
+ {
156
+ writeDDSReg (DDS_CTRL_ADDR,0x80 | 0x04 );
157
+ }
0 commit comments