Joaquin Verastegui / jro

Dependents:   JRO_CR2 frdm_test

Fork of jro by Miguel Urco

Committer:
miguelcordero191
Date:
Thu Feb 05 19:01:42 2015 +0000
Revision:
2:3d8d52e9751c
Child:
3:f0e6c145b075
serial and ethernet working with threads.; serial baudrate = 1000000; dhcp is working well but static ip is not.

Who changed what in which revision?

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