Joaquin Verastegui / jro

Dependents:   JRO_CR2 frdm_test

Fork of jro by Miguel Urco

Committer:
miguelcordero191
Date:
Thu Dec 04 14:35:52 2014 +0000
Revision:
1:7c424a3e12ea
Parent:
0:b444ea725ba7
First release: write and read process working very well

Who changed what in which revision?

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