DDS AD9854, library to configure a AD9854 Serial Interface (SPI)
Dependents: JRO_DDSv2 JRO_DDSv2_rev2019
AD9854.cpp@0:156a9e15919e, 2015-02-24 (annotated)
- 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?
User | Revision | Line number | New 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 | } |