Library for the JRO Radar Controller
CR2.cpp@0:e3f3fe2e689b, 2016-03-14 (annotated)
- Committer:
- joaquinbvw
- Date:
- Mon Mar 14 19:38:54 2016 +0000
- Revision:
- 0:e3f3fe2e689b
CR2 first attempt.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
joaquinbvw | 0:e3f3fe2e689b | 1 | #include "CR2.h" |
joaquinbvw | 0:e3f3fe2e689b | 2 | |
joaquinbvw | 0:e3f3fe2e689b | 3 | static char controlRegister[4]; |
joaquinbvw | 0:e3f3fe2e689b | 4 | static char read_spi_data[6]; |
joaquinbvw | 0:e3f3fe2e689b | 5 | |
joaquinbvw | 0:e3f3fe2e689b | 6 | static char* KO_MSG = "KO"; |
joaquinbvw | 0:e3f3fe2e689b | 7 | static char* OK_MSG = "OK"; |
joaquinbvw | 0:e3f3fe2e689b | 8 | static char* NI_MSG = "NI"; |
joaquinbvw | 0:e3f3fe2e689b | 9 | |
joaquinbvw | 0:e3f3fe2e689b | 10 | static char* ZERO_MSG = "\x00"; |
joaquinbvw | 0:e3f3fe2e689b | 11 | static char* ONE_MSG = "\x01"; |
joaquinbvw | 0:e3f3fe2e689b | 12 | |
joaquinbvw | 0:e3f3fe2e689b | 13 | static char *MODULATION[6] = {"None ", "FSK ", "Ramped FSK ", "Chirp ", "BPSK ", "Not Allowed "}; |
joaquinbvw | 0:e3f3fe2e689b | 14 | |
joaquinbvw | 0:e3f3fe2e689b | 15 | CR2::CR2(SPI *spi_dev, DigitalOut *mreset, DigitalOut *outramp, DigitalOut *spmode, DigitalOut *cs, DigitalOut *ioreset, DigitalInOut *updclk){ |
joaquinbvw | 0:e3f3fe2e689b | 16 | |
joaquinbvw | 0:e3f3fe2e689b | 17 | spi_device = spi_dev; |
joaquinbvw | 0:e3f3fe2e689b | 18 | |
joaquinbvw | 0:e3f3fe2e689b | 19 | cr2_mreset = mreset; |
joaquinbvw | 0:e3f3fe2e689b | 20 | cr2_outramp = outramp; |
joaquinbvw | 0:e3f3fe2e689b | 21 | cr2_sp_mode = spmode; |
joaquinbvw | 0:e3f3fe2e689b | 22 | cr2_cs = cs; |
joaquinbvw | 0:e3f3fe2e689b | 23 | cr2_io_reset = ioreset; |
joaquinbvw | 0:e3f3fe2e689b | 24 | cr2_updclk = updclk; |
joaquinbvw | 0:e3f3fe2e689b | 25 | |
joaquinbvw | 0:e3f3fe2e689b | 26 | cr2_updclk->input(); |
joaquinbvw | 0:e3f3fe2e689b | 27 | *cr2_sp_mode = 0; |
joaquinbvw | 0:e3f3fe2e689b | 28 | *cr2_cs = 1; |
joaquinbvw | 0:e3f3fe2e689b | 29 | *cr2_outramp = 0; |
joaquinbvw | 0:e3f3fe2e689b | 30 | |
joaquinbvw | 0:e3f3fe2e689b | 31 | cmd_answer = NULL; |
joaquinbvw | 0:e3f3fe2e689b | 32 | cmd_answer_len = 0; |
joaquinbvw | 0:e3f3fe2e689b | 33 | |
joaquinbvw | 0:e3f3fe2e689b | 34 | spi_device->format(SPI_BITS, SPI_MODE); |
joaquinbvw | 0:e3f3fe2e689b | 35 | spi_device->frequency(SPI_FREQ); |
joaquinbvw | 0:e3f3fe2e689b | 36 | |
joaquinbvw | 0:e3f3fe2e689b | 37 | this->isConfig = false; |
joaquinbvw | 0:e3f3fe2e689b | 38 | |
joaquinbvw | 0:e3f3fe2e689b | 39 | } |
joaquinbvw | 0:e3f3fe2e689b | 40 | |
joaquinbvw | 0:e3f3fe2e689b | 41 | int CR2::__writeData(char addr, char data){ |
joaquinbvw | 0:e3f3fe2e689b | 42 | |
joaquinbvw | 0:e3f3fe2e689b | 43 | // I/O reset |
joaquinbvw | 0:e3f3fe2e689b | 44 | *cr2_updclk = 0; |
joaquinbvw | 0:e3f3fe2e689b | 45 | *cr2_io_reset = 1; |
joaquinbvw | 0:e3f3fe2e689b | 46 | wait_us(10); |
joaquinbvw | 0:e3f3fe2e689b | 47 | *cr2_io_reset = 0; |
joaquinbvw | 0:e3f3fe2e689b | 48 | wait_us(10); |
joaquinbvw | 0:e3f3fe2e689b | 49 | |
joaquinbvw | 0:e3f3fe2e689b | 50 | *cr2_cs = 0; |
joaquinbvw | 0:e3f3fe2e689b | 51 | |
joaquinbvw | 0:e3f3fe2e689b | 52 | //Sending serial address |
joaquinbvw | 0:e3f3fe2e689b | 53 | //printf("\r\nWriting Addr = %d", addr); |
joaquinbvw | 0:e3f3fe2e689b | 54 | spi_device->write(addr | 0x80); |
joaquinbvw | 0:e3f3fe2e689b | 55 | wait_us(150); |
joaquinbvw | 0:e3f3fe2e689b | 56 | spi_device->write(data); |
joaquinbvw | 0:e3f3fe2e689b | 57 | |
joaquinbvw | 0:e3f3fe2e689b | 58 | *cr2_cs = 1; |
joaquinbvw | 0:e3f3fe2e689b | 59 | /* |
joaquinbvw | 0:e3f3fe2e689b | 60 | for(char i = 0; i < ndata; i++) |
joaquinbvw | 0:e3f3fe2e689b | 61 | { |
joaquinbvw | 0:e3f3fe2e689b | 62 | printf("\tData[%d] = 0x%x", i, data[i]); |
joaquinbvw | 0:e3f3fe2e689b | 63 | } |
joaquinbvw | 0:e3f3fe2e689b | 64 | */ |
joaquinbvw | 0:e3f3fe2e689b | 65 | |
joaquinbvw | 0:e3f3fe2e689b | 66 | |
joaquinbvw | 0:e3f3fe2e689b | 67 | wait_us(10); |
joaquinbvw | 0:e3f3fe2e689b | 68 | *cr2_updclk = 1; |
joaquinbvw | 0:e3f3fe2e689b | 69 | wait_us(10); |
joaquinbvw | 0:e3f3fe2e689b | 70 | *cr2_updclk = 0; |
joaquinbvw | 0:e3f3fe2e689b | 71 | wait_us(10); |
joaquinbvw | 0:e3f3fe2e689b | 72 | |
joaquinbvw | 0:e3f3fe2e689b | 73 | return 1; |
joaquinbvw | 0:e3f3fe2e689b | 74 | } |
joaquinbvw | 0:e3f3fe2e689b | 75 | |
joaquinbvw | 0:e3f3fe2e689b | 76 | int CR2::writeBlock(char ndata, const char* data){ |
joaquinbvw | 0:e3f3fe2e689b | 77 | |
joaquinbvw | 0:e3f3fe2e689b | 78 | // I/O reset |
joaquinbvw | 0:e3f3fe2e689b | 79 | *cr2_updclk = 0; |
joaquinbvw | 0:e3f3fe2e689b | 80 | *cr2_io_reset = 1; |
joaquinbvw | 0:e3f3fe2e689b | 81 | wait_us(10); |
joaquinbvw | 0:e3f3fe2e689b | 82 | *cr2_io_reset = 0; |
joaquinbvw | 0:e3f3fe2e689b | 83 | wait_us(10); |
joaquinbvw | 0:e3f3fe2e689b | 84 | |
joaquinbvw | 0:e3f3fe2e689b | 85 | *cr2_cs = 0; |
joaquinbvw | 0:e3f3fe2e689b | 86 | |
joaquinbvw | 0:e3f3fe2e689b | 87 | for(char i = 0; i < (ndata/2); i++) |
joaquinbvw | 0:e3f3fe2e689b | 88 | { |
joaquinbvw | 0:e3f3fe2e689b | 89 | wait_us(150); |
joaquinbvw | 0:e3f3fe2e689b | 90 | char addr = data[2*i]; |
joaquinbvw | 0:e3f3fe2e689b | 91 | char dat = data[2*i+1]; |
joaquinbvw | 0:e3f3fe2e689b | 92 | this->__writeData(addr,dat); |
joaquinbvw | 0:e3f3fe2e689b | 93 | } |
joaquinbvw | 0:e3f3fe2e689b | 94 | |
joaquinbvw | 0:e3f3fe2e689b | 95 | *cr2_cs = 1; |
joaquinbvw | 0:e3f3fe2e689b | 96 | /* |
joaquinbvw | 0:e3f3fe2e689b | 97 | for(char i = 0; i < ndata; i++) |
joaquinbvw | 0:e3f3fe2e689b | 98 | { |
joaquinbvw | 0:e3f3fe2e689b | 99 | printf("\tData[%d] = 0x%x", i, data[i]); |
joaquinbvw | 0:e3f3fe2e689b | 100 | } |
joaquinbvw | 0:e3f3fe2e689b | 101 | */ |
joaquinbvw | 0:e3f3fe2e689b | 102 | |
joaquinbvw | 0:e3f3fe2e689b | 103 | |
joaquinbvw | 0:e3f3fe2e689b | 104 | wait_us(10); |
joaquinbvw | 0:e3f3fe2e689b | 105 | *cr2_updclk = 1; |
joaquinbvw | 0:e3f3fe2e689b | 106 | wait_us(10); |
joaquinbvw | 0:e3f3fe2e689b | 107 | *cr2_updclk = 0; |
joaquinbvw | 0:e3f3fe2e689b | 108 | wait_us(10); |
joaquinbvw | 0:e3f3fe2e689b | 109 | |
joaquinbvw | 0:e3f3fe2e689b | 110 | if (ndata%2) |
joaquinbvw | 0:e3f3fe2e689b | 111 | { |
joaquinbvw | 0:e3f3fe2e689b | 112 | return 0; |
joaquinbvw | 0:e3f3fe2e689b | 113 | } |
joaquinbvw | 0:e3f3fe2e689b | 114 | else |
joaquinbvw | 0:e3f3fe2e689b | 115 | { |
joaquinbvw | 0:e3f3fe2e689b | 116 | return 1; |
joaquinbvw | 0:e3f3fe2e689b | 117 | } |
joaquinbvw | 0:e3f3fe2e689b | 118 | } |
joaquinbvw | 0:e3f3fe2e689b | 119 | |
joaquinbvw | 0:e3f3fe2e689b | 120 | char CR2::__readData(char addr){ |
joaquinbvw | 0:e3f3fe2e689b | 121 | |
joaquinbvw | 0:e3f3fe2e689b | 122 | char spi_data = 0; |
joaquinbvw | 0:e3f3fe2e689b | 123 | // I/O reset |
joaquinbvw | 0:e3f3fe2e689b | 124 | *cr2_io_reset = 1; |
joaquinbvw | 0:e3f3fe2e689b | 125 | wait_us(10); |
joaquinbvw | 0:e3f3fe2e689b | 126 | *cr2_io_reset = 0; |
joaquinbvw | 0:e3f3fe2e689b | 127 | wait_us(10); |
joaquinbvw | 0:e3f3fe2e689b | 128 | |
joaquinbvw | 0:e3f3fe2e689b | 129 | *cr2_cs = 0; |
joaquinbvw | 0:e3f3fe2e689b | 130 | |
joaquinbvw | 0:e3f3fe2e689b | 131 | //Sending serial address |
joaquinbvw | 0:e3f3fe2e689b | 132 | //printf("\r\nReading Addr = %d", addr); |
joaquinbvw | 0:e3f3fe2e689b | 133 | spi_device->write(addr & 0x7F); |
joaquinbvw | 0:e3f3fe2e689b | 134 | |
joaquinbvw | 0:e3f3fe2e689b | 135 | wait_us(150); |
joaquinbvw | 0:e3f3fe2e689b | 136 | spi_data = spi_device->write(0x00); |
joaquinbvw | 0:e3f3fe2e689b | 137 | |
joaquinbvw | 0:e3f3fe2e689b | 138 | *cr2_cs = 1; |
joaquinbvw | 0:e3f3fe2e689b | 139 | /* |
joaquinbvw | 0:e3f3fe2e689b | 140 | for(char i = 0; i < ndata; i++) |
joaquinbvw | 0:e3f3fe2e689b | 141 | { |
joaquinbvw | 0:e3f3fe2e689b | 142 | printf("\r\nData[%d] = 0x%x", i, read_spi_data[i]); |
joaquinbvw | 0:e3f3fe2e689b | 143 | } |
joaquinbvw | 0:e3f3fe2e689b | 144 | */ |
joaquinbvw | 0:e3f3fe2e689b | 145 | |
joaquinbvw | 0:e3f3fe2e689b | 146 | wait_us(10); |
joaquinbvw | 0:e3f3fe2e689b | 147 | |
joaquinbvw | 0:e3f3fe2e689b | 148 | return spi_data; |
joaquinbvw | 0:e3f3fe2e689b | 149 | } |
joaquinbvw | 0:e3f3fe2e689b | 150 | |
joaquinbvw | 0:e3f3fe2e689b | 151 | int CR2::__writeDataAndVerify(char addr, char wr_spi_data, SerialDriver *screen){ |
joaquinbvw | 0:e3f3fe2e689b | 152 | |
joaquinbvw | 0:e3f3fe2e689b | 153 | int success; |
joaquinbvw | 0:e3f3fe2e689b | 154 | char rd_spi_data; |
joaquinbvw | 0:e3f3fe2e689b | 155 | |
joaquinbvw | 0:e3f3fe2e689b | 156 | this->__writeData(addr, wr_spi_data); |
joaquinbvw | 0:e3f3fe2e689b | 157 | rd_spi_data = this->__readData(addr); |
joaquinbvw | 0:e3f3fe2e689b | 158 | |
joaquinbvw | 0:e3f3fe2e689b | 159 | success = 1; |
joaquinbvw | 0:e3f3fe2e689b | 160 | |
joaquinbvw | 0:e3f3fe2e689b | 161 | screen->putc(wr_spi_data); |
joaquinbvw | 0:e3f3fe2e689b | 162 | screen->putc(0x3D); |
joaquinbvw | 0:e3f3fe2e689b | 163 | screen->putc(rd_spi_data); |
joaquinbvw | 0:e3f3fe2e689b | 164 | if (wr_spi_data != rd_spi_data) |
joaquinbvw | 0:e3f3fe2e689b | 165 | { |
joaquinbvw | 0:e3f3fe2e689b | 166 | success = 0; |
joaquinbvw | 0:e3f3fe2e689b | 167 | } |
joaquinbvw | 0:e3f3fe2e689b | 168 | |
joaquinbvw | 0:e3f3fe2e689b | 169 | //Update Control Register |
joaquinbvw | 0:e3f3fe2e689b | 170 | /* |
joaquinbvw | 0:e3f3fe2e689b | 171 | if ((success == 1) && (addr==0x07)){ |
joaquinbvw | 0:e3f3fe2e689b | 172 | cr2_multiplier = rd_spi_data[1] & 0x1F; |
joaquinbvw | 0:e3f3fe2e689b | 173 | cr2_mode = (rd_spi_data[2] & 0x0E) >> 1; |
joaquinbvw | 0:e3f3fe2e689b | 174 | } |
joaquinbvw | 0:e3f3fe2e689b | 175 | */ |
joaquinbvw | 0:e3f3fe2e689b | 176 | //printf("\r\nSuccessful writting = %d\r\n", success); |
joaquinbvw | 0:e3f3fe2e689b | 177 | |
joaquinbvw | 0:e3f3fe2e689b | 178 | return success; |
joaquinbvw | 0:e3f3fe2e689b | 179 | } |
joaquinbvw | 0:e3f3fe2e689b | 180 | /* |
joaquinbvw | 0:e3f3fe2e689b | 181 | char* CR2::__getControlRegister(){ |
joaquinbvw | 0:e3f3fe2e689b | 182 | |
joaquinbvw | 0:e3f3fe2e689b | 183 | bool pll_range = 0; |
joaquinbvw | 0:e3f3fe2e689b | 184 | bool pll_bypass = 1; |
joaquinbvw | 0:e3f3fe2e689b | 185 | |
joaquinbvw | 0:e3f3fe2e689b | 186 | if (cr2_multiplier >= 4){ |
joaquinbvw | 0:e3f3fe2e689b | 187 | pll_bypass = 0; |
joaquinbvw | 0:e3f3fe2e689b | 188 | } |
joaquinbvw | 0:e3f3fe2e689b | 189 | |
joaquinbvw | 0:e3f3fe2e689b | 190 | if (clock >= 200){ |
joaquinbvw | 0:e3f3fe2e689b | 191 | pll_range = 1; |
joaquinbvw | 0:e3f3fe2e689b | 192 | } |
joaquinbvw | 0:e3f3fe2e689b | 193 | |
joaquinbvw | 0:e3f3fe2e689b | 194 | controlRegister[0] = 0x10 + cr2_qdac_pwdn*4; |
joaquinbvw | 0:e3f3fe2e689b | 195 | controlRegister[1] = pll_range*64 + pll_bypass*32 + (cr2_multiplier & 0x1F); |
joaquinbvw | 0:e3f3fe2e689b | 196 | controlRegister[2] = (cr2_mode & 0x07)*2 + cr2_ioupdclk; |
joaquinbvw | 0:e3f3fe2e689b | 197 | controlRegister[3] = cr2_inv_sinc*64 + cr2_osk_en*32 + cr2_osk_int*16 + cr2_msb_lsb*2 + cr2_sdo; |
joaquinbvw | 0:e3f3fe2e689b | 198 | |
joaquinbvw | 0:e3f3fe2e689b | 199 | return controlRegister; |
joaquinbvw | 0:e3f3fe2e689b | 200 | |
joaquinbvw | 0:e3f3fe2e689b | 201 | } |
joaquinbvw | 0:e3f3fe2e689b | 202 | |
joaquinbvw | 0:e3f3fe2e689b | 203 | int CR2::__writeControlRegister(){ |
joaquinbvw | 0:e3f3fe2e689b | 204 | |
joaquinbvw | 0:e3f3fe2e689b | 205 | bool success; |
joaquinbvw | 0:e3f3fe2e689b | 206 | char wr_spi_data; |
joaquinbvw | 0:e3f3fe2e689b | 207 | char* rd_spi_data; |
joaquinbvw | 0:e3f3fe2e689b | 208 | char addr = 0x07, ndata = 4; |
joaquinbvw | 0:e3f3fe2e689b | 209 | |
joaquinbvw | 0:e3f3fe2e689b | 210 | wr_spi_data = this->__getControlRegister(); |
joaquinbvw | 0:e3f3fe2e689b | 211 | |
joaquinbvw | 0:e3f3fe2e689b | 212 | success = this->__writeData(addr, wr_spi_data); |
joaquinbvw | 0:e3f3fe2e689b | 213 | |
joaquinbvw | 0:e3f3fe2e689b | 214 | ////printf("\r\nChanging UPD_CLK as an OUTPUT ..."); |
joaquinbvw | 0:e3f3fe2e689b | 215 | cr2_updclk->output(); |
joaquinbvw | 0:e3f3fe2e689b | 216 | |
joaquinbvw | 0:e3f3fe2e689b | 217 | wait_us(100); |
joaquinbvw | 0:e3f3fe2e689b | 218 | *cr2_updclk = 1; |
joaquinbvw | 0:e3f3fe2e689b | 219 | wait_us(10); |
joaquinbvw | 0:e3f3fe2e689b | 220 | *cr2_updclk = 0; |
joaquinbvw | 0:e3f3fe2e689b | 221 | wait_us(10); |
joaquinbvw | 0:e3f3fe2e689b | 222 | |
joaquinbvw | 0:e3f3fe2e689b | 223 | rd_spi_data = this->__readData(addr); |
joaquinbvw | 0:e3f3fe2e689b | 224 | |
joaquinbvw | 0:e3f3fe2e689b | 225 | success = true; |
joaquinbvw | 0:e3f3fe2e689b | 226 | |
joaquinbvw | 0:e3f3fe2e689b | 227 | for(char i = 0; i < ndata; i++) |
joaquinbvw | 0:e3f3fe2e689b | 228 | { |
joaquinbvw | 0:e3f3fe2e689b | 229 | if (wr_spi_data[i] != rd_spi_data[i]) |
joaquinbvw | 0:e3f3fe2e689b | 230 | { |
joaquinbvw | 0:e3f3fe2e689b | 231 | success = false; |
joaquinbvw | 0:e3f3fe2e689b | 232 | break; |
joaquinbvw | 0:e3f3fe2e689b | 233 | } |
joaquinbvw | 0:e3f3fe2e689b | 234 | } |
joaquinbvw | 0:e3f3fe2e689b | 235 | |
joaquinbvw | 0:e3f3fe2e689b | 236 | return success; |
joaquinbvw | 0:e3f3fe2e689b | 237 | } |
joaquinbvw | 0:e3f3fe2e689b | 238 | */ |
joaquinbvw | 0:e3f3fe2e689b | 239 | |
joaquinbvw | 0:e3f3fe2e689b | 240 | int CR2::reset(){ |
joaquinbvw | 0:e3f3fe2e689b | 241 | |
joaquinbvw | 0:e3f3fe2e689b | 242 | // Master reset |
joaquinbvw | 0:e3f3fe2e689b | 243 | //Set as a input, temporary |
joaquinbvw | 0:e3f3fe2e689b | 244 | //printf("\r\nChange updclk direction as an INPUT ...\r\n"); |
joaquinbvw | 0:e3f3fe2e689b | 245 | cr2_updclk->input(); |
joaquinbvw | 0:e3f3fe2e689b | 246 | cr2_updclk->mode(PullDown); |
joaquinbvw | 0:e3f3fe2e689b | 247 | |
joaquinbvw | 0:e3f3fe2e689b | 248 | //printf("\r\nReseting CR2 ...\r\n"); |
joaquinbvw | 0:e3f3fe2e689b | 249 | *cr2_mreset = 1; |
joaquinbvw | 0:e3f3fe2e689b | 250 | wait_ms(1); |
joaquinbvw | 0:e3f3fe2e689b | 251 | *cr2_mreset = 0; |
joaquinbvw | 0:e3f3fe2e689b | 252 | wait_ms(1); |
joaquinbvw | 0:e3f3fe2e689b | 253 | |
joaquinbvw | 0:e3f3fe2e689b | 254 | this->rf_enabled = false; |
joaquinbvw | 0:e3f3fe2e689b | 255 | |
joaquinbvw | 0:e3f3fe2e689b | 256 | return 0; |
joaquinbvw | 0:e3f3fe2e689b | 257 | } |
joaquinbvw | 0:e3f3fe2e689b | 258 | |
joaquinbvw | 0:e3f3fe2e689b | 259 | int CR2::scanIOUpdate(){ |
joaquinbvw | 0:e3f3fe2e689b | 260 | |
joaquinbvw | 0:e3f3fe2e689b | 261 | unsigned int cont = 0; |
joaquinbvw | 0:e3f3fe2e689b | 262 | |
joaquinbvw | 0:e3f3fe2e689b | 263 | this->reset(); |
joaquinbvw | 0:e3f3fe2e689b | 264 | |
joaquinbvw | 0:e3f3fe2e689b | 265 | //printf("\r\nWaiting a upd_clk ...\r\n"); |
joaquinbvw | 0:e3f3fe2e689b | 266 | while(true){ |
joaquinbvw | 0:e3f3fe2e689b | 267 | if (*cr2_updclk == 1) |
joaquinbvw | 0:e3f3fe2e689b | 268 | break; |
joaquinbvw | 0:e3f3fe2e689b | 269 | |
joaquinbvw | 0:e3f3fe2e689b | 270 | cont += 1; |
joaquinbvw | 0:e3f3fe2e689b | 271 | if (cont > 10000) |
joaquinbvw | 0:e3f3fe2e689b | 272 | break; |
joaquinbvw | 0:e3f3fe2e689b | 273 | |
joaquinbvw | 0:e3f3fe2e689b | 274 | wait_us(1); |
joaquinbvw | 0:e3f3fe2e689b | 275 | } |
joaquinbvw | 0:e3f3fe2e689b | 276 | |
joaquinbvw | 0:e3f3fe2e689b | 277 | if (cont > 10000){ |
joaquinbvw | 0:e3f3fe2e689b | 278 | //printf("\r\nA upd_clk was not found\r\n"); |
joaquinbvw | 0:e3f3fe2e689b | 279 | return 0; |
joaquinbvw | 0:e3f3fe2e689b | 280 | } |
joaquinbvw | 0:e3f3fe2e689b | 281 | |
joaquinbvw | 0:e3f3fe2e689b | 282 | //printf("\r\nA upd_clk was found ...\r\n"); |
joaquinbvw | 0:e3f3fe2e689b | 283 | |
joaquinbvw | 0:e3f3fe2e689b | 284 | return 1; |
joaquinbvw | 0:e3f3fe2e689b | 285 | } |
joaquinbvw | 0:e3f3fe2e689b | 286 | |
joaquinbvw | 0:e3f3fe2e689b | 287 | int CR2::find(){ |
joaquinbvw | 0:e3f3fe2e689b | 288 | /* |
joaquinbvw | 0:e3f3fe2e689b | 289 | char phase[]; |
joaquinbvw | 0:e3f3fe2e689b | 290 | |
joaquinbvw | 0:e3f3fe2e689b | 291 | phase[0] = 0x0A; |
joaquinbvw | 0:e3f3fe2e689b | 292 | phase[1] = 0x55; |
joaquinbvw | 0:e3f3fe2e689b | 293 | |
joaquinbvw | 0:e3f3fe2e689b | 294 | this->__writeDataAndVerify(0x00, 5, phase); |
joaquinbvw | 0:e3f3fe2e689b | 295 | */ |
joaquinbvw | 0:e3f3fe2e689b | 296 | this->__readData(0x05); |
joaquinbvw | 0:e3f3fe2e689b | 297 | this->__readData(0x0A); |
joaquinbvw | 0:e3f3fe2e689b | 298 | return 1; |
joaquinbvw | 0:e3f3fe2e689b | 299 | |
joaquinbvw | 0:e3f3fe2e689b | 300 | } |
joaquinbvw | 0:e3f3fe2e689b | 301 | |
joaquinbvw | 0:e3f3fe2e689b | 302 | |
joaquinbvw | 0:e3f3fe2e689b | 303 | int CR2::init(){ |
joaquinbvw | 0:e3f3fe2e689b | 304 | |
joaquinbvw | 0:e3f3fe2e689b | 305 | //printf("\r\nSetting default parameters in CR ...\r\n"); |
joaquinbvw | 0:e3f3fe2e689b | 306 | |
joaquinbvw | 0:e3f3fe2e689b | 307 | //Serial mode enabled |
joaquinbvw | 0:e3f3fe2e689b | 308 | this->clock = 200.0; // Work clock in MHz |
joaquinbvw | 0:e3f3fe2e689b | 309 | this->cr2_multiplier = 4; // Multiplier 4- 20 |
joaquinbvw | 0:e3f3fe2e689b | 310 | this->cr2_mode = 0; // Single, FSK, Ramped FSK, Chirp, BPSK |
joaquinbvw | 0:e3f3fe2e689b | 311 | this->cr2_qdac_pwdn = 0; // QDAC power down enabled: 0 -> disable |
joaquinbvw | 0:e3f3fe2e689b | 312 | this->cr2_ioupdclk = 0; // IO Update clock direction: 0 -> input, 1 -> output |
joaquinbvw | 0:e3f3fe2e689b | 313 | this->cr2_inv_sinc = 0; // Sinc inverser filter enable: 0 -> enable |
joaquinbvw | 0:e3f3fe2e689b | 314 | this->cr2_osk_en = 1; // Enable Amplitude multiplier: 0 -> disabled |
joaquinbvw | 0:e3f3fe2e689b | 315 | this->cr2_osk_int = 0; // register/counter output shaped control: 0 -> register, 1 -> counter |
joaquinbvw | 0:e3f3fe2e689b | 316 | this->cr2_msb_lsb = 0; // msb/lsb bit first: 0 -> MSB, 1 -> LSB |
joaquinbvw | 0:e3f3fe2e689b | 317 | this->cr2_sdo = 1; // SDO pin active: 0 -> inactive |
joaquinbvw | 0:e3f3fe2e689b | 318 | |
joaquinbvw | 0:e3f3fe2e689b | 319 | //printf("\r\nSetting in serial mode ...\r\n"); |
joaquinbvw | 0:e3f3fe2e689b | 320 | *cr2_sp_mode = 0; |
joaquinbvw | 0:e3f3fe2e689b | 321 | *cr2_cs = 1; |
joaquinbvw | 0:e3f3fe2e689b | 322 | |
joaquinbvw | 0:e3f3fe2e689b | 323 | this->reset(); |
joaquinbvw | 0:e3f3fe2e689b | 324 | |
joaquinbvw | 0:e3f3fe2e689b | 325 | //printf("\r\nWritting CR ...\r\n"); |
joaquinbvw | 0:e3f3fe2e689b | 326 | /* |
joaquinbvw | 0:e3f3fe2e689b | 327 | if (not this->__writeControlRegister()){ |
joaquinbvw | 0:e3f3fe2e689b | 328 | //printf("\r\nUnsuccessful CR2 initialization"); |
joaquinbvw | 0:e3f3fe2e689b | 329 | this->isConfig = false; |
joaquinbvw | 0:e3f3fe2e689b | 330 | return false; |
joaquinbvw | 0:e3f3fe2e689b | 331 | } |
joaquinbvw | 0:e3f3fe2e689b | 332 | */ |
joaquinbvw | 0:e3f3fe2e689b | 333 | //printf("\r\nSuccessfull CR2 initialization"); |
joaquinbvw | 0:e3f3fe2e689b | 334 | |
joaquinbvw | 0:e3f3fe2e689b | 335 | this->isConfig = true; |
joaquinbvw | 0:e3f3fe2e689b | 336 | |
joaquinbvw | 0:e3f3fe2e689b | 337 | return true; |
joaquinbvw | 0:e3f3fe2e689b | 338 | } |
joaquinbvw | 0:e3f3fe2e689b | 339 | /* |
joaquinbvw | 0:e3f3fe2e689b | 340 | char* CR2::rdMode(){ |
joaquinbvw | 0:e3f3fe2e689b | 341 | |
joaquinbvw | 0:e3f3fe2e689b | 342 | char* rd_data; |
joaquinbvw | 0:e3f3fe2e689b | 343 | char mode; |
joaquinbvw | 0:e3f3fe2e689b | 344 | |
joaquinbvw | 0:e3f3fe2e689b | 345 | rd_data = this->__readData(0x07); |
joaquinbvw | 0:e3f3fe2e689b | 346 | mode = (rd_data[2] & 0x0E) >> 1; |
joaquinbvw | 0:e3f3fe2e689b | 347 | |
joaquinbvw | 0:e3f3fe2e689b | 348 | this->cr2_mode = mode; |
joaquinbvw | 0:e3f3fe2e689b | 349 | |
joaquinbvw | 0:e3f3fe2e689b | 350 | rd_data[0] = mode; |
joaquinbvw | 0:e3f3fe2e689b | 351 | |
joaquinbvw | 0:e3f3fe2e689b | 352 | return rd_data; |
joaquinbvw | 0:e3f3fe2e689b | 353 | } |
joaquinbvw | 0:e3f3fe2e689b | 354 | |
joaquinbvw | 0:e3f3fe2e689b | 355 | char* CR2::rdMultiplier(){ |
joaquinbvw | 0:e3f3fe2e689b | 356 | |
joaquinbvw | 0:e3f3fe2e689b | 357 | char* rd_data; |
joaquinbvw | 0:e3f3fe2e689b | 358 | char mult; |
joaquinbvw | 0:e3f3fe2e689b | 359 | |
joaquinbvw | 0:e3f3fe2e689b | 360 | rd_data = this->__readData(0x07); |
joaquinbvw | 0:e3f3fe2e689b | 361 | mult = (rd_data[1] & 0x1F); |
joaquinbvw | 0:e3f3fe2e689b | 362 | this->cr2_multiplier = mult; |
joaquinbvw | 0:e3f3fe2e689b | 363 | |
joaquinbvw | 0:e3f3fe2e689b | 364 | //Reaconditioning data to return |
joaquinbvw | 0:e3f3fe2e689b | 365 | rd_data[0] = mult; |
joaquinbvw | 0:e3f3fe2e689b | 366 | rd_data[1] = ((int)clock >> 8) & 0xff; |
joaquinbvw | 0:e3f3fe2e689b | 367 | rd_data[2] = (int)clock & 0xff; |
joaquinbvw | 0:e3f3fe2e689b | 368 | |
joaquinbvw | 0:e3f3fe2e689b | 369 | return rd_data; |
joaquinbvw | 0:e3f3fe2e689b | 370 | } |
joaquinbvw | 0:e3f3fe2e689b | 371 | char* CR2::rdPhase1(){ |
joaquinbvw | 0:e3f3fe2e689b | 372 | |
joaquinbvw | 0:e3f3fe2e689b | 373 | char* rd_data; |
joaquinbvw | 0:e3f3fe2e689b | 374 | |
joaquinbvw | 0:e3f3fe2e689b | 375 | rd_data = this->__readData(0x00); |
joaquinbvw | 0:e3f3fe2e689b | 376 | |
joaquinbvw | 0:e3f3fe2e689b | 377 | return rd_data; |
joaquinbvw | 0:e3f3fe2e689b | 378 | |
joaquinbvw | 0:e3f3fe2e689b | 379 | } |
joaquinbvw | 0:e3f3fe2e689b | 380 | char* CR2::rdPhase2(){ |
joaquinbvw | 0:e3f3fe2e689b | 381 | |
joaquinbvw | 0:e3f3fe2e689b | 382 | char* rd_data; |
joaquinbvw | 0:e3f3fe2e689b | 383 | |
joaquinbvw | 0:e3f3fe2e689b | 384 | rd_data = this->__readData(0x01); |
joaquinbvw | 0:e3f3fe2e689b | 385 | |
joaquinbvw | 0:e3f3fe2e689b | 386 | return rd_data; |
joaquinbvw | 0:e3f3fe2e689b | 387 | } |
joaquinbvw | 0:e3f3fe2e689b | 388 | char* CR2::rdFrequency1(){ |
joaquinbvw | 0:e3f3fe2e689b | 389 | |
joaquinbvw | 0:e3f3fe2e689b | 390 | char* rd_data; |
joaquinbvw | 0:e3f3fe2e689b | 391 | |
joaquinbvw | 0:e3f3fe2e689b | 392 | rd_data = this->__readData(0x02); |
joaquinbvw | 0:e3f3fe2e689b | 393 | |
joaquinbvw | 0:e3f3fe2e689b | 394 | for (int i=0; i<6; i++) |
joaquinbvw | 0:e3f3fe2e689b | 395 | frequency1[i] = rd_data[i]; |
joaquinbvw | 0:e3f3fe2e689b | 396 | |
joaquinbvw | 0:e3f3fe2e689b | 397 | return rd_data; |
joaquinbvw | 0:e3f3fe2e689b | 398 | |
joaquinbvw | 0:e3f3fe2e689b | 399 | } |
joaquinbvw | 0:e3f3fe2e689b | 400 | char* CR2::rdFrequency2(){ |
joaquinbvw | 0:e3f3fe2e689b | 401 | |
joaquinbvw | 0:e3f3fe2e689b | 402 | char* rd_data; |
joaquinbvw | 0:e3f3fe2e689b | 403 | |
joaquinbvw | 0:e3f3fe2e689b | 404 | rd_data = this->__readData(0x03); |
joaquinbvw | 0:e3f3fe2e689b | 405 | |
joaquinbvw | 0:e3f3fe2e689b | 406 | for (int i=0; i<6; i++) |
joaquinbvw | 0:e3f3fe2e689b | 407 | frequency2[i] = rd_data[i]; |
joaquinbvw | 0:e3f3fe2e689b | 408 | |
joaquinbvw | 0:e3f3fe2e689b | 409 | return rd_data; |
joaquinbvw | 0:e3f3fe2e689b | 410 | } |
joaquinbvw | 0:e3f3fe2e689b | 411 | char* CR2::rdAmplitudeI(){ |
joaquinbvw | 0:e3f3fe2e689b | 412 | |
joaquinbvw | 0:e3f3fe2e689b | 413 | char* rd_data; |
joaquinbvw | 0:e3f3fe2e689b | 414 | |
joaquinbvw | 0:e3f3fe2e689b | 415 | rd_data = this->__readData(0x08); |
joaquinbvw | 0:e3f3fe2e689b | 416 | |
joaquinbvw | 0:e3f3fe2e689b | 417 | return rd_data; |
joaquinbvw | 0:e3f3fe2e689b | 418 | } |
joaquinbvw | 0:e3f3fe2e689b | 419 | char* CR2::rdAmplitudeQ(){ |
joaquinbvw | 0:e3f3fe2e689b | 420 | |
joaquinbvw | 0:e3f3fe2e689b | 421 | char* rd_data; |
joaquinbvw | 0:e3f3fe2e689b | 422 | |
joaquinbvw | 0:e3f3fe2e689b | 423 | rd_data = this->__readData(0x09); |
joaquinbvw | 0:e3f3fe2e689b | 424 | |
joaquinbvw | 0:e3f3fe2e689b | 425 | return rd_data; |
joaquinbvw | 0:e3f3fe2e689b | 426 | } |
joaquinbvw | 0:e3f3fe2e689b | 427 | |
joaquinbvw | 0:e3f3fe2e689b | 428 | int CR2::isRFEnabled(){ |
joaquinbvw | 0:e3f3fe2e689b | 429 | |
joaquinbvw | 0:e3f3fe2e689b | 430 | if (this->rf_enabled) |
joaquinbvw | 0:e3f3fe2e689b | 431 | return 1; |
joaquinbvw | 0:e3f3fe2e689b | 432 | |
joaquinbvw | 0:e3f3fe2e689b | 433 | return 0; |
joaquinbvw | 0:e3f3fe2e689b | 434 | } |
joaquinbvw | 0:e3f3fe2e689b | 435 | |
joaquinbvw | 0:e3f3fe2e689b | 436 | int CR2::wrMode(char mode){ |
joaquinbvw | 0:e3f3fe2e689b | 437 | |
joaquinbvw | 0:e3f3fe2e689b | 438 | this->cr2_mode = mode & 0x07; |
joaquinbvw | 0:e3f3fe2e689b | 439 | |
joaquinbvw | 0:e3f3fe2e689b | 440 | return this->__writeControlRegister(); |
joaquinbvw | 0:e3f3fe2e689b | 441 | } |
joaquinbvw | 0:e3f3fe2e689b | 442 | |
joaquinbvw | 0:e3f3fe2e689b | 443 | int CR2::wrMultiplier(char multiplier, float clock){ |
joaquinbvw | 0:e3f3fe2e689b | 444 | |
joaquinbvw | 0:e3f3fe2e689b | 445 | this->cr2_multiplier = multiplier & 0x1F; |
joaquinbvw | 0:e3f3fe2e689b | 446 | this->clock = clock; |
joaquinbvw | 0:e3f3fe2e689b | 447 | |
joaquinbvw | 0:e3f3fe2e689b | 448 | //printf("\r\n mult = %d, clock = %f", multiplier, clock); |
joaquinbvw | 0:e3f3fe2e689b | 449 | //printf("\r\n cr2_mult = %d", cr2_multiplier); |
joaquinbvw | 0:e3f3fe2e689b | 450 | |
joaquinbvw | 0:e3f3fe2e689b | 451 | return this->__writeControlRegister(); |
joaquinbvw | 0:e3f3fe2e689b | 452 | } |
joaquinbvw | 0:e3f3fe2e689b | 453 | |
joaquinbvw | 0:e3f3fe2e689b | 454 | int CR2::wrPhase1(char* phase, SerialDriver *screen){ |
joaquinbvw | 0:e3f3fe2e689b | 455 | |
joaquinbvw | 0:e3f3fe2e689b | 456 | return this->__writeDataAndVerify(0x00, phase, screen); |
joaquinbvw | 0:e3f3fe2e689b | 457 | |
joaquinbvw | 0:e3f3fe2e689b | 458 | } |
joaquinbvw | 0:e3f3fe2e689b | 459 | |
joaquinbvw | 0:e3f3fe2e689b | 460 | int CR2::wrPhase2(char* phase, SerialDriver *screen){ |
joaquinbvw | 0:e3f3fe2e689b | 461 | |
joaquinbvw | 0:e3f3fe2e689b | 462 | return this->__writeDataAndVerify(0x01, phase, screen); |
joaquinbvw | 0:e3f3fe2e689b | 463 | |
joaquinbvw | 0:e3f3fe2e689b | 464 | } |
joaquinbvw | 0:e3f3fe2e689b | 465 | |
joaquinbvw | 0:e3f3fe2e689b | 466 | int CR2::wrFrequency1(char* freq, SerialDriver *screen){ |
joaquinbvw | 0:e3f3fe2e689b | 467 | int sts; |
joaquinbvw | 0:e3f3fe2e689b | 468 | |
joaquinbvw | 0:e3f3fe2e689b | 469 | sts = this->__writeDataAndVerify(0x02, freq, screen); |
joaquinbvw | 0:e3f3fe2e689b | 470 | |
joaquinbvw | 0:e3f3fe2e689b | 471 | if (sts){ |
joaquinbvw | 0:e3f3fe2e689b | 472 | for (int i=0; i<6; i++) |
joaquinbvw | 0:e3f3fe2e689b | 473 | frequency1[i] = freq[i]; |
joaquinbvw | 0:e3f3fe2e689b | 474 | } |
joaquinbvw | 0:e3f3fe2e689b | 475 | return sts; |
joaquinbvw | 0:e3f3fe2e689b | 476 | |
joaquinbvw | 0:e3f3fe2e689b | 477 | } |
joaquinbvw | 0:e3f3fe2e689b | 478 | int CR2::wrFrequency2(char* freq, SerialDriver *screen){ |
joaquinbvw | 0:e3f3fe2e689b | 479 | int sts; |
joaquinbvw | 0:e3f3fe2e689b | 480 | |
joaquinbvw | 0:e3f3fe2e689b | 481 | sts = this->__writeDataAndVerify(0x03, freq, screen); |
joaquinbvw | 0:e3f3fe2e689b | 482 | |
joaquinbvw | 0:e3f3fe2e689b | 483 | if (sts){ |
joaquinbvw | 0:e3f3fe2e689b | 484 | for (int i=0; i<6; i++) |
joaquinbvw | 0:e3f3fe2e689b | 485 | frequency2[i] = freq[i]; |
joaquinbvw | 0:e3f3fe2e689b | 486 | } |
joaquinbvw | 0:e3f3fe2e689b | 487 | return sts; |
joaquinbvw | 0:e3f3fe2e689b | 488 | } |
joaquinbvw | 0:e3f3fe2e689b | 489 | |
joaquinbvw | 0:e3f3fe2e689b | 490 | int CR2::wrAmplitudeI(char* amplitude, SerialDriver *screen){ |
joaquinbvw | 0:e3f3fe2e689b | 491 | |
joaquinbvw | 0:e3f3fe2e689b | 492 | amplitudeI[0] = amplitude[0]; |
joaquinbvw | 0:e3f3fe2e689b | 493 | amplitudeI[1] = amplitude[1]; |
joaquinbvw | 0:e3f3fe2e689b | 494 | |
joaquinbvw | 0:e3f3fe2e689b | 495 | this->rf_enabled = true; |
joaquinbvw | 0:e3f3fe2e689b | 496 | |
joaquinbvw | 0:e3f3fe2e689b | 497 | return this->__writeDataAndVerify(0x08, amplitude, screen); |
joaquinbvw | 0:e3f3fe2e689b | 498 | |
joaquinbvw | 0:e3f3fe2e689b | 499 | } |
joaquinbvw | 0:e3f3fe2e689b | 500 | |
joaquinbvw | 0:e3f3fe2e689b | 501 | int CR2::wrAmplitudeQ(char* amplitude, SerialDriver *screen){ |
joaquinbvw | 0:e3f3fe2e689b | 502 | |
joaquinbvw | 0:e3f3fe2e689b | 503 | amplitudeQ[0] = amplitude[0]; |
joaquinbvw | 0:e3f3fe2e689b | 504 | amplitudeQ[1] = amplitude[1]; |
joaquinbvw | 0:e3f3fe2e689b | 505 | |
joaquinbvw | 0:e3f3fe2e689b | 506 | this->rf_enabled = true; |
joaquinbvw | 0:e3f3fe2e689b | 507 | |
joaquinbvw | 0:e3f3fe2e689b | 508 | return this->__writeDataAndVerify(0x09, amplitude, screen); |
joaquinbvw | 0:e3f3fe2e689b | 509 | |
joaquinbvw | 0:e3f3fe2e689b | 510 | } |
joaquinbvw | 0:e3f3fe2e689b | 511 | |
joaquinbvw | 0:e3f3fe2e689b | 512 | int CR2::enableRF(){ |
joaquinbvw | 0:e3f3fe2e689b | 513 | |
joaquinbvw | 0:e3f3fe2e689b | 514 | this->rf_enabled = true; |
joaquinbvw | 0:e3f3fe2e689b | 515 | |
joaquinbvw | 0:e3f3fe2e689b | 516 | this->__writeDataAndVerify(0x08, this->amplitudeI); |
joaquinbvw | 0:e3f3fe2e689b | 517 | return this->__writeDataAndVerify(0x09, this->amplitudeQ); |
joaquinbvw | 0:e3f3fe2e689b | 518 | |
joaquinbvw | 0:e3f3fe2e689b | 519 | } |
joaquinbvw | 0:e3f3fe2e689b | 520 | |
joaquinbvw | 0:e3f3fe2e689b | 521 | int CR2::disableRF(){ |
joaquinbvw | 0:e3f3fe2e689b | 522 | |
joaquinbvw | 0:e3f3fe2e689b | 523 | this->rf_enabled = false; |
joaquinbvw | 0:e3f3fe2e689b | 524 | |
joaquinbvw | 0:e3f3fe2e689b | 525 | this->__writeDataAndVerify(0x08, "\x00\x00"); |
joaquinbvw | 0:e3f3fe2e689b | 526 | return this->__writeDataAndVerify(0x09, "\x00\x00"); |
joaquinbvw | 0:e3f3fe2e689b | 527 | |
joaquinbvw | 0:e3f3fe2e689b | 528 | } |
joaquinbvw | 0:e3f3fe2e689b | 529 | |
joaquinbvw | 0:e3f3fe2e689b | 530 | int CR2::defaultSettings(SerialDriver *screen){ |
joaquinbvw | 0:e3f3fe2e689b | 531 | |
joaquinbvw | 0:e3f3fe2e689b | 532 | if (!(screen == NULL)){ |
joaquinbvw | 0:e3f3fe2e689b | 533 | screen->putc(0x37); |
joaquinbvw | 0:e3f3fe2e689b | 534 | screen->putc(0x30); |
joaquinbvw | 0:e3f3fe2e689b | 535 | } |
joaquinbvw | 0:e3f3fe2e689b | 536 | |
joaquinbvw | 0:e3f3fe2e689b | 537 | this->wrMultiplier(1, 0.0); |
joaquinbvw | 0:e3f3fe2e689b | 538 | this->wrAmplitudeI("\x0F\xC0", screen); //0xFC0 produces best SFDR than 0xFFF |
joaquinbvw | 0:e3f3fe2e689b | 539 | this->wrAmplitudeQ("\x0F\xC0"); //0xFC0 produces best SFDR than 0xFFF |
joaquinbvw | 0:e3f3fe2e689b | 540 | 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 |
joaquinbvw | 0:e3f3fe2e689b | 541 | this->wrFrequency2("\x00\x00\x00\x00\x00\x00"); |
joaquinbvw | 0:e3f3fe2e689b | 542 | this->wrPhase1("\x00\x00"); //0 grados |
joaquinbvw | 0:e3f3fe2e689b | 543 | this->wrPhase2("\x20\x00"); //180 grados <> 0x20 0x00 <> 180/360*(2**14) |
joaquinbvw | 0:e3f3fe2e689b | 544 | this->disableRF(); |
joaquinbvw | 0:e3f3fe2e689b | 545 | |
joaquinbvw | 0:e3f3fe2e689b | 546 | if (!(screen == NULL)){ |
joaquinbvw | 0:e3f3fe2e689b | 547 | screen->putc(0x37); |
joaquinbvw | 0:e3f3fe2e689b | 548 | screen->putc(0x31); |
joaquinbvw | 0:e3f3fe2e689b | 549 | } |
joaquinbvw | 0:e3f3fe2e689b | 550 | |
joaquinbvw | 0:e3f3fe2e689b | 551 | return this->wrMode(4); //BPSK mode |
joaquinbvw | 0:e3f3fe2e689b | 552 | |
joaquinbvw | 0:e3f3fe2e689b | 553 | } |
joaquinbvw | 0:e3f3fe2e689b | 554 | */ |
joaquinbvw | 0:e3f3fe2e689b | 555 | char* CR2::setCommand(unsigned short cmd, char* payload, unsigned long payload_len){ |
joaquinbvw | 0:e3f3fe2e689b | 556 | |
joaquinbvw | 0:e3f3fe2e689b | 557 | bool success = false; |
joaquinbvw | 0:e3f3fe2e689b | 558 | char* tx_msg; |
joaquinbvw | 0:e3f3fe2e689b | 559 | unsigned long tx_msg_len; |
joaquinbvw | 0:e3f3fe2e689b | 560 | |
joaquinbvw | 0:e3f3fe2e689b | 561 | tx_msg = KO_MSG; |
joaquinbvw | 0:e3f3fe2e689b | 562 | tx_msg_len = 2; |
joaquinbvw | 0:e3f3fe2e689b | 563 | |
joaquinbvw | 0:e3f3fe2e689b | 564 | //printf("cmd = %d, payload_len = %d", cmd, payload_len); |
joaquinbvw | 0:e3f3fe2e689b | 565 | |
joaquinbvw | 0:e3f3fe2e689b | 566 | //printf("\r\nPayload = "); |
joaquinbvw | 0:e3f3fe2e689b | 567 | //for(unsigned long i=0; i< payload_len; i++) |
joaquinbvw | 0:e3f3fe2e689b | 568 | //printf("0x%x ", payload[i]); |
joaquinbvw | 0:e3f3fe2e689b | 569 | |
joaquinbvw | 0:e3f3fe2e689b | 570 | //Si el CR2 no esta inicializado siempre retornar NI_MSG |
joaquinbvw | 0:e3f3fe2e689b | 571 | if (not this->isConfig){ |
joaquinbvw | 0:e3f3fe2e689b | 572 | this->cmd_answer = NI_MSG; |
joaquinbvw | 0:e3f3fe2e689b | 573 | this->cmd_answer_len = 2; |
joaquinbvw | 0:e3f3fe2e689b | 574 | |
joaquinbvw | 0:e3f3fe2e689b | 575 | return this->cmd_answer; |
joaquinbvw | 0:e3f3fe2e689b | 576 | } |
joaquinbvw | 0:e3f3fe2e689b | 577 | |
joaquinbvw | 0:e3f3fe2e689b | 578 | switch ( cmd ) |
joaquinbvw | 0:e3f3fe2e689b | 579 | { |
joaquinbvw | 0:e3f3fe2e689b | 580 | case CR2_CMD_RESET: |
joaquinbvw | 0:e3f3fe2e689b | 581 | success = this->init(); |
joaquinbvw | 0:e3f3fe2e689b | 582 | break; |
joaquinbvw | 0:e3f3fe2e689b | 583 | |
joaquinbvw | 0:e3f3fe2e689b | 584 | case CR2_CMD_ENABLE_RF: |
joaquinbvw | 0:e3f3fe2e689b | 585 | if (payload_len == 1){ |
joaquinbvw | 0:e3f3fe2e689b | 586 | //if (payload[0] == 0) |
joaquinbvw | 0:e3f3fe2e689b | 587 | //success = this->disableRF(); |
joaquinbvw | 0:e3f3fe2e689b | 588 | //else |
joaquinbvw | 0:e3f3fe2e689b | 589 | //success = this->enableRF(); |
joaquinbvw | 0:e3f3fe2e689b | 590 | } |
joaquinbvw | 0:e3f3fe2e689b | 591 | break; |
joaquinbvw | 0:e3f3fe2e689b | 592 | |
joaquinbvw | 0:e3f3fe2e689b | 593 | case CR2_CMD_MULTIPLIER: |
joaquinbvw | 0:e3f3fe2e689b | 594 | if (payload_len == 1){ |
joaquinbvw | 0:e3f3fe2e689b | 595 | //success = this->wrMultiplier(payload[0]); |
joaquinbvw | 0:e3f3fe2e689b | 596 | } |
joaquinbvw | 0:e3f3fe2e689b | 597 | if (payload_len == 3){ |
joaquinbvw | 0:e3f3fe2e689b | 598 | unsigned short clock = payload[1]*256 + payload[2]; |
joaquinbvw | 0:e3f3fe2e689b | 599 | //success = this->wrMultiplier(payload[0], (float)clock); |
joaquinbvw | 0:e3f3fe2e689b | 600 | } |
joaquinbvw | 0:e3f3fe2e689b | 601 | break; |
joaquinbvw | 0:e3f3fe2e689b | 602 | |
joaquinbvw | 0:e3f3fe2e689b | 603 | case CR2_CMD_MODE: |
joaquinbvw | 0:e3f3fe2e689b | 604 | if (payload_len == 1){ |
joaquinbvw | 0:e3f3fe2e689b | 605 | //success = this->wrMode(payload[0]); |
joaquinbvw | 0:e3f3fe2e689b | 606 | } |
joaquinbvw | 0:e3f3fe2e689b | 607 | break; |
joaquinbvw | 0:e3f3fe2e689b | 608 | |
joaquinbvw | 0:e3f3fe2e689b | 609 | case CR2_CMD_FREQUENCYA: |
joaquinbvw | 0:e3f3fe2e689b | 610 | if (payload_len == 6){ |
joaquinbvw | 0:e3f3fe2e689b | 611 | //success = this->wrFrequency1(payload); |
joaquinbvw | 0:e3f3fe2e689b | 612 | } |
joaquinbvw | 0:e3f3fe2e689b | 613 | break; |
joaquinbvw | 0:e3f3fe2e689b | 614 | |
joaquinbvw | 0:e3f3fe2e689b | 615 | case CR2_CMD_FREQUENCYB: |
joaquinbvw | 0:e3f3fe2e689b | 616 | if (payload_len == 6){ |
joaquinbvw | 0:e3f3fe2e689b | 617 | //success = this->wrFrequency2(payload); |
joaquinbvw | 0:e3f3fe2e689b | 618 | } |
joaquinbvw | 0:e3f3fe2e689b | 619 | break; |
joaquinbvw | 0:e3f3fe2e689b | 620 | |
joaquinbvw | 0:e3f3fe2e689b | 621 | case CR2_CMD_PHASEA: |
joaquinbvw | 0:e3f3fe2e689b | 622 | if (payload_len == 2){ |
joaquinbvw | 0:e3f3fe2e689b | 623 | //success = this->wrPhase1(payload); |
joaquinbvw | 0:e3f3fe2e689b | 624 | } |
joaquinbvw | 0:e3f3fe2e689b | 625 | break; |
joaquinbvw | 0:e3f3fe2e689b | 626 | |
joaquinbvw | 0:e3f3fe2e689b | 627 | case CR2_CMD_PHASEB: |
joaquinbvw | 0:e3f3fe2e689b | 628 | if (payload_len == 2){ |
joaquinbvw | 0:e3f3fe2e689b | 629 | //success = this->wrPhase2(payload); |
joaquinbvw | 0:e3f3fe2e689b | 630 | } |
joaquinbvw | 0:e3f3fe2e689b | 631 | break; |
joaquinbvw | 0:e3f3fe2e689b | 632 | |
joaquinbvw | 0:e3f3fe2e689b | 633 | case CR2_CMD_AMPLITUDE1: |
joaquinbvw | 0:e3f3fe2e689b | 634 | if (payload_len == 2){ |
joaquinbvw | 0:e3f3fe2e689b | 635 | //success = this->wrAmplitudeI(payload); |
joaquinbvw | 0:e3f3fe2e689b | 636 | } |
joaquinbvw | 0:e3f3fe2e689b | 637 | break; |
joaquinbvw | 0:e3f3fe2e689b | 638 | |
joaquinbvw | 0:e3f3fe2e689b | 639 | case CR2_CMD_AMPLITUDE2: |
joaquinbvw | 0:e3f3fe2e689b | 640 | if (payload_len == 2){ |
joaquinbvw | 0:e3f3fe2e689b | 641 | //success = this->wrAmplitudeQ(payload); |
joaquinbvw | 0:e3f3fe2e689b | 642 | } |
joaquinbvw | 0:e3f3fe2e689b | 643 | break; |
joaquinbvw | 0:e3f3fe2e689b | 644 | |
joaquinbvw | 0:e3f3fe2e689b | 645 | case CR2_CMD_READ | CR2_CMD_ENABLE_RF: |
joaquinbvw | 0:e3f3fe2e689b | 646 | //if (this->isRFEnabled() == 1) |
joaquinbvw | 0:e3f3fe2e689b | 647 | // tx_msg = ONE_MSG; |
joaquinbvw | 0:e3f3fe2e689b | 648 | //else |
joaquinbvw | 0:e3f3fe2e689b | 649 | // tx_msg = ZERO_MSG; |
joaquinbvw | 0:e3f3fe2e689b | 650 | |
joaquinbvw | 0:e3f3fe2e689b | 651 | tx_msg_len = 1; |
joaquinbvw | 0:e3f3fe2e689b | 652 | |
joaquinbvw | 0:e3f3fe2e689b | 653 | break; |
joaquinbvw | 0:e3f3fe2e689b | 654 | |
joaquinbvw | 0:e3f3fe2e689b | 655 | case CR2_CMD_READ | CR2_CMD_MULTIPLIER: |
joaquinbvw | 0:e3f3fe2e689b | 656 | //tx_msg = this->rdMultiplier(); |
joaquinbvw | 0:e3f3fe2e689b | 657 | tx_msg_len = 1; |
joaquinbvw | 0:e3f3fe2e689b | 658 | break; |
joaquinbvw | 0:e3f3fe2e689b | 659 | |
joaquinbvw | 0:e3f3fe2e689b | 660 | case CR2_CMD_READ | CR2_CMD_MODE: |
joaquinbvw | 0:e3f3fe2e689b | 661 | //tx_msg = this->rdMode(); |
joaquinbvw | 0:e3f3fe2e689b | 662 | tx_msg_len = 1; |
joaquinbvw | 0:e3f3fe2e689b | 663 | break; |
joaquinbvw | 0:e3f3fe2e689b | 664 | |
joaquinbvw | 0:e3f3fe2e689b | 665 | case CR2_CMD_READ | CR2_CMD_FREQUENCYA: |
joaquinbvw | 0:e3f3fe2e689b | 666 | //tx_msg = this->rdFrequency1(); |
joaquinbvw | 0:e3f3fe2e689b | 667 | tx_msg_len = 6; |
joaquinbvw | 0:e3f3fe2e689b | 668 | break; |
joaquinbvw | 0:e3f3fe2e689b | 669 | |
joaquinbvw | 0:e3f3fe2e689b | 670 | case CR2_CMD_READ | CR2_CMD_FREQUENCYB: |
joaquinbvw | 0:e3f3fe2e689b | 671 | //tx_msg = this->rdFrequency2(); |
joaquinbvw | 0:e3f3fe2e689b | 672 | tx_msg_len = 6; |
joaquinbvw | 0:e3f3fe2e689b | 673 | break; |
joaquinbvw | 0:e3f3fe2e689b | 674 | |
joaquinbvw | 0:e3f3fe2e689b | 675 | case CR2_CMD_READ | CR2_CMD_PHASEA: |
joaquinbvw | 0:e3f3fe2e689b | 676 | //tx_msg = this->rdPhase1(); |
joaquinbvw | 0:e3f3fe2e689b | 677 | tx_msg_len = 2; |
joaquinbvw | 0:e3f3fe2e689b | 678 | break; |
joaquinbvw | 0:e3f3fe2e689b | 679 | |
joaquinbvw | 0:e3f3fe2e689b | 680 | case CR2_CMD_READ | CR2_CMD_PHASEB: |
joaquinbvw | 0:e3f3fe2e689b | 681 | //tx_msg = this->rdPhase2(); |
joaquinbvw | 0:e3f3fe2e689b | 682 | tx_msg_len = 2; |
joaquinbvw | 0:e3f3fe2e689b | 683 | break; |
joaquinbvw | 0:e3f3fe2e689b | 684 | |
joaquinbvw | 0:e3f3fe2e689b | 685 | case CR2_CMD_READ | CR2_CMD_AMPLITUDE1: |
joaquinbvw | 0:e3f3fe2e689b | 686 | //tx_msg = this->rdAmplitudeI(); |
joaquinbvw | 0:e3f3fe2e689b | 687 | tx_msg_len = 2; |
joaquinbvw | 0:e3f3fe2e689b | 688 | break; |
joaquinbvw | 0:e3f3fe2e689b | 689 | |
joaquinbvw | 0:e3f3fe2e689b | 690 | case CR2_CMD_READ | CR2_CMD_AMPLITUDE2: |
joaquinbvw | 0:e3f3fe2e689b | 691 | //tx_msg = this->rdAmplitudeQ(); |
joaquinbvw | 0:e3f3fe2e689b | 692 | tx_msg_len = 2; |
joaquinbvw | 0:e3f3fe2e689b | 693 | break; |
joaquinbvw | 0:e3f3fe2e689b | 694 | |
joaquinbvw | 0:e3f3fe2e689b | 695 | default: |
joaquinbvw | 0:e3f3fe2e689b | 696 | success = false; |
joaquinbvw | 0:e3f3fe2e689b | 697 | |
joaquinbvw | 0:e3f3fe2e689b | 698 | } |
joaquinbvw | 0:e3f3fe2e689b | 699 | |
joaquinbvw | 0:e3f3fe2e689b | 700 | if (success){ |
joaquinbvw | 0:e3f3fe2e689b | 701 | tx_msg = OK_MSG; |
joaquinbvw | 0:e3f3fe2e689b | 702 | tx_msg_len = 2; |
joaquinbvw | 0:e3f3fe2e689b | 703 | } |
joaquinbvw | 0:e3f3fe2e689b | 704 | |
joaquinbvw | 0:e3f3fe2e689b | 705 | this->cmd_answer = tx_msg; |
joaquinbvw | 0:e3f3fe2e689b | 706 | this->cmd_answer_len = tx_msg_len; |
joaquinbvw | 0:e3f3fe2e689b | 707 | |
joaquinbvw | 0:e3f3fe2e689b | 708 | return tx_msg; |
joaquinbvw | 0:e3f3fe2e689b | 709 | } |
joaquinbvw | 0:e3f3fe2e689b | 710 | |
joaquinbvw | 0:e3f3fe2e689b | 711 | char* CR2::getCmdAnswer(){ |
joaquinbvw | 0:e3f3fe2e689b | 712 | |
joaquinbvw | 0:e3f3fe2e689b | 713 | return this->cmd_answer; |
joaquinbvw | 0:e3f3fe2e689b | 714 | |
joaquinbvw | 0:e3f3fe2e689b | 715 | } |
joaquinbvw | 0:e3f3fe2e689b | 716 | |
joaquinbvw | 0:e3f3fe2e689b | 717 | unsigned long CR2::getCmdAnswerLen(){ |
joaquinbvw | 0:e3f3fe2e689b | 718 | |
joaquinbvw | 0:e3f3fe2e689b | 719 | return this->cmd_answer_len; |
joaquinbvw | 0:e3f3fe2e689b | 720 | |
joaquinbvw | 0:e3f3fe2e689b | 721 | } |
joaquinbvw | 0:e3f3fe2e689b | 722 | /* |
joaquinbvw | 0:e3f3fe2e689b | 723 | int CR2::setAllDevice(char* payload, SerialDriver *screen){ |
joaquinbvw | 0:e3f3fe2e689b | 724 | |
joaquinbvw | 0:e3f3fe2e689b | 725 | int sts; |
joaquinbvw | 0:e3f3fe2e689b | 726 | char* phase1, *phase2; |
joaquinbvw | 0:e3f3fe2e689b | 727 | char* freq1, *freq2; |
joaquinbvw | 0:e3f3fe2e689b | 728 | char* delta_freq, *upd_rate_clk, *ramp_rate_clk; |
joaquinbvw | 0:e3f3fe2e689b | 729 | char* control_reg; |
joaquinbvw | 0:e3f3fe2e689b | 730 | char* amplitudeI, *amplitudeQ, *ampl_ramp_rate; |
joaquinbvw | 0:e3f3fe2e689b | 731 | char* qdac; |
joaquinbvw | 0:e3f3fe2e689b | 732 | |
joaquinbvw | 0:e3f3fe2e689b | 733 | phase1 = &payload[0x00]; |
joaquinbvw | 0:e3f3fe2e689b | 734 | phase2 = &payload[0x02]; |
joaquinbvw | 0:e3f3fe2e689b | 735 | freq1 = &payload[0x04]; |
joaquinbvw | 0:e3f3fe2e689b | 736 | freq2 = &payload[0x0A]; |
joaquinbvw | 0:e3f3fe2e689b | 737 | delta_freq = &payload[0x10]; |
joaquinbvw | 0:e3f3fe2e689b | 738 | upd_rate_clk = &payload[0x16]; |
joaquinbvw | 0:e3f3fe2e689b | 739 | ramp_rate_clk = &payload[0x1A]; |
joaquinbvw | 0:e3f3fe2e689b | 740 | control_reg = &payload[0x1D]; |
joaquinbvw | 0:e3f3fe2e689b | 741 | amplitudeI = &payload[0x21]; |
joaquinbvw | 0:e3f3fe2e689b | 742 | amplitudeQ = &payload[0x23]; |
joaquinbvw | 0:e3f3fe2e689b | 743 | ampl_ramp_rate = &payload[0x25]; |
joaquinbvw | 0:e3f3fe2e689b | 744 | qdac = &payload[0x26]; |
joaquinbvw | 0:e3f3fe2e689b | 745 | |
joaquinbvw | 0:e3f3fe2e689b | 746 | control_reg[2] = control_reg[2] & 0xFE; //cr2_ioupdclk always as an input = 0 |
joaquinbvw | 0:e3f3fe2e689b | 747 | control_reg[3] = control_reg[3] & 0xFD; //LSB first = 0, MSB first enabled |
joaquinbvw | 0:e3f3fe2e689b | 748 | control_reg[3] = control_reg[3] | 0x01; //cr2_sdo enable = 1 |
joaquinbvw | 0:e3f3fe2e689b | 749 | |
joaquinbvw | 0:e3f3fe2e689b | 750 | this->__writeDataAndVerify(0x04, delta_freq); |
joaquinbvw | 0:e3f3fe2e689b | 751 | this->__writeDataAndVerify(0x05, upd_rate_clk); |
joaquinbvw | 0:e3f3fe2e689b | 752 | this->__writeDataAndVerify(0x06, ramp_rate_clk); |
joaquinbvw | 0:e3f3fe2e689b | 753 | this->__writeDataAndVerify(0x07, control_reg); |
joaquinbvw | 0:e3f3fe2e689b | 754 | |
joaquinbvw | 0:e3f3fe2e689b | 755 | this->__writeDataAndVerify(0x0A, ampl_ramp_rate); |
joaquinbvw | 0:e3f3fe2e689b | 756 | this->__writeDataAndVerify(0x0B, qdac, screen); |
joaquinbvw | 0:e3f3fe2e689b | 757 | |
joaquinbvw | 0:e3f3fe2e689b | 758 | this->wrPhase1(phase1); |
joaquinbvw | 0:e3f3fe2e689b | 759 | this->wrPhase2(phase2); |
joaquinbvw | 0:e3f3fe2e689b | 760 | this->wrFrequency1(freq1); |
joaquinbvw | 0:e3f3fe2e689b | 761 | this->wrFrequency2(freq2); |
joaquinbvw | 0:e3f3fe2e689b | 762 | this->wrAmplitudeI(amplitudeI); |
joaquinbvw | 0:e3f3fe2e689b | 763 | this->wrAmplitudeQ(amplitudeQ); |
joaquinbvw | 0:e3f3fe2e689b | 764 | |
joaquinbvw | 0:e3f3fe2e689b | 765 | //Enabling RF |
joaquinbvw | 0:e3f3fe2e689b | 766 | sts = this->enableRF(); |
joaquinbvw | 0:e3f3fe2e689b | 767 | |
joaquinbvw | 0:e3f3fe2e689b | 768 | return sts; |
joaquinbvw | 0:e3f3fe2e689b | 769 | |
joaquinbvw | 0:e3f3fe2e689b | 770 | } |
joaquinbvw | 0:e3f3fe2e689b | 771 | */ |
joaquinbvw | 0:e3f3fe2e689b | 772 | bool CR2::wasInitialized(){ |
joaquinbvw | 0:e3f3fe2e689b | 773 | |
joaquinbvw | 0:e3f3fe2e689b | 774 | return this->isConfig; |
joaquinbvw | 0:e3f3fe2e689b | 775 | } |
joaquinbvw | 0:e3f3fe2e689b | 776 | |
joaquinbvw | 0:e3f3fe2e689b | 777 | char CR2::getMultiplier(){ |
joaquinbvw | 0:e3f3fe2e689b | 778 | return this->cr2_multiplier; |
joaquinbvw | 0:e3f3fe2e689b | 779 | } |
joaquinbvw | 0:e3f3fe2e689b | 780 | |
joaquinbvw | 0:e3f3fe2e689b | 781 | double CR2::getFreqFactor1(){ |
joaquinbvw | 0:e3f3fe2e689b | 782 | factor_freq1 = ((double)frequency1[0])/256.0 + ((double)frequency1[1])/65536.0 + ((double)frequency1[2])/16777216.0 + ((double)frequency1[3])/4294967296.0; |
joaquinbvw | 0:e3f3fe2e689b | 783 | factor_freq1 *= ((double)this->cr2_multiplier); |
joaquinbvw | 0:e3f3fe2e689b | 784 | |
joaquinbvw | 0:e3f3fe2e689b | 785 | return factor_freq1; |
joaquinbvw | 0:e3f3fe2e689b | 786 | } |
joaquinbvw | 0:e3f3fe2e689b | 787 | |
joaquinbvw | 0:e3f3fe2e689b | 788 | double CR2::getFreqFactor2(){ |
joaquinbvw | 0:e3f3fe2e689b | 789 | factor_freq2 = ((double)frequency2[0])/256.0 + ((double)frequency2[1])/65536.0 + ((double)frequency2[2])/16777216.0 + ((double)frequency2[3])/4294967296.0; |
joaquinbvw | 0:e3f3fe2e689b | 790 | factor_freq2 *= ((double)this->cr2_multiplier); |
joaquinbvw | 0:e3f3fe2e689b | 791 | |
joaquinbvw | 0:e3f3fe2e689b | 792 | return factor_freq2; |
joaquinbvw | 0:e3f3fe2e689b | 793 | } |
joaquinbvw | 0:e3f3fe2e689b | 794 | |
joaquinbvw | 0:e3f3fe2e689b | 795 | char CR2::getMode(){ |
joaquinbvw | 0:e3f3fe2e689b | 796 | return this->cr2_mode; |
joaquinbvw | 0:e3f3fe2e689b | 797 | } |
joaquinbvw | 0:e3f3fe2e689b | 798 | |
joaquinbvw | 0:e3f3fe2e689b | 799 | char* CR2::getModeStr(){ |
joaquinbvw | 0:e3f3fe2e689b | 800 | |
joaquinbvw | 0:e3f3fe2e689b | 801 | if (this->cr2_mode > 4) |
joaquinbvw | 0:e3f3fe2e689b | 802 | return MODULATION[5]; |
joaquinbvw | 0:e3f3fe2e689b | 803 | |
joaquinbvw | 0:e3f3fe2e689b | 804 | return MODULATION[this->cr2_mode]; |
joaquinbvw | 0:e3f3fe2e689b | 805 | } |