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