Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of jro by
JroDDS.cpp@4:de495ce256b8, 2015-02-10 (annotated)
- Committer:
- miguelcordero191
- Date:
- Tue Feb 10 14:28:42 2015 +0000
- Revision:
- 4:de495ce256b8
- Parent:
- 3:f0e6c145b075
Some features were added to library
Who changed what in which revision?
| User | Revision | Line number | New 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 | 4:de495ce256b8 | 111 | int 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 | 4:de495ce256b8 | 212 | |
| miguelcordero191 | 4:de495ce256b8 | 213 | this->rf_enabled = false; |
| miguelcordero191 | 4:de495ce256b8 | 214 | |
| miguelcordero191 | 2:3d8d52e9751c | 215 | return 0; |
| miguelcordero191 | 2:3d8d52e9751c | 216 | } |
| miguelcordero191 | 2:3d8d52e9751c | 217 | |
| miguelcordero191 | 2:3d8d52e9751c | 218 | int DDS::scanIOUpdate(){ |
| miguelcordero191 | 2:3d8d52e9751c | 219 | |
| miguelcordero191 | 2:3d8d52e9751c | 220 | unsigned int cont = 0; |
| miguelcordero191 | 2:3d8d52e9751c | 221 | |
| miguelcordero191 | 2:3d8d52e9751c | 222 | this->reset(); |
| miguelcordero191 | 2:3d8d52e9751c | 223 | |
| miguelcordero191 | 2:3d8d52e9751c | 224 | //printf("\r\nWaiting a upd_clk ...\r\n"); |
| miguelcordero191 | 2:3d8d52e9751c | 225 | while(true){ |
| miguelcordero191 | 2:3d8d52e9751c | 226 | if (*dds_updclk == 1) |
| miguelcordero191 | 2:3d8d52e9751c | 227 | break; |
| miguelcordero191 | 2:3d8d52e9751c | 228 | |
| miguelcordero191 | 2:3d8d52e9751c | 229 | cont += 1; |
| miguelcordero191 | 2:3d8d52e9751c | 230 | if (cont > 10000) |
| miguelcordero191 | 2:3d8d52e9751c | 231 | break; |
| miguelcordero191 | 2:3d8d52e9751c | 232 | |
| miguelcordero191 | 2:3d8d52e9751c | 233 | wait_us(1); |
| miguelcordero191 | 2:3d8d52e9751c | 234 | } |
| miguelcordero191 | 2:3d8d52e9751c | 235 | |
| miguelcordero191 | 2:3d8d52e9751c | 236 | if (cont > 10000){ |
| miguelcordero191 | 2:3d8d52e9751c | 237 | //printf("\r\nA upd_clk was not found\r\n"); |
| miguelcordero191 | 2:3d8d52e9751c | 238 | return 0; |
| miguelcordero191 | 2:3d8d52e9751c | 239 | } |
| miguelcordero191 | 2:3d8d52e9751c | 240 | |
| miguelcordero191 | 2:3d8d52e9751c | 241 | //printf("\r\nA upd_clk was found ...\r\n"); |
| miguelcordero191 | 2:3d8d52e9751c | 242 | |
| miguelcordero191 | 2:3d8d52e9751c | 243 | return 1; |
| miguelcordero191 | 2:3d8d52e9751c | 244 | } |
| miguelcordero191 | 2:3d8d52e9751c | 245 | |
| miguelcordero191 | 2:3d8d52e9751c | 246 | int DDS::find(){ |
| miguelcordero191 | 2:3d8d52e9751c | 247 | /* |
| miguelcordero191 | 2:3d8d52e9751c | 248 | char phase[]; |
| miguelcordero191 | 2:3d8d52e9751c | 249 | |
| miguelcordero191 | 2:3d8d52e9751c | 250 | phase[0] = 0x0A; |
| miguelcordero191 | 2:3d8d52e9751c | 251 | phase[1] = 0x55; |
| miguelcordero191 | 2:3d8d52e9751c | 252 | |
| miguelcordero191 | 2:3d8d52e9751c | 253 | this->__writeDataAndVerify(0x00, 5, phase); |
| miguelcordero191 | 2:3d8d52e9751c | 254 | */ |
| miguelcordero191 | 2:3d8d52e9751c | 255 | this->__readData(0x05, 4); |
| miguelcordero191 | 2:3d8d52e9751c | 256 | this->__readData(0x0A, 1); |
| miguelcordero191 | 2:3d8d52e9751c | 257 | return 1; |
| miguelcordero191 | 2:3d8d52e9751c | 258 | |
| miguelcordero191 | 2:3d8d52e9751c | 259 | } |
| miguelcordero191 | 2:3d8d52e9751c | 260 | |
| miguelcordero191 | 2:3d8d52e9751c | 261 | |
| miguelcordero191 | 2:3d8d52e9751c | 262 | int DDS::init(){ |
| miguelcordero191 | 2:3d8d52e9751c | 263 | |
| miguelcordero191 | 2:3d8d52e9751c | 264 | //printf("\r\nSetting default parameters in CR ...\r\n"); |
| miguelcordero191 | 2:3d8d52e9751c | 265 | |
| miguelcordero191 | 2:3d8d52e9751c | 266 | //Serial mode enabled |
| miguelcordero191 | 2:3d8d52e9751c | 267 | this->frequency = 200.0; // Work frequency in MHz |
| miguelcordero191 | 2:3d8d52e9751c | 268 | this->cr_multiplier = 4; // Multiplier 4- 20 |
| miguelcordero191 | 2:3d8d52e9751c | 269 | this->cr_mode = 0; // Single, FSK, Ramped FSK, Chirp, BPSK |
| miguelcordero191 | 2:3d8d52e9751c | 270 | this->cr_qdac_pwdn = 0; // QDAC power down enabled: 0 -> disable |
| miguelcordero191 | 2:3d8d52e9751c | 271 | this->cr_ioupdclk = 0; // IO Update clock direction: 0 -> input, 1 -> output |
| miguelcordero191 | 2:3d8d52e9751c | 272 | this->cr_inv_sinc = 0; // Sinc inverser filter enable: 0 -> enable |
| miguelcordero191 | 2:3d8d52e9751c | 273 | this->cr_osk_en = 1; // Enable Amplitude multiplier: 0 -> disabled |
| miguelcordero191 | 2:3d8d52e9751c | 274 | this->cr_osk_int = 0; // register/counter output shaped control: 0 -> register, 1 -> counter |
| miguelcordero191 | 2:3d8d52e9751c | 275 | this->cr_msb_lsb = 0; // msb/lsb bit first: 0 -> MSB, 1 -> LSB |
| miguelcordero191 | 2:3d8d52e9751c | 276 | this->cr_sdo = 1; // SDO pin active: 0 -> inactive |
| miguelcordero191 | 2:3d8d52e9751c | 277 | |
| miguelcordero191 | 2:3d8d52e9751c | 278 | //printf("\r\nSetting in serial mode ...\r\n"); |
| miguelcordero191 | 2:3d8d52e9751c | 279 | *dds_sp_mode = 0; |
| miguelcordero191 | 2:3d8d52e9751c | 280 | *dds_cs = 1; |
| miguelcordero191 | 2:3d8d52e9751c | 281 | |
| miguelcordero191 | 2:3d8d52e9751c | 282 | this->reset(); |
| miguelcordero191 | 2:3d8d52e9751c | 283 | |
| miguelcordero191 | 2:3d8d52e9751c | 284 | //printf("\r\nWritting CR ...\r\n"); |
| miguelcordero191 | 2:3d8d52e9751c | 285 | |
| miguelcordero191 | 2:3d8d52e9751c | 286 | if (not this->__writeControlRegister()){ |
| miguelcordero191 | 2:3d8d52e9751c | 287 | //printf("\r\nUnsuccessful DDS initialization"); |
| miguelcordero191 | 2:3d8d52e9751c | 288 | this->isConfig = false; |
| miguelcordero191 | 2:3d8d52e9751c | 289 | return false; |
| miguelcordero191 | 2:3d8d52e9751c | 290 | } |
| miguelcordero191 | 2:3d8d52e9751c | 291 | |
| miguelcordero191 | 2:3d8d52e9751c | 292 | //printf("\r\nSuccessfull DDS initialization"); |
| miguelcordero191 | 2:3d8d52e9751c | 293 | |
| miguelcordero191 | 2:3d8d52e9751c | 294 | this->isConfig = true; |
| miguelcordero191 | 2:3d8d52e9751c | 295 | |
| miguelcordero191 | 2:3d8d52e9751c | 296 | return true; |
| miguelcordero191 | 2:3d8d52e9751c | 297 | } |
| miguelcordero191 | 2:3d8d52e9751c | 298 | |
| miguelcordero191 | 2:3d8d52e9751c | 299 | char* DDS::rdMode(){ |
| miguelcordero191 | 2:3d8d52e9751c | 300 | |
| miguelcordero191 | 2:3d8d52e9751c | 301 | char* rd_data; |
| miguelcordero191 | 2:3d8d52e9751c | 302 | char mode; |
| miguelcordero191 | 2:3d8d52e9751c | 303 | |
| miguelcordero191 | 2:3d8d52e9751c | 304 | rd_data = this->__readData(0x07, 4); |
| miguelcordero191 | 2:3d8d52e9751c | 305 | mode = (rd_data[2] & 0x0E) >> 1; |
| miguelcordero191 | 2:3d8d52e9751c | 306 | |
| miguelcordero191 | 2:3d8d52e9751c | 307 | rd_data[0] = mode; |
| miguelcordero191 | 2:3d8d52e9751c | 308 | |
| miguelcordero191 | 2:3d8d52e9751c | 309 | return rd_data; |
| miguelcordero191 | 2:3d8d52e9751c | 310 | } |
| miguelcordero191 | 2:3d8d52e9751c | 311 | |
| miguelcordero191 | 2:3d8d52e9751c | 312 | char* DDS::rdMultiplier(){ |
| miguelcordero191 | 2:3d8d52e9751c | 313 | |
| miguelcordero191 | 2:3d8d52e9751c | 314 | char* rd_data; |
| miguelcordero191 | 2:3d8d52e9751c | 315 | char mult; |
| miguelcordero191 | 2:3d8d52e9751c | 316 | |
| miguelcordero191 | 2:3d8d52e9751c | 317 | rd_data = this->__readData(0x07, 4); |
| miguelcordero191 | 2:3d8d52e9751c | 318 | mult = (rd_data[1] & 0x1F); |
| miguelcordero191 | 2:3d8d52e9751c | 319 | |
| miguelcordero191 | 2:3d8d52e9751c | 320 | rd_data[0] = mult; |
| miguelcordero191 | 2:3d8d52e9751c | 321 | rd_data[1] = ((int)clock >> 8) & 0xff; |
| miguelcordero191 | 2:3d8d52e9751c | 322 | rd_data[2] = (int)clock & 0xff; |
| miguelcordero191 | 2:3d8d52e9751c | 323 | |
| miguelcordero191 | 2:3d8d52e9751c | 324 | return rd_data; |
| miguelcordero191 | 2:3d8d52e9751c | 325 | } |
| miguelcordero191 | 2:3d8d52e9751c | 326 | char* DDS::rdPhase1(){ |
| miguelcordero191 | 2:3d8d52e9751c | 327 | |
| miguelcordero191 | 2:3d8d52e9751c | 328 | char* rd_data; |
| miguelcordero191 | 2:3d8d52e9751c | 329 | |
| miguelcordero191 | 2:3d8d52e9751c | 330 | rd_data = this->__readData(0x00, 2); |
| miguelcordero191 | 2:3d8d52e9751c | 331 | |
| miguelcordero191 | 2:3d8d52e9751c | 332 | return rd_data; |
| miguelcordero191 | 2:3d8d52e9751c | 333 | |
| miguelcordero191 | 2:3d8d52e9751c | 334 | } |
| miguelcordero191 | 2:3d8d52e9751c | 335 | char* DDS::rdPhase2(){ |
| miguelcordero191 | 2:3d8d52e9751c | 336 | |
| miguelcordero191 | 2:3d8d52e9751c | 337 | char* rd_data; |
| miguelcordero191 | 2:3d8d52e9751c | 338 | |
| miguelcordero191 | 2:3d8d52e9751c | 339 | rd_data = this->__readData(0x01, 2); |
| miguelcordero191 | 2:3d8d52e9751c | 340 | |
| miguelcordero191 | 2:3d8d52e9751c | 341 | return rd_data; |
| miguelcordero191 | 2:3d8d52e9751c | 342 | } |
| miguelcordero191 | 2:3d8d52e9751c | 343 | char* DDS::rdFrequency1(){ |
| miguelcordero191 | 2:3d8d52e9751c | 344 | |
| miguelcordero191 | 2:3d8d52e9751c | 345 | char* rd_data; |
| miguelcordero191 | 2:3d8d52e9751c | 346 | |
| miguelcordero191 | 2:3d8d52e9751c | 347 | rd_data = this->__readData(0x02, 6); |
| miguelcordero191 | 2:3d8d52e9751c | 348 | |
| miguelcordero191 | 2:3d8d52e9751c | 349 | return rd_data; |
| miguelcordero191 | 2:3d8d52e9751c | 350 | |
| miguelcordero191 | 2:3d8d52e9751c | 351 | } |
| miguelcordero191 | 2:3d8d52e9751c | 352 | char* DDS::rdFrequency2(){ |
| miguelcordero191 | 2:3d8d52e9751c | 353 | |
| miguelcordero191 | 2:3d8d52e9751c | 354 | char* rd_data; |
| miguelcordero191 | 2:3d8d52e9751c | 355 | |
| miguelcordero191 | 2:3d8d52e9751c | 356 | rd_data = this->__readData(0x03, 6); |
| miguelcordero191 | 2:3d8d52e9751c | 357 | |
| miguelcordero191 | 2:3d8d52e9751c | 358 | return rd_data; |
| miguelcordero191 | 2:3d8d52e9751c | 359 | } |
| miguelcordero191 | 2:3d8d52e9751c | 360 | char* DDS::rdAmplitudeI(){ |
| miguelcordero191 | 2:3d8d52e9751c | 361 | |
| miguelcordero191 | 2:3d8d52e9751c | 362 | char* rd_data; |
| miguelcordero191 | 2:3d8d52e9751c | 363 | |
| miguelcordero191 | 2:3d8d52e9751c | 364 | rd_data = this->__readData(0x08, 2); |
| miguelcordero191 | 2:3d8d52e9751c | 365 | |
| miguelcordero191 | 2:3d8d52e9751c | 366 | return rd_data; |
| miguelcordero191 | 2:3d8d52e9751c | 367 | } |
| miguelcordero191 | 2:3d8d52e9751c | 368 | char* DDS::rdAmplitudeQ(){ |
| miguelcordero191 | 2:3d8d52e9751c | 369 | |
| miguelcordero191 | 2:3d8d52e9751c | 370 | char* rd_data; |
| miguelcordero191 | 2:3d8d52e9751c | 371 | |
| miguelcordero191 | 2:3d8d52e9751c | 372 | rd_data = this->__readData(0x09, 2); |
| miguelcordero191 | 2:3d8d52e9751c | 373 | |
| miguelcordero191 | 2:3d8d52e9751c | 374 | return rd_data; |
| miguelcordero191 | 2:3d8d52e9751c | 375 | } |
| miguelcordero191 | 4:de495ce256b8 | 376 | |
| miguelcordero191 | 4:de495ce256b8 | 377 | int DDS::isRFEnabled(){ |
| miguelcordero191 | 4:de495ce256b8 | 378 | |
| miguelcordero191 | 4:de495ce256b8 | 379 | if (this->rf_enabled) |
| miguelcordero191 | 4:de495ce256b8 | 380 | return 1; |
| miguelcordero191 | 4:de495ce256b8 | 381 | |
| miguelcordero191 | 4:de495ce256b8 | 382 | return 0; |
| miguelcordero191 | 4:de495ce256b8 | 383 | } |
| miguelcordero191 | 2:3d8d52e9751c | 384 | |
| miguelcordero191 | 2:3d8d52e9751c | 385 | int DDS::wrMode(char mode){ |
| miguelcordero191 | 2:3d8d52e9751c | 386 | |
| miguelcordero191 | 2:3d8d52e9751c | 387 | this->cr_mode = mode & 0x07; |
| 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::wrMultiplier(char multiplier, float clock){ |
| miguelcordero191 | 2:3d8d52e9751c | 393 | |
| miguelcordero191 | 2:3d8d52e9751c | 394 | this->cr_multiplier = multiplier & 0x1F; |
| miguelcordero191 | 2:3d8d52e9751c | 395 | this->frequency = clock; |
| miguelcordero191 | 2:3d8d52e9751c | 396 | |
| miguelcordero191 | 2:3d8d52e9751c | 397 | //printf("\r\n mult = %d, clock = %f", multiplier, clock); |
| miguelcordero191 | 2:3d8d52e9751c | 398 | //printf("\r\n cr_mult = %d", cr_multiplier); |
| miguelcordero191 | 2:3d8d52e9751c | 399 | |
| miguelcordero191 | 2:3d8d52e9751c | 400 | return this->__writeControlRegister(); |
| miguelcordero191 | 2:3d8d52e9751c | 401 | } |
| miguelcordero191 | 2:3d8d52e9751c | 402 | |
| miguelcordero191 | 2:3d8d52e9751c | 403 | int DDS::wrPhase1(char* phase, SerialDriver *screen){ |
| miguelcordero191 | 2:3d8d52e9751c | 404 | |
| miguelcordero191 | 2:3d8d52e9751c | 405 | return this->__writeDataAndVerify(0x00, 2, phase, screen); |
| miguelcordero191 | 2:3d8d52e9751c | 406 | |
| miguelcordero191 | 2:3d8d52e9751c | 407 | } |
| miguelcordero191 | 2:3d8d52e9751c | 408 | |
| miguelcordero191 | 2:3d8d52e9751c | 409 | int DDS::wrPhase2(char* phase, SerialDriver *screen){ |
| miguelcordero191 | 2:3d8d52e9751c | 410 | |
| miguelcordero191 | 2:3d8d52e9751c | 411 | return this->__writeDataAndVerify(0x01, 2, phase, screen); |
| miguelcordero191 | 2:3d8d52e9751c | 412 | |
| miguelcordero191 | 2:3d8d52e9751c | 413 | } |
| miguelcordero191 | 2:3d8d52e9751c | 414 | |
| miguelcordero191 | 2:3d8d52e9751c | 415 | int DDS::wrFrequency1(char* freq, SerialDriver *screen){ |
| miguelcordero191 | 2:3d8d52e9751c | 416 | |
| miguelcordero191 | 2:3d8d52e9751c | 417 | return this->__writeDataAndVerify(0x02, 6, freq, screen); |
| miguelcordero191 | 2:3d8d52e9751c | 418 | |
| miguelcordero191 | 2:3d8d52e9751c | 419 | } |
| miguelcordero191 | 2:3d8d52e9751c | 420 | int DDS::wrFrequency2(char* freq, SerialDriver *screen){ |
| miguelcordero191 | 2:3d8d52e9751c | 421 | |
| miguelcordero191 | 2:3d8d52e9751c | 422 | return this->__writeDataAndVerify(0x03, 6, freq, screen); |
| miguelcordero191 | 2:3d8d52e9751c | 423 | |
| miguelcordero191 | 2:3d8d52e9751c | 424 | } |
| miguelcordero191 | 2:3d8d52e9751c | 425 | |
| miguelcordero191 | 2:3d8d52e9751c | 426 | int DDS::wrAmplitudeI(char* amplitude, SerialDriver *screen){ |
| miguelcordero191 | 2:3d8d52e9751c | 427 | |
| miguelcordero191 | 2:3d8d52e9751c | 428 | amplitudeI[0] = amplitude[0]; |
| miguelcordero191 | 2:3d8d52e9751c | 429 | amplitudeI[1] = amplitude[1]; |
| miguelcordero191 | 2:3d8d52e9751c | 430 | |
| miguelcordero191 | 2:3d8d52e9751c | 431 | return this->__writeDataAndVerify(0x08, 2, amplitude, screen); |
| miguelcordero191 | 2:3d8d52e9751c | 432 | |
| miguelcordero191 | 2:3d8d52e9751c | 433 | } |
| miguelcordero191 | 2:3d8d52e9751c | 434 | |
| miguelcordero191 | 2:3d8d52e9751c | 435 | int DDS::wrAmplitudeQ(char* amplitude, SerialDriver *screen){ |
| miguelcordero191 | 2:3d8d52e9751c | 436 | |
| miguelcordero191 | 2:3d8d52e9751c | 437 | amplitudeQ[0] = amplitude[0]; |
| miguelcordero191 | 2:3d8d52e9751c | 438 | amplitudeQ[1] = amplitude[1]; |
| miguelcordero191 | 2:3d8d52e9751c | 439 | |
| miguelcordero191 | 2:3d8d52e9751c | 440 | return this->__writeDataAndVerify(0x09, 2, amplitude, screen); |
| miguelcordero191 | 2:3d8d52e9751c | 441 | |
| miguelcordero191 | 2:3d8d52e9751c | 442 | } |
| miguelcordero191 | 2:3d8d52e9751c | 443 | |
| miguelcordero191 | 2:3d8d52e9751c | 444 | int DDS::enableRF(){ |
| miguelcordero191 | 2:3d8d52e9751c | 445 | |
| miguelcordero191 | 2:3d8d52e9751c | 446 | this->rf_enabled = true; |
| miguelcordero191 | 2:3d8d52e9751c | 447 | |
| miguelcordero191 | 2:3d8d52e9751c | 448 | this->__writeDataAndVerify(0x08, 2, this->amplitudeI); |
| miguelcordero191 | 4:de495ce256b8 | 449 | return this->__writeDataAndVerify(0x09, 2, this->amplitudeQ); |
| miguelcordero191 | 4:de495ce256b8 | 450 | |
| miguelcordero191 | 2:3d8d52e9751c | 451 | } |
| miguelcordero191 | 2:3d8d52e9751c | 452 | |
| miguelcordero191 | 2:3d8d52e9751c | 453 | int DDS::disableRF(){ |
| miguelcordero191 | 2:3d8d52e9751c | 454 | |
| miguelcordero191 | 2:3d8d52e9751c | 455 | this->rf_enabled = false; |
| miguelcordero191 | 2:3d8d52e9751c | 456 | |
| miguelcordero191 | 2:3d8d52e9751c | 457 | this->__writeDataAndVerify(0x08, 2, "\x00\x00"); |
| miguelcordero191 | 4:de495ce256b8 | 458 | return this->__writeDataAndVerify(0x09, 2, "\x00\x00"); |
| miguelcordero191 | 2:3d8d52e9751c | 459 | |
| miguelcordero191 | 2:3d8d52e9751c | 460 | } |
| miguelcordero191 | 2:3d8d52e9751c | 461 | |
| miguelcordero191 | 2:3d8d52e9751c | 462 | int DDS::defaultSettings(SerialDriver *screen){ |
| miguelcordero191 | 3:f0e6c145b075 | 463 | |
| miguelcordero191 | 3:f0e6c145b075 | 464 | if (!(screen == NULL)){ |
| miguelcordero191 | 3:f0e6c145b075 | 465 | screen->putc(0x37); |
| miguelcordero191 | 3:f0e6c145b075 | 466 | screen->putc(0x30); |
| miguelcordero191 | 3:f0e6c145b075 | 467 | } |
| miguelcordero191 | 2:3d8d52e9751c | 468 | |
| miguelcordero191 | 2:3d8d52e9751c | 469 | this->wrMultiplier(1, 0.0); |
| miguelcordero191 | 4:de495ce256b8 | 470 | this->wrAmplitudeI("\x0F\xC0", screen); //0xFC0 produces best SFDR than 0xFFF |
| miguelcordero191 | 2:3d8d52e9751c | 471 | this->wrAmplitudeQ("\x0F\xC0"); //0xFC0 produces best SFDR than 0xFFF |
| miguelcordero191 | 2:3d8d52e9751c | 472 | 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 | 473 | this->wrFrequency2("\x00\x00\x00\x00\x00\x00"); |
| miguelcordero191 | 2:3d8d52e9751c | 474 | this->wrPhase1("\x00\x00"); //0 grados |
| miguelcordero191 | 4:de495ce256b8 | 475 | this->wrPhase2("\x20\x00"); //180 grados <> 0x20 0x00 <> 180/360*(2**14) |
| miguelcordero191 | 4:de495ce256b8 | 476 | this->disableRF(); |
| miguelcordero191 | 4:de495ce256b8 | 477 | |
| miguelcordero191 | 3:f0e6c145b075 | 478 | if (!(screen == NULL)){ |
| miguelcordero191 | 3:f0e6c145b075 | 479 | screen->putc(0x37); |
| miguelcordero191 | 3:f0e6c145b075 | 480 | screen->putc(0x31); |
| miguelcordero191 | 3:f0e6c145b075 | 481 | } |
| miguelcordero191 | 2:3d8d52e9751c | 482 | |
| miguelcordero191 | 2:3d8d52e9751c | 483 | return this->wrMode(4); //BPSK mode |
| miguelcordero191 | 2:3d8d52e9751c | 484 | |
| miguelcordero191 | 2:3d8d52e9751c | 485 | } |
| miguelcordero191 | 2:3d8d52e9751c | 486 | |
| miguelcordero191 | 2:3d8d52e9751c | 487 | char* DDS::setCommand(unsigned short cmd, char* payload, unsigned long payload_len){ |
| miguelcordero191 | 2:3d8d52e9751c | 488 | |
| miguelcordero191 | 2:3d8d52e9751c | 489 | bool success = false; |
| miguelcordero191 | 2:3d8d52e9751c | 490 | char* tx_msg; |
| miguelcordero191 | 2:3d8d52e9751c | 491 | unsigned long tx_msg_len; |
| miguelcordero191 | 2:3d8d52e9751c | 492 | |
| miguelcordero191 | 2:3d8d52e9751c | 493 | tx_msg = KO_MSG; |
| miguelcordero191 | 2:3d8d52e9751c | 494 | tx_msg_len = 2; |
| miguelcordero191 | 2:3d8d52e9751c | 495 | |
| miguelcordero191 | 2:3d8d52e9751c | 496 | //printf("cmd = %d, payload_len = %d", cmd, payload_len); |
| miguelcordero191 | 2:3d8d52e9751c | 497 | |
| miguelcordero191 | 2:3d8d52e9751c | 498 | //printf("\r\nPayload = "); |
| miguelcordero191 | 2:3d8d52e9751c | 499 | //for(unsigned long i=0; i< payload_len; i++) |
| miguelcordero191 | 2:3d8d52e9751c | 500 | //printf("0x%x ", payload[i]); |
| miguelcordero191 | 2:3d8d52e9751c | 501 | |
| miguelcordero191 | 2:3d8d52e9751c | 502 | //Si el DDS no esta inicializado siempre retornar NI_MSG |
| miguelcordero191 | 2:3d8d52e9751c | 503 | if (not this->isConfig){ |
| miguelcordero191 | 2:3d8d52e9751c | 504 | this->cmd_answer = NI_MSG; |
| miguelcordero191 | 2:3d8d52e9751c | 505 | this->cmd_answer_len = 2; |
| miguelcordero191 | 2:3d8d52e9751c | 506 | |
| miguelcordero191 | 2:3d8d52e9751c | 507 | return this->cmd_answer; |
| miguelcordero191 | 2:3d8d52e9751c | 508 | } |
| miguelcordero191 | 2:3d8d52e9751c | 509 | |
| miguelcordero191 | 2:3d8d52e9751c | 510 | switch ( cmd ) |
| miguelcordero191 | 2:3d8d52e9751c | 511 | { |
| miguelcordero191 | 3:f0e6c145b075 | 512 | case DDS_CMD_RESET: |
| miguelcordero191 | 2:3d8d52e9751c | 513 | success = this->init(); |
| miguelcordero191 | 2:3d8d52e9751c | 514 | break; |
| miguelcordero191 | 2:3d8d52e9751c | 515 | |
| miguelcordero191 | 3:f0e6c145b075 | 516 | case DDS_CMD_ENABLE_RF: |
| miguelcordero191 | 2:3d8d52e9751c | 517 | if (payload_len == 1){ |
| miguelcordero191 | 2:3d8d52e9751c | 518 | if (payload[0] == 0) |
| miguelcordero191 | 2:3d8d52e9751c | 519 | success = this->disableRF(); |
| miguelcordero191 | 2:3d8d52e9751c | 520 | else |
| miguelcordero191 | 2:3d8d52e9751c | 521 | success = this->enableRF(); |
| miguelcordero191 | 2:3d8d52e9751c | 522 | } |
| miguelcordero191 | 2:3d8d52e9751c | 523 | break; |
| miguelcordero191 | 2:3d8d52e9751c | 524 | |
| miguelcordero191 | 3:f0e6c145b075 | 525 | case DDS_CMD_MULTIPLIER: |
| miguelcordero191 | 2:3d8d52e9751c | 526 | if (payload_len == 3){ |
| miguelcordero191 | 2:3d8d52e9751c | 527 | unsigned short clock = payload[1]*256 + payload[2]; |
| miguelcordero191 | 2:3d8d52e9751c | 528 | success = this->wrMultiplier(payload[0], (float)clock); |
| miguelcordero191 | 2:3d8d52e9751c | 529 | } |
| miguelcordero191 | 2:3d8d52e9751c | 530 | break; |
| miguelcordero191 | 2:3d8d52e9751c | 531 | |
| miguelcordero191 | 3:f0e6c145b075 | 532 | case DDS_CMD_MODE: |
| miguelcordero191 | 2:3d8d52e9751c | 533 | if (payload_len == 1){ |
| miguelcordero191 | 2:3d8d52e9751c | 534 | success = this->wrMode(payload[0]); |
| miguelcordero191 | 2:3d8d52e9751c | 535 | } |
| miguelcordero191 | 2:3d8d52e9751c | 536 | break; |
| miguelcordero191 | 2:3d8d52e9751c | 537 | |
| miguelcordero191 | 3:f0e6c145b075 | 538 | case DDS_CMD_FREQUENCY1: |
| miguelcordero191 | 2:3d8d52e9751c | 539 | if (payload_len == 6){ |
| miguelcordero191 | 2:3d8d52e9751c | 540 | success = this->wrFrequency1(payload); |
| miguelcordero191 | 2:3d8d52e9751c | 541 | } |
| miguelcordero191 | 2:3d8d52e9751c | 542 | break; |
| miguelcordero191 | 2:3d8d52e9751c | 543 | |
| miguelcordero191 | 3:f0e6c145b075 | 544 | case DDS_CMD_FREQUENCY2: |
| miguelcordero191 | 2:3d8d52e9751c | 545 | if (payload_len == 6){ |
| miguelcordero191 | 2:3d8d52e9751c | 546 | success = this->wrFrequency2(payload); |
| miguelcordero191 | 2:3d8d52e9751c | 547 | } |
| miguelcordero191 | 2:3d8d52e9751c | 548 | break; |
| miguelcordero191 | 2:3d8d52e9751c | 549 | |
| miguelcordero191 | 3:f0e6c145b075 | 550 | case DDS_CMD_PHASE1: |
| miguelcordero191 | 2:3d8d52e9751c | 551 | if (payload_len == 2){ |
| miguelcordero191 | 2:3d8d52e9751c | 552 | success = this->wrPhase1(payload); |
| miguelcordero191 | 2:3d8d52e9751c | 553 | } |
| miguelcordero191 | 2:3d8d52e9751c | 554 | break; |
| miguelcordero191 | 2:3d8d52e9751c | 555 | |
| miguelcordero191 | 3:f0e6c145b075 | 556 | case DDS_CMD_PHASE2: |
| miguelcordero191 | 2:3d8d52e9751c | 557 | if (payload_len == 2){ |
| miguelcordero191 | 2:3d8d52e9751c | 558 | success = this->wrPhase2(payload); |
| miguelcordero191 | 2:3d8d52e9751c | 559 | } |
| miguelcordero191 | 2:3d8d52e9751c | 560 | break; |
| miguelcordero191 | 2:3d8d52e9751c | 561 | |
| miguelcordero191 | 3:f0e6c145b075 | 562 | case DDS_CMD_AMPLITUDEI: |
| miguelcordero191 | 2:3d8d52e9751c | 563 | if (payload_len == 2){ |
| miguelcordero191 | 2:3d8d52e9751c | 564 | success = this->wrAmplitudeI(payload); |
| miguelcordero191 | 2:3d8d52e9751c | 565 | } |
| miguelcordero191 | 2:3d8d52e9751c | 566 | break; |
| miguelcordero191 | 2:3d8d52e9751c | 567 | |
| miguelcordero191 | 3:f0e6c145b075 | 568 | case DDS_CMD_AMPLITUDEQ: |
| miguelcordero191 | 2:3d8d52e9751c | 569 | if (payload_len == 2){ |
| miguelcordero191 | 2:3d8d52e9751c | 570 | success = this->wrAmplitudeQ(payload); |
| miguelcordero191 | 2:3d8d52e9751c | 571 | } |
| miguelcordero191 | 2:3d8d52e9751c | 572 | break; |
| miguelcordero191 | 2:3d8d52e9751c | 573 | |
| miguelcordero191 | 3:f0e6c145b075 | 574 | case DDS_CMD_READ | DDS_CMD_ENABLE_RF: |
| miguelcordero191 | 4:de495ce256b8 | 575 | if (this->isRFEnabled() == 1) |
| miguelcordero191 | 2:3d8d52e9751c | 576 | tx_msg = "\x01"; |
| miguelcordero191 | 2:3d8d52e9751c | 577 | else |
| miguelcordero191 | 2:3d8d52e9751c | 578 | tx_msg = "\x00"; |
| miguelcordero191 | 2:3d8d52e9751c | 579 | |
| miguelcordero191 | 2:3d8d52e9751c | 580 | tx_msg_len = 1; |
| miguelcordero191 | 2:3d8d52e9751c | 581 | |
| miguelcordero191 | 2:3d8d52e9751c | 582 | break; |
| miguelcordero191 | 2:3d8d52e9751c | 583 | |
| miguelcordero191 | 3:f0e6c145b075 | 584 | case DDS_CMD_READ | DDS_CMD_MULTIPLIER: |
| miguelcordero191 | 2:3d8d52e9751c | 585 | tx_msg = this->rdMultiplier(); |
| miguelcordero191 | 2:3d8d52e9751c | 586 | tx_msg_len = 3; |
| miguelcordero191 | 2:3d8d52e9751c | 587 | break; |
| miguelcordero191 | 2:3d8d52e9751c | 588 | |
| miguelcordero191 | 3:f0e6c145b075 | 589 | case DDS_CMD_READ | DDS_CMD_MODE: |
| miguelcordero191 | 2:3d8d52e9751c | 590 | tx_msg = this->rdMode(); |
| miguelcordero191 | 2:3d8d52e9751c | 591 | tx_msg_len = 1; |
| miguelcordero191 | 2:3d8d52e9751c | 592 | break; |
| miguelcordero191 | 2:3d8d52e9751c | 593 | |
| miguelcordero191 | 3:f0e6c145b075 | 594 | case DDS_CMD_READ | DDS_CMD_FREQUENCY1: |
| miguelcordero191 | 2:3d8d52e9751c | 595 | tx_msg = this->rdFrequency1(); |
| miguelcordero191 | 2:3d8d52e9751c | 596 | tx_msg_len = 6; |
| miguelcordero191 | 2:3d8d52e9751c | 597 | break; |
| miguelcordero191 | 2:3d8d52e9751c | 598 | |
| miguelcordero191 | 3:f0e6c145b075 | 599 | case DDS_CMD_READ | DDS_CMD_FREQUENCY2: |
| miguelcordero191 | 2:3d8d52e9751c | 600 | tx_msg = this->rdFrequency2(); |
| miguelcordero191 | 2:3d8d52e9751c | 601 | tx_msg_len = 6; |
| miguelcordero191 | 2:3d8d52e9751c | 602 | break; |
| miguelcordero191 | 2:3d8d52e9751c | 603 | |
| miguelcordero191 | 3:f0e6c145b075 | 604 | case DDS_CMD_READ | DDS_CMD_PHASE1: |
| miguelcordero191 | 2:3d8d52e9751c | 605 | tx_msg = this->rdPhase1(); |
| miguelcordero191 | 2:3d8d52e9751c | 606 | tx_msg_len = 2; |
| miguelcordero191 | 2:3d8d52e9751c | 607 | break; |
| miguelcordero191 | 2:3d8d52e9751c | 608 | |
| miguelcordero191 | 3:f0e6c145b075 | 609 | case DDS_CMD_READ | DDS_CMD_PHASE2: |
| miguelcordero191 | 2:3d8d52e9751c | 610 | tx_msg = this->rdPhase2(); |
| miguelcordero191 | 2:3d8d52e9751c | 611 | tx_msg_len = 2; |
| miguelcordero191 | 2:3d8d52e9751c | 612 | break; |
| miguelcordero191 | 2:3d8d52e9751c | 613 | |
| miguelcordero191 | 3:f0e6c145b075 | 614 | case DDS_CMD_READ | DDS_CMD_AMPLITUDEI: |
| miguelcordero191 | 2:3d8d52e9751c | 615 | tx_msg = this->rdAmplitudeI(); |
| miguelcordero191 | 2:3d8d52e9751c | 616 | tx_msg_len = 2; |
| miguelcordero191 | 2:3d8d52e9751c | 617 | break; |
| miguelcordero191 | 2:3d8d52e9751c | 618 | |
| miguelcordero191 | 3:f0e6c145b075 | 619 | case DDS_CMD_READ | DDS_CMD_AMPLITUDEQ: |
| miguelcordero191 | 2:3d8d52e9751c | 620 | tx_msg = this->rdAmplitudeQ(); |
| miguelcordero191 | 2:3d8d52e9751c | 621 | tx_msg_len = 2; |
| miguelcordero191 | 2:3d8d52e9751c | 622 | break; |
| miguelcordero191 | 2:3d8d52e9751c | 623 | |
| miguelcordero191 | 2:3d8d52e9751c | 624 | default: |
| miguelcordero191 | 2:3d8d52e9751c | 625 | success = false; |
| miguelcordero191 | 2:3d8d52e9751c | 626 | |
| miguelcordero191 | 2:3d8d52e9751c | 627 | } |
| miguelcordero191 | 2:3d8d52e9751c | 628 | |
| miguelcordero191 | 2:3d8d52e9751c | 629 | if (success){ |
| miguelcordero191 | 2:3d8d52e9751c | 630 | tx_msg = OK_MSG; |
| miguelcordero191 | 2:3d8d52e9751c | 631 | tx_msg_len = 2; |
| miguelcordero191 | 2:3d8d52e9751c | 632 | } |
| miguelcordero191 | 2:3d8d52e9751c | 633 | |
| miguelcordero191 | 2:3d8d52e9751c | 634 | this->cmd_answer = tx_msg; |
| miguelcordero191 | 2:3d8d52e9751c | 635 | this->cmd_answer_len = tx_msg_len; |
| miguelcordero191 | 2:3d8d52e9751c | 636 | |
| miguelcordero191 | 2:3d8d52e9751c | 637 | return tx_msg; |
| miguelcordero191 | 2:3d8d52e9751c | 638 | } |
| miguelcordero191 | 2:3d8d52e9751c | 639 | |
| miguelcordero191 | 2:3d8d52e9751c | 640 | char* DDS::getCmdAnswer(){ |
| miguelcordero191 | 2:3d8d52e9751c | 641 | |
| miguelcordero191 | 2:3d8d52e9751c | 642 | return this->cmd_answer; |
| miguelcordero191 | 2:3d8d52e9751c | 643 | |
| miguelcordero191 | 2:3d8d52e9751c | 644 | } |
| miguelcordero191 | 2:3d8d52e9751c | 645 | |
| miguelcordero191 | 2:3d8d52e9751c | 646 | unsigned long DDS::getCmdAnswerLen(){ |
| miguelcordero191 | 2:3d8d52e9751c | 647 | |
| miguelcordero191 | 2:3d8d52e9751c | 648 | return this->cmd_answer_len; |
| miguelcordero191 | 2:3d8d52e9751c | 649 | |
| miguelcordero191 | 2:3d8d52e9751c | 650 | } |
| miguelcordero191 | 2:3d8d52e9751c | 651 | |
| miguelcordero191 | 2:3d8d52e9751c | 652 | int DDS::setAllDevice(char* payload, SerialDriver *screen){ |
| miguelcordero191 | 2:3d8d52e9751c | 653 | |
| miguelcordero191 | 2:3d8d52e9751c | 654 | int sts; |
| miguelcordero191 | 2:3d8d52e9751c | 655 | char* phase1, *phase2; |
| miguelcordero191 | 2:3d8d52e9751c | 656 | char* freq1, *freq2; |
| miguelcordero191 | 2:3d8d52e9751c | 657 | char* delta_freq, *upd_rate_clk, *ramp_rate_clk; |
| miguelcordero191 | 2:3d8d52e9751c | 658 | char* control_reg; |
| miguelcordero191 | 2:3d8d52e9751c | 659 | char* amplitudeI, *amplitudeQ, *ampl_ramp_rate; |
| miguelcordero191 | 2:3d8d52e9751c | 660 | char* qdac; |
| miguelcordero191 | 2:3d8d52e9751c | 661 | |
| miguelcordero191 | 2:3d8d52e9751c | 662 | phase1 = &payload[0x00]; |
| miguelcordero191 | 2:3d8d52e9751c | 663 | phase2 = &payload[0x02]; |
| miguelcordero191 | 2:3d8d52e9751c | 664 | freq1 = &payload[0x04]; |
| miguelcordero191 | 2:3d8d52e9751c | 665 | freq2 = &payload[0x0A]; |
| miguelcordero191 | 2:3d8d52e9751c | 666 | delta_freq = &payload[0x10]; |
| miguelcordero191 | 2:3d8d52e9751c | 667 | upd_rate_clk = &payload[0x16]; |
| miguelcordero191 | 2:3d8d52e9751c | 668 | ramp_rate_clk = &payload[0x1A]; |
| miguelcordero191 | 2:3d8d52e9751c | 669 | control_reg = &payload[0x1D]; |
| miguelcordero191 | 2:3d8d52e9751c | 670 | amplitudeI = &payload[0x21]; |
| miguelcordero191 | 2:3d8d52e9751c | 671 | amplitudeQ = &payload[0x23]; |
| miguelcordero191 | 2:3d8d52e9751c | 672 | ampl_ramp_rate = &payload[0x25]; |
| miguelcordero191 | 2:3d8d52e9751c | 673 | qdac = &payload[0x26]; |
| miguelcordero191 | 2:3d8d52e9751c | 674 | |
| miguelcordero191 | 2:3d8d52e9751c | 675 | control_reg[2] = control_reg[2] & 0xFE; //cr_ioupdclk always as an input = 0 |
| miguelcordero191 | 2:3d8d52e9751c | 676 | control_reg[3] = control_reg[3] | 0x01; //cr_sdo enable = 1 |
| miguelcordero191 | 2:3d8d52e9751c | 677 | |
| miguelcordero191 | 2:3d8d52e9751c | 678 | this->wrPhase1(phase1); |
| miguelcordero191 | 2:3d8d52e9751c | 679 | this->wrPhase2(phase2); |
| miguelcordero191 | 2:3d8d52e9751c | 680 | this->wrFrequency1(freq1); |
| miguelcordero191 | 2:3d8d52e9751c | 681 | this->wrFrequency2(freq2); |
| miguelcordero191 | 2:3d8d52e9751c | 682 | this->__writeDataAndVerify(0x10, 6, delta_freq); |
| miguelcordero191 | 2:3d8d52e9751c | 683 | this->__writeDataAndVerify(0x16, 4, upd_rate_clk); |
| miguelcordero191 | 2:3d8d52e9751c | 684 | this->__writeDataAndVerify(0x1A, 3, ramp_rate_clk); |
| miguelcordero191 | 2:3d8d52e9751c | 685 | this->__writeDataAndVerify(0x1D, 4, control_reg); |
| miguelcordero191 | 2:3d8d52e9751c | 686 | this->wrAmplitudeI(amplitudeI); |
| miguelcordero191 | 2:3d8d52e9751c | 687 | this->wrAmplitudeQ(amplitudeQ); |
| miguelcordero191 | 2:3d8d52e9751c | 688 | this->__writeDataAndVerify(0x25, 1, ampl_ramp_rate); |
| miguelcordero191 | 4:de495ce256b8 | 689 | this->__writeDataAndVerify(0x26, 2, qdac, screen); |
| miguelcordero191 | 4:de495ce256b8 | 690 | |
| miguelcordero191 | 4:de495ce256b8 | 691 | sts = this->enableRF(); |
| miguelcordero191 | 2:3d8d52e9751c | 692 | |
| miguelcordero191 | 2:3d8d52e9751c | 693 | return sts; |
| miguelcordero191 | 2:3d8d52e9751c | 694 | |
| miguelcordero191 | 4:de495ce256b8 | 695 | } |
| miguelcordero191 | 4:de495ce256b8 | 696 | |
| miguelcordero191 | 4:de495ce256b8 | 697 | bool DDS::wasInitialized(){ |
| miguelcordero191 | 4:de495ce256b8 | 698 | |
| miguelcordero191 | 4:de495ce256b8 | 699 | return this->isConfig; |
| miguelcordero191 | 4:de495ce256b8 | 700 | } |
