DDS AD9854, library to configure a AD9854 Serial Interface (SPI)

Dependents:   JRO_DDSv2 JRO_DDSv2_rev2019

Committer:
miguelcordero191
Date:
Tue Feb 24 20:08:13 2015 +0000
Revision:
0:156a9e15919e
Child:
1:d81fca2297fb
DDS AD9854. Library to configure a AD9854.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
miguelcordero191 0:156a9e15919e 1 #include "AD9854.h"
miguelcordero191 0:156a9e15919e 2
miguelcordero191 0:156a9e15919e 3 static char controlRegister[4];
miguelcordero191 0:156a9e15919e 4 static char read_spi_data[6];
miguelcordero191 0:156a9e15919e 5
miguelcordero191 0:156a9e15919e 6 static char* KO_MSG = "KO";
miguelcordero191 0:156a9e15919e 7 static char* OK_MSG = "OK";
miguelcordero191 0:156a9e15919e 8 static char* NI_MSG = "NI";
miguelcordero191 0:156a9e15919e 9
miguelcordero191 0:156a9e15919e 10 static char* ZERO_MSG = "\x00";
miguelcordero191 0:156a9e15919e 11 static char* ONE_MSG = "\x01";
miguelcordero191 0:156a9e15919e 12
miguelcordero191 0:156a9e15919e 13 static char *MODULATION[6] = {"None ", "FSK ", "Ramped FSK ", "Chirp ", "BPSK ", "Not Allowed "};
miguelcordero191 0:156a9e15919e 14
miguelcordero191 0:156a9e15919e 15 DDS::DDS(SPI *spi_dev, DigitalOut *mreset, DigitalOut *outramp, DigitalOut *spmode, DigitalOut *cs, DigitalOut *ioreset, DigitalInOut *updclk){
miguelcordero191 0:156a9e15919e 16
miguelcordero191 0:156a9e15919e 17 spi_device = spi_dev;
miguelcordero191 0:156a9e15919e 18
miguelcordero191 0:156a9e15919e 19 dds_mreset = mreset;
miguelcordero191 0:156a9e15919e 20 dds_outramp = outramp;
miguelcordero191 0:156a9e15919e 21 dds_sp_mode = spmode;
miguelcordero191 0:156a9e15919e 22 dds_cs = cs;
miguelcordero191 0:156a9e15919e 23 dds_io_reset = ioreset;
miguelcordero191 0:156a9e15919e 24 dds_updclk = updclk;
miguelcordero191 0:156a9e15919e 25
miguelcordero191 0:156a9e15919e 26 dds_updclk->input();
miguelcordero191 0:156a9e15919e 27 *dds_sp_mode = 0;
miguelcordero191 0:156a9e15919e 28 *dds_cs = 1;
miguelcordero191 0:156a9e15919e 29 *dds_outramp = 0;
miguelcordero191 0:156a9e15919e 30
miguelcordero191 0:156a9e15919e 31 cmd_answer = NULL;
miguelcordero191 0:156a9e15919e 32 cmd_answer_len = 0;
miguelcordero191 0:156a9e15919e 33
miguelcordero191 0:156a9e15919e 34 spi_device->format(SPI_BITS, SPI_MODE);
miguelcordero191 0:156a9e15919e 35 spi_device->frequency(SPI_FREQ);
miguelcordero191 0:156a9e15919e 36
miguelcordero191 0:156a9e15919e 37 this->isConfig = false;
miguelcordero191 0:156a9e15919e 38
miguelcordero191 0:156a9e15919e 39 }
miguelcordero191 0:156a9e15919e 40
miguelcordero191 0:156a9e15919e 41 int DDS::__writeData(char addr, char ndata, const char* data){
miguelcordero191 0:156a9e15919e 42
miguelcordero191 0:156a9e15919e 43 // I/O reset
miguelcordero191 0:156a9e15919e 44 *dds_updclk = 0;
miguelcordero191 0:156a9e15919e 45 *dds_io_reset = 1;
miguelcordero191 0:156a9e15919e 46 wait_us(10);
miguelcordero191 0:156a9e15919e 47 *dds_io_reset = 0;
miguelcordero191 0:156a9e15919e 48 wait_us(10);
miguelcordero191 0:156a9e15919e 49
miguelcordero191 0:156a9e15919e 50 *dds_cs = 0;
miguelcordero191 0:156a9e15919e 51
miguelcordero191 0:156a9e15919e 52 //Sending serial address
miguelcordero191 0:156a9e15919e 53 //printf("\r\nWriting Addr = %d", addr);
miguelcordero191 0:156a9e15919e 54 spi_device->write(addr & 0x0F);
miguelcordero191 0:156a9e15919e 55
miguelcordero191 0:156a9e15919e 56 for(char i = 0; i < ndata; i++)
miguelcordero191 0:156a9e15919e 57 {
miguelcordero191 0:156a9e15919e 58 wait_us(150);
miguelcordero191 0:156a9e15919e 59 spi_device->write(data[i]);
miguelcordero191 0:156a9e15919e 60 }
miguelcordero191 0:156a9e15919e 61
miguelcordero191 0:156a9e15919e 62 *dds_cs = 1;
miguelcordero191 0:156a9e15919e 63 /*
miguelcordero191 0:156a9e15919e 64 for(char i = 0; i < ndata; i++)
miguelcordero191 0:156a9e15919e 65 {
miguelcordero191 0:156a9e15919e 66 printf("\tData[%d] = 0x%x", i, data[i]);
miguelcordero191 0:156a9e15919e 67 }
miguelcordero191 0:156a9e15919e 68 */
miguelcordero191 0:156a9e15919e 69
miguelcordero191 0:156a9e15919e 70
miguelcordero191 0:156a9e15919e 71 wait_us(10);
miguelcordero191 0:156a9e15919e 72 *dds_updclk = 1;
miguelcordero191 0:156a9e15919e 73 wait_us(10);
miguelcordero191 0:156a9e15919e 74 *dds_updclk = 0;
miguelcordero191 0:156a9e15919e 75 wait_us(10);
miguelcordero191 0:156a9e15919e 76
miguelcordero191 0:156a9e15919e 77 return 1;
miguelcordero191 0:156a9e15919e 78 }
miguelcordero191 0:156a9e15919e 79
miguelcordero191 0:156a9e15919e 80
miguelcordero191 0:156a9e15919e 81 char* DDS::__readData(char addr, char ndata){
miguelcordero191 0:156a9e15919e 82
miguelcordero191 0:156a9e15919e 83 // I/O reset
miguelcordero191 0:156a9e15919e 84 *dds_io_reset = 1;
miguelcordero191 0:156a9e15919e 85 wait_us(10);
miguelcordero191 0:156a9e15919e 86 *dds_io_reset = 0;
miguelcordero191 0:156a9e15919e 87 wait_us(10);
miguelcordero191 0:156a9e15919e 88
miguelcordero191 0:156a9e15919e 89 *dds_cs = 0;
miguelcordero191 0:156a9e15919e 90
miguelcordero191 0:156a9e15919e 91 //Sending serial address
miguelcordero191 0:156a9e15919e 92 //printf("\r\nReading Addr = %d", addr);
miguelcordero191 0:156a9e15919e 93 spi_device->write((addr & 0x0F) | 0x80);
miguelcordero191 0:156a9e15919e 94
miguelcordero191 0:156a9e15919e 95 for(char i = 0; i < ndata; i++)
miguelcordero191 0:156a9e15919e 96 {
miguelcordero191 0:156a9e15919e 97 wait_us(150);
miguelcordero191 0:156a9e15919e 98 read_spi_data[i] = spi_device->write(0x00);
miguelcordero191 0:156a9e15919e 99 }
miguelcordero191 0:156a9e15919e 100
miguelcordero191 0:156a9e15919e 101 *dds_cs = 1;
miguelcordero191 0:156a9e15919e 102 /*
miguelcordero191 0:156a9e15919e 103 for(char i = 0; i < ndata; i++)
miguelcordero191 0:156a9e15919e 104 {
miguelcordero191 0:156a9e15919e 105 printf("\r\nData[%d] = 0x%x", i, read_spi_data[i]);
miguelcordero191 0:156a9e15919e 106 }
miguelcordero191 0:156a9e15919e 107 */
miguelcordero191 0:156a9e15919e 108
miguelcordero191 0:156a9e15919e 109 wait_us(10);
miguelcordero191 0:156a9e15919e 110
miguelcordero191 0:156a9e15919e 111 return read_spi_data;
miguelcordero191 0:156a9e15919e 112 }
miguelcordero191 0:156a9e15919e 113
miguelcordero191 0:156a9e15919e 114 int DDS::__writeDataAndVerify(char addr, char ndata, const char* wr_spi_data, SerialDriver *screen){
miguelcordero191 0:156a9e15919e 115
miguelcordero191 0:156a9e15919e 116 int success;
miguelcordero191 0:156a9e15919e 117 char* rd_spi_data;
miguelcordero191 0:156a9e15919e 118
miguelcordero191 0:156a9e15919e 119 this->__writeData(addr, ndata, wr_spi_data);
miguelcordero191 0:156a9e15919e 120 rd_spi_data = this->__readData(addr, ndata);
miguelcordero191 0:156a9e15919e 121
miguelcordero191 0:156a9e15919e 122 success = 1;
miguelcordero191 0:156a9e15919e 123
miguelcordero191 0:156a9e15919e 124 for(char i = 0; i < ndata; i++)
miguelcordero191 0:156a9e15919e 125 {
miguelcordero191 0:156a9e15919e 126 if (screen != NULL){
miguelcordero191 0:156a9e15919e 127 screen->putc(wr_spi_data[i]);
miguelcordero191 0:156a9e15919e 128 screen->putc(0x3D);
miguelcordero191 0:156a9e15919e 129 screen->putc(rd_spi_data[i]);
miguelcordero191 0:156a9e15919e 130 }
miguelcordero191 0:156a9e15919e 131
miguelcordero191 0:156a9e15919e 132 if (wr_spi_data[i] != rd_spi_data[i])
miguelcordero191 0:156a9e15919e 133 {
miguelcordero191 0:156a9e15919e 134 success = 0;
miguelcordero191 0:156a9e15919e 135 break;
miguelcordero191 0:156a9e15919e 136 }
miguelcordero191 0:156a9e15919e 137
miguelcordero191 0:156a9e15919e 138 }
miguelcordero191 0:156a9e15919e 139
miguelcordero191 0:156a9e15919e 140 //Update Control Register
miguelcordero191 0:156a9e15919e 141 if ((success == 1) && (addr==0x07)){
miguelcordero191 0:156a9e15919e 142 cr_multiplier = rd_spi_data[1] & 0x1F;
miguelcordero191 0:156a9e15919e 143 cr_mode = (rd_spi_data[2] & 0x0E) >> 1;
miguelcordero191 0:156a9e15919e 144 }
miguelcordero191 0:156a9e15919e 145 //printf("\r\nSuccessful writting = %d\r\n", success);
miguelcordero191 0:156a9e15919e 146
miguelcordero191 0:156a9e15919e 147 return success;
miguelcordero191 0:156a9e15919e 148 }
miguelcordero191 0:156a9e15919e 149
miguelcordero191 0:156a9e15919e 150 char* DDS::__getControlRegister(){
miguelcordero191 0:156a9e15919e 151
miguelcordero191 0:156a9e15919e 152 bool pll_range = 0;
miguelcordero191 0:156a9e15919e 153 bool pll_bypass = 1;
miguelcordero191 0:156a9e15919e 154
miguelcordero191 0:156a9e15919e 155 if (cr_multiplier >= 4){
miguelcordero191 0:156a9e15919e 156 pll_bypass = 0;
miguelcordero191 0:156a9e15919e 157 }
miguelcordero191 0:156a9e15919e 158
miguelcordero191 0:156a9e15919e 159 if (clock >= 200){
miguelcordero191 0:156a9e15919e 160 pll_range = 1;
miguelcordero191 0:156a9e15919e 161 }
miguelcordero191 0:156a9e15919e 162
miguelcordero191 0:156a9e15919e 163 controlRegister[0] = 0x10 + cr_qdac_pwdn*4;
miguelcordero191 0:156a9e15919e 164 controlRegister[1] = pll_range*64 + pll_bypass*32 + (cr_multiplier & 0x1F);
miguelcordero191 0:156a9e15919e 165 controlRegister[2] = (cr_mode & 0x07)*2 + cr_ioupdclk;
miguelcordero191 0:156a9e15919e 166 controlRegister[3] = cr_inv_sinc*64 + cr_osk_en*32 + cr_osk_int*16 + cr_msb_lsb*2 + cr_sdo;
miguelcordero191 0:156a9e15919e 167
miguelcordero191 0:156a9e15919e 168 return controlRegister;
miguelcordero191 0:156a9e15919e 169
miguelcordero191 0:156a9e15919e 170 }
miguelcordero191 0:156a9e15919e 171
miguelcordero191 0:156a9e15919e 172 int DDS::__writeControlRegister(){
miguelcordero191 0:156a9e15919e 173
miguelcordero191 0:156a9e15919e 174 bool success;
miguelcordero191 0:156a9e15919e 175 char* wr_spi_data;
miguelcordero191 0:156a9e15919e 176 char* rd_spi_data;
miguelcordero191 0:156a9e15919e 177 char addr = 0x07, ndata = 4;
miguelcordero191 0:156a9e15919e 178
miguelcordero191 0:156a9e15919e 179 wr_spi_data = this->__getControlRegister();
miguelcordero191 0:156a9e15919e 180
miguelcordero191 0:156a9e15919e 181 success = this->__writeData(addr, ndata, wr_spi_data);
miguelcordero191 0:156a9e15919e 182
miguelcordero191 0:156a9e15919e 183 ////printf("\r\nChanging UPD_CLK as an OUTPUT ...");
miguelcordero191 0:156a9e15919e 184 dds_updclk->output();
miguelcordero191 0:156a9e15919e 185
miguelcordero191 0:156a9e15919e 186 wait_us(100);
miguelcordero191 0:156a9e15919e 187 *dds_updclk = 1;
miguelcordero191 0:156a9e15919e 188 wait_us(10);
miguelcordero191 0:156a9e15919e 189 *dds_updclk = 0;
miguelcordero191 0:156a9e15919e 190 wait_us(10);
miguelcordero191 0:156a9e15919e 191
miguelcordero191 0:156a9e15919e 192 rd_spi_data = this->__readData(addr, ndata);
miguelcordero191 0:156a9e15919e 193
miguelcordero191 0:156a9e15919e 194 success = true;
miguelcordero191 0:156a9e15919e 195
miguelcordero191 0:156a9e15919e 196 for(char i = 0; i < ndata; i++)
miguelcordero191 0:156a9e15919e 197 {
miguelcordero191 0:156a9e15919e 198 if (wr_spi_data[i] != rd_spi_data[i])
miguelcordero191 0:156a9e15919e 199 {
miguelcordero191 0:156a9e15919e 200 success = false;
miguelcordero191 0:156a9e15919e 201 break;
miguelcordero191 0:156a9e15919e 202 }
miguelcordero191 0:156a9e15919e 203 }
miguelcordero191 0:156a9e15919e 204
miguelcordero191 0:156a9e15919e 205 return success;
miguelcordero191 0:156a9e15919e 206 }
miguelcordero191 0:156a9e15919e 207
miguelcordero191 0:156a9e15919e 208
miguelcordero191 0:156a9e15919e 209 int DDS::reset(){
miguelcordero191 0:156a9e15919e 210
miguelcordero191 0:156a9e15919e 211 // Master reset
miguelcordero191 0:156a9e15919e 212 //Set as a input, temporary
miguelcordero191 0:156a9e15919e 213 //printf("\r\nChange updclk direction as an INPUT ...\r\n");
miguelcordero191 0:156a9e15919e 214 dds_updclk->input();
miguelcordero191 0:156a9e15919e 215 dds_updclk->mode(PullDown);
miguelcordero191 0:156a9e15919e 216
miguelcordero191 0:156a9e15919e 217 //printf("\r\nReseting DDS ...\r\n");
miguelcordero191 0:156a9e15919e 218 *dds_mreset = 1;
miguelcordero191 0:156a9e15919e 219 wait_ms(1);
miguelcordero191 0:156a9e15919e 220 *dds_mreset = 0;
miguelcordero191 0:156a9e15919e 221 wait_ms(1);
miguelcordero191 0:156a9e15919e 222
miguelcordero191 0:156a9e15919e 223 this->rf_enabled = false;
miguelcordero191 0:156a9e15919e 224
miguelcordero191 0:156a9e15919e 225 return 0;
miguelcordero191 0:156a9e15919e 226 }
miguelcordero191 0:156a9e15919e 227
miguelcordero191 0:156a9e15919e 228 int DDS::scanIOUpdate(){
miguelcordero191 0:156a9e15919e 229
miguelcordero191 0:156a9e15919e 230 unsigned int cont = 0;
miguelcordero191 0:156a9e15919e 231
miguelcordero191 0:156a9e15919e 232 this->reset();
miguelcordero191 0:156a9e15919e 233
miguelcordero191 0:156a9e15919e 234 //printf("\r\nWaiting a upd_clk ...\r\n");
miguelcordero191 0:156a9e15919e 235 while(true){
miguelcordero191 0:156a9e15919e 236 if (*dds_updclk == 1)
miguelcordero191 0:156a9e15919e 237 break;
miguelcordero191 0:156a9e15919e 238
miguelcordero191 0:156a9e15919e 239 cont += 1;
miguelcordero191 0:156a9e15919e 240 if (cont > 10000)
miguelcordero191 0:156a9e15919e 241 break;
miguelcordero191 0:156a9e15919e 242
miguelcordero191 0:156a9e15919e 243 wait_us(1);
miguelcordero191 0:156a9e15919e 244 }
miguelcordero191 0:156a9e15919e 245
miguelcordero191 0:156a9e15919e 246 if (cont > 10000){
miguelcordero191 0:156a9e15919e 247 //printf("\r\nA upd_clk was not found\r\n");
miguelcordero191 0:156a9e15919e 248 return 0;
miguelcordero191 0:156a9e15919e 249 }
miguelcordero191 0:156a9e15919e 250
miguelcordero191 0:156a9e15919e 251 //printf("\r\nA upd_clk was found ...\r\n");
miguelcordero191 0:156a9e15919e 252
miguelcordero191 0:156a9e15919e 253 return 1;
miguelcordero191 0:156a9e15919e 254 }
miguelcordero191 0:156a9e15919e 255
miguelcordero191 0:156a9e15919e 256 int DDS::find(){
miguelcordero191 0:156a9e15919e 257 /*
miguelcordero191 0:156a9e15919e 258 char phase[];
miguelcordero191 0:156a9e15919e 259
miguelcordero191 0:156a9e15919e 260 phase[0] = 0x0A;
miguelcordero191 0:156a9e15919e 261 phase[1] = 0x55;
miguelcordero191 0:156a9e15919e 262
miguelcordero191 0:156a9e15919e 263 this->__writeDataAndVerify(0x00, 5, phase);
miguelcordero191 0:156a9e15919e 264 */
miguelcordero191 0:156a9e15919e 265 this->__readData(0x05, 4);
miguelcordero191 0:156a9e15919e 266 this->__readData(0x0A, 1);
miguelcordero191 0:156a9e15919e 267 return 1;
miguelcordero191 0:156a9e15919e 268
miguelcordero191 0:156a9e15919e 269 }
miguelcordero191 0:156a9e15919e 270
miguelcordero191 0:156a9e15919e 271
miguelcordero191 0:156a9e15919e 272 int DDS::init(){
miguelcordero191 0:156a9e15919e 273
miguelcordero191 0:156a9e15919e 274 //printf("\r\nSetting default parameters in CR ...\r\n");
miguelcordero191 0:156a9e15919e 275
miguelcordero191 0:156a9e15919e 276 //Serial mode enabled
miguelcordero191 0:156a9e15919e 277 this->clock = 200.0; // Work clock in MHz
miguelcordero191 0:156a9e15919e 278 this->cr_multiplier = 4; // Multiplier 4- 20
miguelcordero191 0:156a9e15919e 279 this->cr_mode = 0; // Single, FSK, Ramped FSK, Chirp, BPSK
miguelcordero191 0:156a9e15919e 280 this->cr_qdac_pwdn = 0; // QDAC power down enabled: 0 -> disable
miguelcordero191 0:156a9e15919e 281 this->cr_ioupdclk = 0; // IO Update clock direction: 0 -> input, 1 -> output
miguelcordero191 0:156a9e15919e 282 this->cr_inv_sinc = 0; // Sinc inverser filter enable: 0 -> enable
miguelcordero191 0:156a9e15919e 283 this->cr_osk_en = 1; // Enable Amplitude multiplier: 0 -> disabled
miguelcordero191 0:156a9e15919e 284 this->cr_osk_int = 0; // register/counter output shaped control: 0 -> register, 1 -> counter
miguelcordero191 0:156a9e15919e 285 this->cr_msb_lsb = 0; // msb/lsb bit first: 0 -> MSB, 1 -> LSB
miguelcordero191 0:156a9e15919e 286 this->cr_sdo = 1; // SDO pin active: 0 -> inactive
miguelcordero191 0:156a9e15919e 287
miguelcordero191 0:156a9e15919e 288 //printf("\r\nSetting in serial mode ...\r\n");
miguelcordero191 0:156a9e15919e 289 *dds_sp_mode = 0;
miguelcordero191 0:156a9e15919e 290 *dds_cs = 1;
miguelcordero191 0:156a9e15919e 291
miguelcordero191 0:156a9e15919e 292 this->reset();
miguelcordero191 0:156a9e15919e 293
miguelcordero191 0:156a9e15919e 294 //printf("\r\nWritting CR ...\r\n");
miguelcordero191 0:156a9e15919e 295
miguelcordero191 0:156a9e15919e 296 if (not this->__writeControlRegister()){
miguelcordero191 0:156a9e15919e 297 //printf("\r\nUnsuccessful DDS initialization");
miguelcordero191 0:156a9e15919e 298 this->isConfig = false;
miguelcordero191 0:156a9e15919e 299 return false;
miguelcordero191 0:156a9e15919e 300 }
miguelcordero191 0:156a9e15919e 301
miguelcordero191 0:156a9e15919e 302 //printf("\r\nSuccessfull DDS initialization");
miguelcordero191 0:156a9e15919e 303
miguelcordero191 0:156a9e15919e 304 this->isConfig = true;
miguelcordero191 0:156a9e15919e 305
miguelcordero191 0:156a9e15919e 306 return true;
miguelcordero191 0:156a9e15919e 307 }
miguelcordero191 0:156a9e15919e 308
miguelcordero191 0:156a9e15919e 309 char* DDS::rdMode(){
miguelcordero191 0:156a9e15919e 310
miguelcordero191 0:156a9e15919e 311 char* rd_data;
miguelcordero191 0:156a9e15919e 312 char mode;
miguelcordero191 0:156a9e15919e 313
miguelcordero191 0:156a9e15919e 314 rd_data = this->__readData(0x07, 4);
miguelcordero191 0:156a9e15919e 315 mode = (rd_data[2] & 0x0E) >> 1;
miguelcordero191 0:156a9e15919e 316
miguelcordero191 0:156a9e15919e 317 this->cr_mode = mode;
miguelcordero191 0:156a9e15919e 318
miguelcordero191 0:156a9e15919e 319 rd_data[0] = mode;
miguelcordero191 0:156a9e15919e 320
miguelcordero191 0:156a9e15919e 321 return rd_data;
miguelcordero191 0:156a9e15919e 322 }
miguelcordero191 0:156a9e15919e 323
miguelcordero191 0:156a9e15919e 324 char* DDS::rdMultiplier(){
miguelcordero191 0:156a9e15919e 325
miguelcordero191 0:156a9e15919e 326 char* rd_data;
miguelcordero191 0:156a9e15919e 327 char mult;
miguelcordero191 0:156a9e15919e 328
miguelcordero191 0:156a9e15919e 329 rd_data = this->__readData(0x07, 4);
miguelcordero191 0:156a9e15919e 330 mult = (rd_data[1] & 0x1F);
miguelcordero191 0:156a9e15919e 331 this->cr_multiplier = mult;
miguelcordero191 0:156a9e15919e 332
miguelcordero191 0:156a9e15919e 333 //Reaconditioning data to return
miguelcordero191 0:156a9e15919e 334 rd_data[0] = mult;
miguelcordero191 0:156a9e15919e 335 rd_data[1] = ((int)clock >> 8) & 0xff;
miguelcordero191 0:156a9e15919e 336 rd_data[2] = (int)clock & 0xff;
miguelcordero191 0:156a9e15919e 337
miguelcordero191 0:156a9e15919e 338 return rd_data;
miguelcordero191 0:156a9e15919e 339 }
miguelcordero191 0:156a9e15919e 340 char* DDS::rdPhase1(){
miguelcordero191 0:156a9e15919e 341
miguelcordero191 0:156a9e15919e 342 char* rd_data;
miguelcordero191 0:156a9e15919e 343
miguelcordero191 0:156a9e15919e 344 rd_data = this->__readData(0x00, 2);
miguelcordero191 0:156a9e15919e 345
miguelcordero191 0:156a9e15919e 346 return rd_data;
miguelcordero191 0:156a9e15919e 347
miguelcordero191 0:156a9e15919e 348 }
miguelcordero191 0:156a9e15919e 349 char* DDS::rdPhase2(){
miguelcordero191 0:156a9e15919e 350
miguelcordero191 0:156a9e15919e 351 char* rd_data;
miguelcordero191 0:156a9e15919e 352
miguelcordero191 0:156a9e15919e 353 rd_data = this->__readData(0x01, 2);
miguelcordero191 0:156a9e15919e 354
miguelcordero191 0:156a9e15919e 355 return rd_data;
miguelcordero191 0:156a9e15919e 356 }
miguelcordero191 0:156a9e15919e 357 char* DDS::rdFrequency1(){
miguelcordero191 0:156a9e15919e 358
miguelcordero191 0:156a9e15919e 359 char* rd_data;
miguelcordero191 0:156a9e15919e 360
miguelcordero191 0:156a9e15919e 361 rd_data = this->__readData(0x02, 6);
miguelcordero191 0:156a9e15919e 362
miguelcordero191 0:156a9e15919e 363 for (int i=0; i<6; i++)
miguelcordero191 0:156a9e15919e 364 frequency1[i] = rd_data[i];
miguelcordero191 0:156a9e15919e 365
miguelcordero191 0:156a9e15919e 366 return rd_data;
miguelcordero191 0:156a9e15919e 367
miguelcordero191 0:156a9e15919e 368 }
miguelcordero191 0:156a9e15919e 369 char* DDS::rdFrequency2(){
miguelcordero191 0:156a9e15919e 370
miguelcordero191 0:156a9e15919e 371 char* rd_data;
miguelcordero191 0:156a9e15919e 372
miguelcordero191 0:156a9e15919e 373 rd_data = this->__readData(0x03, 6);
miguelcordero191 0:156a9e15919e 374
miguelcordero191 0:156a9e15919e 375 for (int i=0; i<6; i++)
miguelcordero191 0:156a9e15919e 376 frequency2[i] = rd_data[i];
miguelcordero191 0:156a9e15919e 377
miguelcordero191 0:156a9e15919e 378 return rd_data;
miguelcordero191 0:156a9e15919e 379 }
miguelcordero191 0:156a9e15919e 380 char* DDS::rdAmplitudeI(){
miguelcordero191 0:156a9e15919e 381
miguelcordero191 0:156a9e15919e 382 char* rd_data;
miguelcordero191 0:156a9e15919e 383
miguelcordero191 0:156a9e15919e 384 rd_data = this->__readData(0x08, 2);
miguelcordero191 0:156a9e15919e 385
miguelcordero191 0:156a9e15919e 386 return rd_data;
miguelcordero191 0:156a9e15919e 387 }
miguelcordero191 0:156a9e15919e 388 char* DDS::rdAmplitudeQ(){
miguelcordero191 0:156a9e15919e 389
miguelcordero191 0:156a9e15919e 390 char* rd_data;
miguelcordero191 0:156a9e15919e 391
miguelcordero191 0:156a9e15919e 392 rd_data = this->__readData(0x09, 2);
miguelcordero191 0:156a9e15919e 393
miguelcordero191 0:156a9e15919e 394 return rd_data;
miguelcordero191 0:156a9e15919e 395 }
miguelcordero191 0:156a9e15919e 396
miguelcordero191 0:156a9e15919e 397 int DDS::isRFEnabled(){
miguelcordero191 0:156a9e15919e 398
miguelcordero191 0:156a9e15919e 399 if (this->rf_enabled)
miguelcordero191 0:156a9e15919e 400 return 1;
miguelcordero191 0:156a9e15919e 401
miguelcordero191 0:156a9e15919e 402 return 0;
miguelcordero191 0:156a9e15919e 403 }
miguelcordero191 0:156a9e15919e 404
miguelcordero191 0:156a9e15919e 405 int DDS::wrMode(char mode){
miguelcordero191 0:156a9e15919e 406
miguelcordero191 0:156a9e15919e 407 this->cr_mode = mode & 0x07;
miguelcordero191 0:156a9e15919e 408
miguelcordero191 0:156a9e15919e 409 return this->__writeControlRegister();
miguelcordero191 0:156a9e15919e 410 }
miguelcordero191 0:156a9e15919e 411
miguelcordero191 0:156a9e15919e 412 int DDS::wrMultiplier(char multiplier, float clock){
miguelcordero191 0:156a9e15919e 413
miguelcordero191 0:156a9e15919e 414 this->cr_multiplier = multiplier & 0x1F;
miguelcordero191 0:156a9e15919e 415 this->clock = clock;
miguelcordero191 0:156a9e15919e 416
miguelcordero191 0:156a9e15919e 417 //printf("\r\n mult = %d, clock = %f", multiplier, clock);
miguelcordero191 0:156a9e15919e 418 //printf("\r\n cr_mult = %d", cr_multiplier);
miguelcordero191 0:156a9e15919e 419
miguelcordero191 0:156a9e15919e 420 return this->__writeControlRegister();
miguelcordero191 0:156a9e15919e 421 }
miguelcordero191 0:156a9e15919e 422
miguelcordero191 0:156a9e15919e 423 int DDS::wrPhase1(char* phase, SerialDriver *screen){
miguelcordero191 0:156a9e15919e 424
miguelcordero191 0:156a9e15919e 425 return this->__writeDataAndVerify(0x00, 2, phase, screen);
miguelcordero191 0:156a9e15919e 426
miguelcordero191 0:156a9e15919e 427 }
miguelcordero191 0:156a9e15919e 428
miguelcordero191 0:156a9e15919e 429 int DDS::wrPhase2(char* phase, SerialDriver *screen){
miguelcordero191 0:156a9e15919e 430
miguelcordero191 0:156a9e15919e 431 return this->__writeDataAndVerify(0x01, 2, phase, screen);
miguelcordero191 0:156a9e15919e 432
miguelcordero191 0:156a9e15919e 433 }
miguelcordero191 0:156a9e15919e 434
miguelcordero191 0:156a9e15919e 435 int DDS::wrFrequency1(char* freq, SerialDriver *screen){
miguelcordero191 0:156a9e15919e 436 int sts;
miguelcordero191 0:156a9e15919e 437
miguelcordero191 0:156a9e15919e 438 sts = this->__writeDataAndVerify(0x02, 6, freq, screen);
miguelcordero191 0:156a9e15919e 439
miguelcordero191 0:156a9e15919e 440 if (sts){
miguelcordero191 0:156a9e15919e 441 for (int i=0; i<6; i++)
miguelcordero191 0:156a9e15919e 442 frequency1[i] = freq[i];
miguelcordero191 0:156a9e15919e 443 }
miguelcordero191 0:156a9e15919e 444 return sts;
miguelcordero191 0:156a9e15919e 445
miguelcordero191 0:156a9e15919e 446 }
miguelcordero191 0:156a9e15919e 447 int DDS::wrFrequency2(char* freq, SerialDriver *screen){
miguelcordero191 0:156a9e15919e 448 int sts;
miguelcordero191 0:156a9e15919e 449
miguelcordero191 0:156a9e15919e 450 sts = this->__writeDataAndVerify(0x03, 6, freq, screen);
miguelcordero191 0:156a9e15919e 451
miguelcordero191 0:156a9e15919e 452 if (sts){
miguelcordero191 0:156a9e15919e 453 for (int i=0; i<6; i++)
miguelcordero191 0:156a9e15919e 454 frequency2[i] = freq[i];
miguelcordero191 0:156a9e15919e 455 }
miguelcordero191 0:156a9e15919e 456 return sts;
miguelcordero191 0:156a9e15919e 457 }
miguelcordero191 0:156a9e15919e 458
miguelcordero191 0:156a9e15919e 459 int DDS::wrAmplitudeI(char* amplitude, SerialDriver *screen){
miguelcordero191 0:156a9e15919e 460
miguelcordero191 0:156a9e15919e 461 amplitudeI[0] = amplitude[0];
miguelcordero191 0:156a9e15919e 462 amplitudeI[1] = amplitude[1];
miguelcordero191 0:156a9e15919e 463
miguelcordero191 0:156a9e15919e 464 this->rf_enabled = true;
miguelcordero191 0:156a9e15919e 465
miguelcordero191 0:156a9e15919e 466 return this->__writeDataAndVerify(0x08, 2, amplitude, screen);
miguelcordero191 0:156a9e15919e 467
miguelcordero191 0:156a9e15919e 468 }
miguelcordero191 0:156a9e15919e 469
miguelcordero191 0:156a9e15919e 470 int DDS::wrAmplitudeQ(char* amplitude, SerialDriver *screen){
miguelcordero191 0:156a9e15919e 471
miguelcordero191 0:156a9e15919e 472 amplitudeQ[0] = amplitude[0];
miguelcordero191 0:156a9e15919e 473 amplitudeQ[1] = amplitude[1];
miguelcordero191 0:156a9e15919e 474
miguelcordero191 0:156a9e15919e 475 this->rf_enabled = true;
miguelcordero191 0:156a9e15919e 476
miguelcordero191 0:156a9e15919e 477 return this->__writeDataAndVerify(0x09, 2, amplitude, screen);
miguelcordero191 0:156a9e15919e 478
miguelcordero191 0:156a9e15919e 479 }
miguelcordero191 0:156a9e15919e 480
miguelcordero191 0:156a9e15919e 481 int DDS::enableRF(){
miguelcordero191 0:156a9e15919e 482
miguelcordero191 0:156a9e15919e 483 this->rf_enabled = true;
miguelcordero191 0:156a9e15919e 484
miguelcordero191 0:156a9e15919e 485 this->__writeDataAndVerify(0x08, 2, this->amplitudeI);
miguelcordero191 0:156a9e15919e 486 return this->__writeDataAndVerify(0x09, 2, this->amplitudeQ);
miguelcordero191 0:156a9e15919e 487
miguelcordero191 0:156a9e15919e 488 }
miguelcordero191 0:156a9e15919e 489
miguelcordero191 0:156a9e15919e 490 int DDS::disableRF(){
miguelcordero191 0:156a9e15919e 491
miguelcordero191 0:156a9e15919e 492 this->rf_enabled = false;
miguelcordero191 0:156a9e15919e 493
miguelcordero191 0:156a9e15919e 494 this->__writeDataAndVerify(0x08, 2, "\x00\x00");
miguelcordero191 0:156a9e15919e 495 return this->__writeDataAndVerify(0x09, 2, "\x00\x00");
miguelcordero191 0:156a9e15919e 496
miguelcordero191 0:156a9e15919e 497 }
miguelcordero191 0:156a9e15919e 498
miguelcordero191 0:156a9e15919e 499 int DDS::defaultSettings(SerialDriver *screen){
miguelcordero191 0:156a9e15919e 500
miguelcordero191 0:156a9e15919e 501 if (!(screen == NULL)){
miguelcordero191 0:156a9e15919e 502 screen->putc(0x37);
miguelcordero191 0:156a9e15919e 503 screen->putc(0x30);
miguelcordero191 0:156a9e15919e 504 }
miguelcordero191 0:156a9e15919e 505
miguelcordero191 0:156a9e15919e 506 this->wrMultiplier(1, 0.0);
miguelcordero191 0:156a9e15919e 507 this->wrAmplitudeI("\x0F\xC0", screen); //0xFC0 produces best SFDR than 0xFFF
miguelcordero191 0:156a9e15919e 508 this->wrAmplitudeQ("\x0F\xC0"); //0xFC0 produces best SFDR than 0xFFF
miguelcordero191 0:156a9e15919e 509 this->wrFrequency1("\x00\x00\x00\x00\x00\x00"); // 49.92 <> 0x3f 0xe5 0xc9 0x1d 0x14 0xe3 <> 49.92/clock*(2**48) \x3f\xe5\xc9\x1d\x14\xe3
miguelcordero191 0:156a9e15919e 510 this->wrFrequency2("\x00\x00\x00\x00\x00\x00");
miguelcordero191 0:156a9e15919e 511 this->wrPhase1("\x00\x00"); //0 grados
miguelcordero191 0:156a9e15919e 512 this->wrPhase2("\x20\x00"); //180 grados <> 0x20 0x00 <> 180/360*(2**14)
miguelcordero191 0:156a9e15919e 513 this->disableRF();
miguelcordero191 0:156a9e15919e 514
miguelcordero191 0:156a9e15919e 515 if (!(screen == NULL)){
miguelcordero191 0:156a9e15919e 516 screen->putc(0x37);
miguelcordero191 0:156a9e15919e 517 screen->putc(0x31);
miguelcordero191 0:156a9e15919e 518 }
miguelcordero191 0:156a9e15919e 519
miguelcordero191 0:156a9e15919e 520 return this->wrMode(4); //BPSK mode
miguelcordero191 0:156a9e15919e 521
miguelcordero191 0:156a9e15919e 522 }
miguelcordero191 0:156a9e15919e 523
miguelcordero191 0:156a9e15919e 524 char* DDS::setCommand(unsigned short cmd, char* payload, unsigned long payload_len){
miguelcordero191 0:156a9e15919e 525
miguelcordero191 0:156a9e15919e 526 bool success = false;
miguelcordero191 0:156a9e15919e 527 char* tx_msg;
miguelcordero191 0:156a9e15919e 528 unsigned long tx_msg_len;
miguelcordero191 0:156a9e15919e 529
miguelcordero191 0:156a9e15919e 530 tx_msg = KO_MSG;
miguelcordero191 0:156a9e15919e 531 tx_msg_len = 2;
miguelcordero191 0:156a9e15919e 532
miguelcordero191 0:156a9e15919e 533 //printf("cmd = %d, payload_len = %d", cmd, payload_len);
miguelcordero191 0:156a9e15919e 534
miguelcordero191 0:156a9e15919e 535 //printf("\r\nPayload = ");
miguelcordero191 0:156a9e15919e 536 //for(unsigned long i=0; i< payload_len; i++)
miguelcordero191 0:156a9e15919e 537 //printf("0x%x ", payload[i]);
miguelcordero191 0:156a9e15919e 538
miguelcordero191 0:156a9e15919e 539 //Si el DDS no esta inicializado siempre retornar NI_MSG
miguelcordero191 0:156a9e15919e 540 if (not this->isConfig){
miguelcordero191 0:156a9e15919e 541 this->cmd_answer = NI_MSG;
miguelcordero191 0:156a9e15919e 542 this->cmd_answer_len = 2;
miguelcordero191 0:156a9e15919e 543
miguelcordero191 0:156a9e15919e 544 return this->cmd_answer;
miguelcordero191 0:156a9e15919e 545 }
miguelcordero191 0:156a9e15919e 546
miguelcordero191 0:156a9e15919e 547 switch ( cmd )
miguelcordero191 0:156a9e15919e 548 {
miguelcordero191 0:156a9e15919e 549 case DDS_CMD_RESET:
miguelcordero191 0:156a9e15919e 550 success = this->init();
miguelcordero191 0:156a9e15919e 551 break;
miguelcordero191 0:156a9e15919e 552
miguelcordero191 0:156a9e15919e 553 case DDS_CMD_ENABLE_RF:
miguelcordero191 0:156a9e15919e 554 if (payload_len == 1){
miguelcordero191 0:156a9e15919e 555 if (payload[0] == 0)
miguelcordero191 0:156a9e15919e 556 success = this->disableRF();
miguelcordero191 0:156a9e15919e 557 else
miguelcordero191 0:156a9e15919e 558 success = this->enableRF();
miguelcordero191 0:156a9e15919e 559 }
miguelcordero191 0:156a9e15919e 560 break;
miguelcordero191 0:156a9e15919e 561
miguelcordero191 0:156a9e15919e 562 case DDS_CMD_MULTIPLIER:
miguelcordero191 0:156a9e15919e 563 if (payload_len == 1){
miguelcordero191 0:156a9e15919e 564 success = this->wrMultiplier(payload[0]);
miguelcordero191 0:156a9e15919e 565 }
miguelcordero191 0:156a9e15919e 566 if (payload_len == 3){
miguelcordero191 0:156a9e15919e 567 unsigned short clock = payload[1]*256 + payload[2];
miguelcordero191 0:156a9e15919e 568 success = this->wrMultiplier(payload[0], (float)clock);
miguelcordero191 0:156a9e15919e 569 }
miguelcordero191 0:156a9e15919e 570 break;
miguelcordero191 0:156a9e15919e 571
miguelcordero191 0:156a9e15919e 572 case DDS_CMD_MODE:
miguelcordero191 0:156a9e15919e 573 if (payload_len == 1){
miguelcordero191 0:156a9e15919e 574 success = this->wrMode(payload[0]);
miguelcordero191 0:156a9e15919e 575 }
miguelcordero191 0:156a9e15919e 576 break;
miguelcordero191 0:156a9e15919e 577
miguelcordero191 0:156a9e15919e 578 case DDS_CMD_FREQUENCYA:
miguelcordero191 0:156a9e15919e 579 if (payload_len == 6){
miguelcordero191 0:156a9e15919e 580 success = this->wrFrequency1(payload);
miguelcordero191 0:156a9e15919e 581 }
miguelcordero191 0:156a9e15919e 582 break;
miguelcordero191 0:156a9e15919e 583
miguelcordero191 0:156a9e15919e 584 case DDS_CMD_FREQUENCYB:
miguelcordero191 0:156a9e15919e 585 if (payload_len == 6){
miguelcordero191 0:156a9e15919e 586 success = this->wrFrequency2(payload);
miguelcordero191 0:156a9e15919e 587 }
miguelcordero191 0:156a9e15919e 588 break;
miguelcordero191 0:156a9e15919e 589
miguelcordero191 0:156a9e15919e 590 case DDS_CMD_PHASEA:
miguelcordero191 0:156a9e15919e 591 if (payload_len == 2){
miguelcordero191 0:156a9e15919e 592 success = this->wrPhase1(payload);
miguelcordero191 0:156a9e15919e 593 }
miguelcordero191 0:156a9e15919e 594 break;
miguelcordero191 0:156a9e15919e 595
miguelcordero191 0:156a9e15919e 596 case DDS_CMD_PHASEB:
miguelcordero191 0:156a9e15919e 597 if (payload_len == 2){
miguelcordero191 0:156a9e15919e 598 success = this->wrPhase2(payload);
miguelcordero191 0:156a9e15919e 599 }
miguelcordero191 0:156a9e15919e 600 break;
miguelcordero191 0:156a9e15919e 601
miguelcordero191 0:156a9e15919e 602 case DDS_CMD_AMPLITUDE1:
miguelcordero191 0:156a9e15919e 603 if (payload_len == 2){
miguelcordero191 0:156a9e15919e 604 success = this->wrAmplitudeI(payload);
miguelcordero191 0:156a9e15919e 605 }
miguelcordero191 0:156a9e15919e 606 break;
miguelcordero191 0:156a9e15919e 607
miguelcordero191 0:156a9e15919e 608 case DDS_CMD_AMPLITUDE2:
miguelcordero191 0:156a9e15919e 609 if (payload_len == 2){
miguelcordero191 0:156a9e15919e 610 success = this->wrAmplitudeQ(payload);
miguelcordero191 0:156a9e15919e 611 }
miguelcordero191 0:156a9e15919e 612 break;
miguelcordero191 0:156a9e15919e 613
miguelcordero191 0:156a9e15919e 614 case DDS_CMD_READ | DDS_CMD_ENABLE_RF:
miguelcordero191 0:156a9e15919e 615 if (this->isRFEnabled() == 1)
miguelcordero191 0:156a9e15919e 616 tx_msg = ONE_MSG;
miguelcordero191 0:156a9e15919e 617 else
miguelcordero191 0:156a9e15919e 618 tx_msg = ZERO_MSG;
miguelcordero191 0:156a9e15919e 619
miguelcordero191 0:156a9e15919e 620 tx_msg_len = 1;
miguelcordero191 0:156a9e15919e 621
miguelcordero191 0:156a9e15919e 622 break;
miguelcordero191 0:156a9e15919e 623
miguelcordero191 0:156a9e15919e 624 case DDS_CMD_READ | DDS_CMD_MULTIPLIER:
miguelcordero191 0:156a9e15919e 625 tx_msg = this->rdMultiplier();
miguelcordero191 0:156a9e15919e 626 tx_msg_len = 1;
miguelcordero191 0:156a9e15919e 627 break;
miguelcordero191 0:156a9e15919e 628
miguelcordero191 0:156a9e15919e 629 case DDS_CMD_READ | DDS_CMD_MODE:
miguelcordero191 0:156a9e15919e 630 tx_msg = this->rdMode();
miguelcordero191 0:156a9e15919e 631 tx_msg_len = 1;
miguelcordero191 0:156a9e15919e 632 break;
miguelcordero191 0:156a9e15919e 633
miguelcordero191 0:156a9e15919e 634 case DDS_CMD_READ | DDS_CMD_FREQUENCYA:
miguelcordero191 0:156a9e15919e 635 tx_msg = this->rdFrequency1();
miguelcordero191 0:156a9e15919e 636 tx_msg_len = 6;
miguelcordero191 0:156a9e15919e 637 break;
miguelcordero191 0:156a9e15919e 638
miguelcordero191 0:156a9e15919e 639 case DDS_CMD_READ | DDS_CMD_FREQUENCYB:
miguelcordero191 0:156a9e15919e 640 tx_msg = this->rdFrequency2();
miguelcordero191 0:156a9e15919e 641 tx_msg_len = 6;
miguelcordero191 0:156a9e15919e 642 break;
miguelcordero191 0:156a9e15919e 643
miguelcordero191 0:156a9e15919e 644 case DDS_CMD_READ | DDS_CMD_PHASEA:
miguelcordero191 0:156a9e15919e 645 tx_msg = this->rdPhase1();
miguelcordero191 0:156a9e15919e 646 tx_msg_len = 2;
miguelcordero191 0:156a9e15919e 647 break;
miguelcordero191 0:156a9e15919e 648
miguelcordero191 0:156a9e15919e 649 case DDS_CMD_READ | DDS_CMD_PHASEB:
miguelcordero191 0:156a9e15919e 650 tx_msg = this->rdPhase2();
miguelcordero191 0:156a9e15919e 651 tx_msg_len = 2;
miguelcordero191 0:156a9e15919e 652 break;
miguelcordero191 0:156a9e15919e 653
miguelcordero191 0:156a9e15919e 654 case DDS_CMD_READ | DDS_CMD_AMPLITUDE1:
miguelcordero191 0:156a9e15919e 655 tx_msg = this->rdAmplitudeI();
miguelcordero191 0:156a9e15919e 656 tx_msg_len = 2;
miguelcordero191 0:156a9e15919e 657 break;
miguelcordero191 0:156a9e15919e 658
miguelcordero191 0:156a9e15919e 659 case DDS_CMD_READ | DDS_CMD_AMPLITUDE2:
miguelcordero191 0:156a9e15919e 660 tx_msg = this->rdAmplitudeQ();
miguelcordero191 0:156a9e15919e 661 tx_msg_len = 2;
miguelcordero191 0:156a9e15919e 662 break;
miguelcordero191 0:156a9e15919e 663
miguelcordero191 0:156a9e15919e 664 default:
miguelcordero191 0:156a9e15919e 665 success = false;
miguelcordero191 0:156a9e15919e 666
miguelcordero191 0:156a9e15919e 667 }
miguelcordero191 0:156a9e15919e 668
miguelcordero191 0:156a9e15919e 669 if (success){
miguelcordero191 0:156a9e15919e 670 tx_msg = OK_MSG;
miguelcordero191 0:156a9e15919e 671 tx_msg_len = 2;
miguelcordero191 0:156a9e15919e 672 }
miguelcordero191 0:156a9e15919e 673
miguelcordero191 0:156a9e15919e 674 this->cmd_answer = tx_msg;
miguelcordero191 0:156a9e15919e 675 this->cmd_answer_len = tx_msg_len;
miguelcordero191 0:156a9e15919e 676
miguelcordero191 0:156a9e15919e 677 return tx_msg;
miguelcordero191 0:156a9e15919e 678 }
miguelcordero191 0:156a9e15919e 679
miguelcordero191 0:156a9e15919e 680 char* DDS::getCmdAnswer(){
miguelcordero191 0:156a9e15919e 681
miguelcordero191 0:156a9e15919e 682 return this->cmd_answer;
miguelcordero191 0:156a9e15919e 683
miguelcordero191 0:156a9e15919e 684 }
miguelcordero191 0:156a9e15919e 685
miguelcordero191 0:156a9e15919e 686 unsigned long DDS::getCmdAnswerLen(){
miguelcordero191 0:156a9e15919e 687
miguelcordero191 0:156a9e15919e 688 return this->cmd_answer_len;
miguelcordero191 0:156a9e15919e 689
miguelcordero191 0:156a9e15919e 690 }
miguelcordero191 0:156a9e15919e 691
miguelcordero191 0:156a9e15919e 692 int DDS::setAllDevice(char* payload, SerialDriver *screen){
miguelcordero191 0:156a9e15919e 693
miguelcordero191 0:156a9e15919e 694 int sts;
miguelcordero191 0:156a9e15919e 695 char* phase1, *phase2;
miguelcordero191 0:156a9e15919e 696 char* freq1, *freq2;
miguelcordero191 0:156a9e15919e 697 char* delta_freq, *upd_rate_clk, *ramp_rate_clk;
miguelcordero191 0:156a9e15919e 698 char* control_reg;
miguelcordero191 0:156a9e15919e 699 char* amplitudeI, *amplitudeQ, *ampl_ramp_rate;
miguelcordero191 0:156a9e15919e 700 char* qdac;
miguelcordero191 0:156a9e15919e 701
miguelcordero191 0:156a9e15919e 702 phase1 = &payload[0x00];
miguelcordero191 0:156a9e15919e 703 phase2 = &payload[0x02];
miguelcordero191 0:156a9e15919e 704 freq1 = &payload[0x04];
miguelcordero191 0:156a9e15919e 705 freq2 = &payload[0x0A];
miguelcordero191 0:156a9e15919e 706 delta_freq = &payload[0x10];
miguelcordero191 0:156a9e15919e 707 upd_rate_clk = &payload[0x16];
miguelcordero191 0:156a9e15919e 708 ramp_rate_clk = &payload[0x1A];
miguelcordero191 0:156a9e15919e 709 control_reg = &payload[0x1D];
miguelcordero191 0:156a9e15919e 710 amplitudeI = &payload[0x21];
miguelcordero191 0:156a9e15919e 711 amplitudeQ = &payload[0x23];
miguelcordero191 0:156a9e15919e 712 ampl_ramp_rate = &payload[0x25];
miguelcordero191 0:156a9e15919e 713 qdac = &payload[0x26];
miguelcordero191 0:156a9e15919e 714
miguelcordero191 0:156a9e15919e 715 control_reg[2] = control_reg[2] & 0xFE; //cr_ioupdclk always as an input = 0
miguelcordero191 0:156a9e15919e 716 control_reg[3] = control_reg[3] & 0xFD; //LSB first = 0, MSB first enabled
miguelcordero191 0:156a9e15919e 717 control_reg[3] = control_reg[3] | 0x01; //cr_sdo enable = 1
miguelcordero191 0:156a9e15919e 718
miguelcordero191 0:156a9e15919e 719 this->__writeDataAndVerify(0x04, 6, delta_freq);
miguelcordero191 0:156a9e15919e 720 this->__writeDataAndVerify(0x05, 4, upd_rate_clk);
miguelcordero191 0:156a9e15919e 721 this->__writeDataAndVerify(0x06, 3, ramp_rate_clk);
miguelcordero191 0:156a9e15919e 722 this->__writeDataAndVerify(0x07, 4, control_reg);
miguelcordero191 0:156a9e15919e 723
miguelcordero191 0:156a9e15919e 724 this->__writeDataAndVerify(0x0A, 1, ampl_ramp_rate);
miguelcordero191 0:156a9e15919e 725 this->__writeDataAndVerify(0x0B, 2, qdac, screen);
miguelcordero191 0:156a9e15919e 726
miguelcordero191 0:156a9e15919e 727 this->wrPhase1(phase1);
miguelcordero191 0:156a9e15919e 728 this->wrPhase2(phase2);
miguelcordero191 0:156a9e15919e 729 this->wrFrequency1(freq1);
miguelcordero191 0:156a9e15919e 730 this->wrFrequency2(freq2);
miguelcordero191 0:156a9e15919e 731 this->wrAmplitudeI(amplitudeI);
miguelcordero191 0:156a9e15919e 732 this->wrAmplitudeQ(amplitudeQ);
miguelcordero191 0:156a9e15919e 733
miguelcordero191 0:156a9e15919e 734 //Enabling RF
miguelcordero191 0:156a9e15919e 735 sts = this->enableRF();
miguelcordero191 0:156a9e15919e 736
miguelcordero191 0:156a9e15919e 737 return sts;
miguelcordero191 0:156a9e15919e 738
miguelcordero191 0:156a9e15919e 739 }
miguelcordero191 0:156a9e15919e 740
miguelcordero191 0:156a9e15919e 741 bool DDS::wasInitialized(){
miguelcordero191 0:156a9e15919e 742
miguelcordero191 0:156a9e15919e 743 return this->isConfig;
miguelcordero191 0:156a9e15919e 744 }
miguelcordero191 0:156a9e15919e 745
miguelcordero191 0:156a9e15919e 746 char DDS::getMultiplier(){
miguelcordero191 0:156a9e15919e 747 return this->cr_multiplier;
miguelcordero191 0:156a9e15919e 748 }
miguelcordero191 0:156a9e15919e 749
miguelcordero191 0:156a9e15919e 750 double DDS::getFreqFactor1(){
miguelcordero191 0:156a9e15919e 751 factor_freq1 = ((double)frequency1[0])/256.0 + ((double)frequency1[1])/65536.0 + ((double)frequency1[2])/16777216.0 + ((double)frequency1[3])/4294967296.0;
miguelcordero191 0:156a9e15919e 752 factor_freq1 *= ((double)this->cr_multiplier);
miguelcordero191 0:156a9e15919e 753
miguelcordero191 0:156a9e15919e 754 return factor_freq1;
miguelcordero191 0:156a9e15919e 755 }
miguelcordero191 0:156a9e15919e 756
miguelcordero191 0:156a9e15919e 757 double DDS::getFreqFactor2(){
miguelcordero191 0:156a9e15919e 758 factor_freq2 = ((double)frequency2[0])/256.0 + ((double)frequency2[1])/65536.0 + ((double)frequency2[2])/16777216.0 + ((double)frequency2[3])/4294967296.0;
miguelcordero191 0:156a9e15919e 759 factor_freq2 *= ((double)this->cr_multiplier);
miguelcordero191 0:156a9e15919e 760
miguelcordero191 0:156a9e15919e 761 return factor_freq2;
miguelcordero191 0:156a9e15919e 762 }
miguelcordero191 0:156a9e15919e 763
miguelcordero191 0:156a9e15919e 764 char DDS::getMode(){
miguelcordero191 0:156a9e15919e 765 return this->cr_mode;
miguelcordero191 0:156a9e15919e 766 }
miguelcordero191 0:156a9e15919e 767
miguelcordero191 0:156a9e15919e 768 char* DDS::getModeStr(){
miguelcordero191 0:156a9e15919e 769
miguelcordero191 0:156a9e15919e 770 if (this->cr_mode > 4)
miguelcordero191 0:156a9e15919e 771 return MODULATION[5];
miguelcordero191 0:156a9e15919e 772
miguelcordero191 0:156a9e15919e 773 return MODULATION[this->cr_mode];
miguelcordero191 0:156a9e15919e 774 }