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