Joaquin Verastegui / jro

Dependents:   JRO_CR2 frdm_test

Fork of jro by Miguel Urco

Committer:
miguelcordero191
Date:
Tue Dec 02 02:27:30 2014 +0000
Revision:
0:b444ea725ba7
Child:
1:7c424a3e12ea
Primer programa del DDS funcionando

Who changed what in which revision?

UserRevisionLine numberNew contents of line
miguelcordero191 0:b444ea725ba7 1 #include "dds.h"
miguelcordero191 0:b444ea725ba7 2
miguelcordero191 0:b444ea725ba7 3 static unsigned char controlRegister[4];
miguelcordero191 0:b444ea725ba7 4 static unsigned char read_spi_data[6];
miguelcordero191 0:b444ea725ba7 5 /*
miguelcordero191 0:b444ea725ba7 6 static unsigned short phase1[2];
miguelcordero191 0:b444ea725ba7 7 static unsigned short phase2[2];
miguelcordero191 0:b444ea725ba7 8 static unsigned long long freq1[6];
miguelcordero191 0:b444ea725ba7 9 static unsigned long long freq2[6];
miguelcordero191 0:b444ea725ba7 10 */
miguelcordero191 0:b444ea725ba7 11
miguelcordero191 0:b444ea725ba7 12 DDS::DDS(SPI *spi_dev, DigitalOut *mreset, DigitalIn *outramp, DigitalOut *spmode, DigitalOut *cs, DigitalOut *ioreset, DigitalInOut *updclk){
miguelcordero191 0:b444ea725ba7 13
miguelcordero191 0:b444ea725ba7 14 spi_device = spi_dev;
miguelcordero191 0:b444ea725ba7 15
miguelcordero191 0:b444ea725ba7 16 dds_mreset = mreset;
miguelcordero191 0:b444ea725ba7 17 dds_outramp = outramp;
miguelcordero191 0:b444ea725ba7 18 dds_sp_mode = spmode;
miguelcordero191 0:b444ea725ba7 19 dds_cs = cs;
miguelcordero191 0:b444ea725ba7 20 dds_io_reset = ioreset;
miguelcordero191 0:b444ea725ba7 21 dds_updclk = updclk;
miguelcordero191 0:b444ea725ba7 22
miguelcordero191 0:b444ea725ba7 23 dds_updclk->input();
miguelcordero191 0:b444ea725ba7 24 *dds_sp_mode = 0;
miguelcordero191 0:b444ea725ba7 25 *dds_cs = 1;
miguelcordero191 0:b444ea725ba7 26
miguelcordero191 0:b444ea725ba7 27 spi_device->format(SPI_BITS, SPI_MODE);
miguelcordero191 0:b444ea725ba7 28 spi_device->frequency(SPI_FREQ);
miguelcordero191 0:b444ea725ba7 29
miguelcordero191 0:b444ea725ba7 30 this->isConfig = false;
miguelcordero191 0:b444ea725ba7 31
miguelcordero191 0:b444ea725ba7 32 }
miguelcordero191 0:b444ea725ba7 33
miguelcordero191 0:b444ea725ba7 34 int DDS::__writeData(unsigned char addr, unsigned char ndata, const unsigned char* data){
miguelcordero191 0:b444ea725ba7 35
miguelcordero191 0:b444ea725ba7 36 // I/O reset
miguelcordero191 0:b444ea725ba7 37 *dds_updclk = 0;
miguelcordero191 0:b444ea725ba7 38 *dds_io_reset = 1;
miguelcordero191 0:b444ea725ba7 39 wait_us(10);
miguelcordero191 0:b444ea725ba7 40 *dds_io_reset = 0;
miguelcordero191 0:b444ea725ba7 41 wait_us(10);
miguelcordero191 0:b444ea725ba7 42
miguelcordero191 0:b444ea725ba7 43 *dds_cs = 0;
miguelcordero191 0:b444ea725ba7 44
miguelcordero191 0:b444ea725ba7 45 //Sending serial address
miguelcordero191 0:b444ea725ba7 46 printf("\r\nWriting Addr = %d", addr);
miguelcordero191 0:b444ea725ba7 47 spi_device->write(addr & 0x0F);
miguelcordero191 0:b444ea725ba7 48
miguelcordero191 0:b444ea725ba7 49 for(unsigned char i = ndata; i > 0; i--)
miguelcordero191 0:b444ea725ba7 50 {
miguelcordero191 0:b444ea725ba7 51 wait_us(150);
miguelcordero191 0:b444ea725ba7 52 spi_device->write(data[i-1]);
miguelcordero191 0:b444ea725ba7 53 }
miguelcordero191 0:b444ea725ba7 54
miguelcordero191 0:b444ea725ba7 55 *dds_cs = 1;
miguelcordero191 0:b444ea725ba7 56
miguelcordero191 0:b444ea725ba7 57 for(unsigned char i = ndata; i > 0; i--)
miguelcordero191 0:b444ea725ba7 58 {
miguelcordero191 0:b444ea725ba7 59 printf("\r\nData[%d] = %d", i-1, data[i-1]);
miguelcordero191 0:b444ea725ba7 60 }
miguelcordero191 0:b444ea725ba7 61
miguelcordero191 0:b444ea725ba7 62 wait_us(10);
miguelcordero191 0:b444ea725ba7 63 *dds_updclk = 1;
miguelcordero191 0:b444ea725ba7 64 wait_us(10);
miguelcordero191 0:b444ea725ba7 65 *dds_updclk = 0;
miguelcordero191 0:b444ea725ba7 66 wait_us(10);
miguelcordero191 0:b444ea725ba7 67
miguelcordero191 0:b444ea725ba7 68 return 1;
miguelcordero191 0:b444ea725ba7 69 }
miguelcordero191 0:b444ea725ba7 70
miguelcordero191 0:b444ea725ba7 71
miguelcordero191 0:b444ea725ba7 72 unsigned char* DDS::__readData(unsigned char addr, unsigned char ndata){
miguelcordero191 0:b444ea725ba7 73
miguelcordero191 0:b444ea725ba7 74 // I/O reset
miguelcordero191 0:b444ea725ba7 75 *dds_io_reset = 1;
miguelcordero191 0:b444ea725ba7 76 wait_us(10);
miguelcordero191 0:b444ea725ba7 77 *dds_io_reset = 0;
miguelcordero191 0:b444ea725ba7 78 wait_us(10);
miguelcordero191 0:b444ea725ba7 79
miguelcordero191 0:b444ea725ba7 80 *dds_cs = 0;
miguelcordero191 0:b444ea725ba7 81
miguelcordero191 0:b444ea725ba7 82 //Sending serial address
miguelcordero191 0:b444ea725ba7 83 printf("\r\nReading Addr = %d", addr);
miguelcordero191 0:b444ea725ba7 84 spi_device->write((addr & 0x0F) | 0x80);
miguelcordero191 0:b444ea725ba7 85
miguelcordero191 0:b444ea725ba7 86 for(unsigned char i = ndata; i > 0; i--)
miguelcordero191 0:b444ea725ba7 87 {
miguelcordero191 0:b444ea725ba7 88 wait_us(150);
miguelcordero191 0:b444ea725ba7 89 read_spi_data[i-1] = spi_device->write(0x00);
miguelcordero191 0:b444ea725ba7 90 }
miguelcordero191 0:b444ea725ba7 91
miguelcordero191 0:b444ea725ba7 92 *dds_cs = 1;
miguelcordero191 0:b444ea725ba7 93
miguelcordero191 0:b444ea725ba7 94 for(unsigned char i = ndata; i > 0; i--)
miguelcordero191 0:b444ea725ba7 95 {
miguelcordero191 0:b444ea725ba7 96 printf("\r\nData[%d] = %d", i-1, read_spi_data[i-1]);
miguelcordero191 0:b444ea725ba7 97 }
miguelcordero191 0:b444ea725ba7 98
miguelcordero191 0:b444ea725ba7 99 wait_us(10);
miguelcordero191 0:b444ea725ba7 100
miguelcordero191 0:b444ea725ba7 101 return read_spi_data;
miguelcordero191 0:b444ea725ba7 102 }
miguelcordero191 0:b444ea725ba7 103
miguelcordero191 0:b444ea725ba7 104 int DDS::__writeDataAndVerify(unsigned char addr, unsigned char ndata, const unsigned char* wr_spi_data){
miguelcordero191 0:b444ea725ba7 105
miguelcordero191 0:b444ea725ba7 106 bool success;
miguelcordero191 0:b444ea725ba7 107 unsigned char* rd_spi_data;
miguelcordero191 0:b444ea725ba7 108
miguelcordero191 0:b444ea725ba7 109 this->__writeData(addr, ndata, wr_spi_data);
miguelcordero191 0:b444ea725ba7 110 rd_spi_data = this->__readData(addr, ndata);
miguelcordero191 0:b444ea725ba7 111
miguelcordero191 0:b444ea725ba7 112 success = true;
miguelcordero191 0:b444ea725ba7 113
miguelcordero191 0:b444ea725ba7 114 for(unsigned char i = 0; i < ndata; i++)
miguelcordero191 0:b444ea725ba7 115 {
miguelcordero191 0:b444ea725ba7 116
miguelcordero191 0:b444ea725ba7 117 if (wr_spi_data[i] != rd_spi_data[i])
miguelcordero191 0:b444ea725ba7 118 {
miguelcordero191 0:b444ea725ba7 119 success = false;
miguelcordero191 0:b444ea725ba7 120 break;
miguelcordero191 0:b444ea725ba7 121 }
miguelcordero191 0:b444ea725ba7 122
miguelcordero191 0:b444ea725ba7 123 }
miguelcordero191 0:b444ea725ba7 124
miguelcordero191 0:b444ea725ba7 125 printf("\r\nSuccessful writting = %d\r\n", success);
miguelcordero191 0:b444ea725ba7 126
miguelcordero191 0:b444ea725ba7 127 return success;
miguelcordero191 0:b444ea725ba7 128 }
miguelcordero191 0:b444ea725ba7 129
miguelcordero191 0:b444ea725ba7 130 unsigned char* DDS::__getControlRegister(){
miguelcordero191 0:b444ea725ba7 131
miguelcordero191 0:b444ea725ba7 132 bool pll_range = 0;
miguelcordero191 0:b444ea725ba7 133 bool pll_bypass = 1;
miguelcordero191 0:b444ea725ba7 134
miguelcordero191 0:b444ea725ba7 135 if (cr_multiplier >= 4){
miguelcordero191 0:b444ea725ba7 136 pll_bypass = 0;
miguelcordero191 0:b444ea725ba7 137 }
miguelcordero191 0:b444ea725ba7 138
miguelcordero191 0:b444ea725ba7 139 if (frequency >= 200.0){
miguelcordero191 0:b444ea725ba7 140 pll_range = 1;
miguelcordero191 0:b444ea725ba7 141 }
miguelcordero191 0:b444ea725ba7 142
miguelcordero191 0:b444ea725ba7 143 controlRegister[3] = 0x10;
miguelcordero191 0:b444ea725ba7 144 controlRegister[2] = pll_range*64 + pll_bypass*32 + (cr_multiplier & 0x1F);
miguelcordero191 0:b444ea725ba7 145 controlRegister[1] = (cr_mode & 0x07)*2 + cr_ioupdclk;
miguelcordero191 0:b444ea725ba7 146 controlRegister[0] = cr_inv_sinc*64 + cr_osk_en*32 + cr_osk_int*16 + cr_msb_lsb*2 + cr_sdo;
miguelcordero191 0:b444ea725ba7 147
miguelcordero191 0:b444ea725ba7 148 return controlRegister;
miguelcordero191 0:b444ea725ba7 149
miguelcordero191 0:b444ea725ba7 150 }
miguelcordero191 0:b444ea725ba7 151
miguelcordero191 0:b444ea725ba7 152 int DDS::__writeControlRegister(){
miguelcordero191 0:b444ea725ba7 153
miguelcordero191 0:b444ea725ba7 154 bool success;
miguelcordero191 0:b444ea725ba7 155 unsigned char* wr_spi_data;
miguelcordero191 0:b444ea725ba7 156 unsigned char* rd_spi_data;
miguelcordero191 0:b444ea725ba7 157 unsigned char addr = 0x07, ndata = 4;
miguelcordero191 0:b444ea725ba7 158
miguelcordero191 0:b444ea725ba7 159 wr_spi_data = this->__getControlRegister();
miguelcordero191 0:b444ea725ba7 160
miguelcordero191 0:b444ea725ba7 161 success = this->__writeData(addr, ndata, wr_spi_data);
miguelcordero191 0:b444ea725ba7 162
miguelcordero191 0:b444ea725ba7 163 //printf("\r\nChanging UPD_CLK as an OUTPUT ...");
miguelcordero191 0:b444ea725ba7 164 dds_updclk->output();
miguelcordero191 0:b444ea725ba7 165
miguelcordero191 0:b444ea725ba7 166 wait_us(100);
miguelcordero191 0:b444ea725ba7 167 *dds_updclk = 1;
miguelcordero191 0:b444ea725ba7 168 wait_us(10);
miguelcordero191 0:b444ea725ba7 169 *dds_updclk = 0;
miguelcordero191 0:b444ea725ba7 170 wait_us(10);
miguelcordero191 0:b444ea725ba7 171
miguelcordero191 0:b444ea725ba7 172 rd_spi_data = this->__readData(addr, ndata);
miguelcordero191 0:b444ea725ba7 173
miguelcordero191 0:b444ea725ba7 174 success = true;
miguelcordero191 0:b444ea725ba7 175
miguelcordero191 0:b444ea725ba7 176 for(unsigned char i = 0; i < ndata; i++)
miguelcordero191 0:b444ea725ba7 177 {
miguelcordero191 0:b444ea725ba7 178 if (wr_spi_data[i] != rd_spi_data[i])
miguelcordero191 0:b444ea725ba7 179 {
miguelcordero191 0:b444ea725ba7 180 success = false;
miguelcordero191 0:b444ea725ba7 181 break;
miguelcordero191 0:b444ea725ba7 182 }
miguelcordero191 0:b444ea725ba7 183 }
miguelcordero191 0:b444ea725ba7 184
miguelcordero191 0:b444ea725ba7 185 return success;
miguelcordero191 0:b444ea725ba7 186 }
miguelcordero191 0:b444ea725ba7 187
miguelcordero191 0:b444ea725ba7 188
miguelcordero191 0:b444ea725ba7 189 int DDS::reset(){
miguelcordero191 0:b444ea725ba7 190
miguelcordero191 0:b444ea725ba7 191 // Master reset
miguelcordero191 0:b444ea725ba7 192 //Set as a input, temporary
miguelcordero191 0:b444ea725ba7 193 //printf("\r\nChange updclk direction as an INPUT ...\r\n");
miguelcordero191 0:b444ea725ba7 194 dds_updclk->input();
miguelcordero191 0:b444ea725ba7 195 dds_updclk->mode(PullDown);
miguelcordero191 0:b444ea725ba7 196
miguelcordero191 0:b444ea725ba7 197 //printf("\r\nReseting DDS ...\r\n");
miguelcordero191 0:b444ea725ba7 198 *dds_mreset = 1;
miguelcordero191 0:b444ea725ba7 199 wait_ms(1);
miguelcordero191 0:b444ea725ba7 200 *dds_mreset = 0;
miguelcordero191 0:b444ea725ba7 201 wait_ms(1);
miguelcordero191 0:b444ea725ba7 202 return 0;
miguelcordero191 0:b444ea725ba7 203 }
miguelcordero191 0:b444ea725ba7 204
miguelcordero191 0:b444ea725ba7 205 int DDS::scanIOUpdate(){
miguelcordero191 0:b444ea725ba7 206
miguelcordero191 0:b444ea725ba7 207 unsigned int cont = 0;
miguelcordero191 0:b444ea725ba7 208
miguelcordero191 0:b444ea725ba7 209 this->reset();
miguelcordero191 0:b444ea725ba7 210
miguelcordero191 0:b444ea725ba7 211 printf("\r\nWaiting a upd_clk ...\r\n");
miguelcordero191 0:b444ea725ba7 212 while(true){
miguelcordero191 0:b444ea725ba7 213 if (*dds_updclk == 1)
miguelcordero191 0:b444ea725ba7 214 break;
miguelcordero191 0:b444ea725ba7 215
miguelcordero191 0:b444ea725ba7 216 cont += 1;
miguelcordero191 0:b444ea725ba7 217 if (cont > 10000)
miguelcordero191 0:b444ea725ba7 218 break;
miguelcordero191 0:b444ea725ba7 219
miguelcordero191 0:b444ea725ba7 220 wait_us(1);
miguelcordero191 0:b444ea725ba7 221 }
miguelcordero191 0:b444ea725ba7 222
miguelcordero191 0:b444ea725ba7 223 if (cont > 10000){
miguelcordero191 0:b444ea725ba7 224 printf("\r\nupd_clk did not found\r\n");
miguelcordero191 0:b444ea725ba7 225 return 0;
miguelcordero191 0:b444ea725ba7 226 }
miguelcordero191 0:b444ea725ba7 227
miguelcordero191 0:b444ea725ba7 228 printf("\r\nupd_clk found ...\r\n");
miguelcordero191 0:b444ea725ba7 229
miguelcordero191 0:b444ea725ba7 230 return 1;
miguelcordero191 0:b444ea725ba7 231 }
miguelcordero191 0:b444ea725ba7 232
miguelcordero191 0:b444ea725ba7 233 int DDS::find(){
miguelcordero191 0:b444ea725ba7 234 /*
miguelcordero191 0:b444ea725ba7 235 unsigned char phase[];
miguelcordero191 0:b444ea725ba7 236
miguelcordero191 0:b444ea725ba7 237 phase[0] = 0x0A;
miguelcordero191 0:b444ea725ba7 238 phase[1] = 0x55;
miguelcordero191 0:b444ea725ba7 239
miguelcordero191 0:b444ea725ba7 240 this->__writeDataAndVerify(0x00, 5, phase);
miguelcordero191 0:b444ea725ba7 241 */
miguelcordero191 0:b444ea725ba7 242 this->__readData(0x05, 4);
miguelcordero191 0:b444ea725ba7 243 this->__readData(0x0A, 1);
miguelcordero191 0:b444ea725ba7 244 return 1;
miguelcordero191 0:b444ea725ba7 245
miguelcordero191 0:b444ea725ba7 246 }
miguelcordero191 0:b444ea725ba7 247
miguelcordero191 0:b444ea725ba7 248
miguelcordero191 0:b444ea725ba7 249 int DDS::init(){
miguelcordero191 0:b444ea725ba7 250
miguelcordero191 0:b444ea725ba7 251 //printf("\r\nSetting default parameters in CR ...\r\n");
miguelcordero191 0:b444ea725ba7 252
miguelcordero191 0:b444ea725ba7 253 //Serial mode enabled
miguelcordero191 0:b444ea725ba7 254 this->frequency = 200.0; // Work frequency in MHz
miguelcordero191 0:b444ea725ba7 255 this->cr_multiplier = 20; // Multiplier 4- 20
miguelcordero191 0:b444ea725ba7 256 this->cr_mode = 0; // Single, FSK, Ramped FSK, Chirp, BPSK
miguelcordero191 0:b444ea725ba7 257 this->cr_ioupdclk = 0; // IO Update clock direction: 0 -> input, 1 -> output
miguelcordero191 0:b444ea725ba7 258 this->cr_inv_sinc = 0; // Sinc inverser filter enable: 0 -> enable
miguelcordero191 0:b444ea725ba7 259 this->cr_osk_en = 0; // Enable AM: 0 -> disabled
miguelcordero191 0:b444ea725ba7 260 this->cr_osk_int = 0; // ext/int output shaped control: 0 -> external
miguelcordero191 0:b444ea725ba7 261 this->cr_msb_lsb = 0; // msb/lsb bit first: 0 -> MSB, 1 -> LSB
miguelcordero191 0:b444ea725ba7 262 this->cr_sdo = 1; // SDO pin active: 0 -> inactive
miguelcordero191 0:b444ea725ba7 263
miguelcordero191 0:b444ea725ba7 264 //printf("\r\nSetting in serial mode ...\r\n");
miguelcordero191 0:b444ea725ba7 265 *dds_sp_mode = 0;
miguelcordero191 0:b444ea725ba7 266 *dds_cs = 1;
miguelcordero191 0:b444ea725ba7 267
miguelcordero191 0:b444ea725ba7 268 this->reset();
miguelcordero191 0:b444ea725ba7 269
miguelcordero191 0:b444ea725ba7 270 //printf("\r\nWritting CR ...\r\n");
miguelcordero191 0:b444ea725ba7 271
miguelcordero191 0:b444ea725ba7 272 if (not this->__writeControlRegister()){
miguelcordero191 0:b444ea725ba7 273 printf("\r\nUnsuccessful DDS initialization");
miguelcordero191 0:b444ea725ba7 274 this->isConfig = false;
miguelcordero191 0:b444ea725ba7 275 return false;
miguelcordero191 0:b444ea725ba7 276 }
miguelcordero191 0:b444ea725ba7 277
miguelcordero191 0:b444ea725ba7 278 printf("\r\nSuccessfull DDS initialization");
miguelcordero191 0:b444ea725ba7 279
miguelcordero191 0:b444ea725ba7 280 this->isConfig = true;
miguelcordero191 0:b444ea725ba7 281
miguelcordero191 0:b444ea725ba7 282 return true;
miguelcordero191 0:b444ea725ba7 283 }
miguelcordero191 0:b444ea725ba7 284
miguelcordero191 0:b444ea725ba7 285 int DDS::setSingleMode(){
miguelcordero191 0:b444ea725ba7 286 return 0;
miguelcordero191 0:b444ea725ba7 287 }
miguelcordero191 0:b444ea725ba7 288
miguelcordero191 0:b444ea725ba7 289 int DDS::setFSKMode(){
miguelcordero191 0:b444ea725ba7 290 return 0;
miguelcordero191 0:b444ea725ba7 291 }
miguelcordero191 0:b444ea725ba7 292
miguelcordero191 0:b444ea725ba7 293 int DDS::setBPSKMode(){
miguelcordero191 0:b444ea725ba7 294 return 0;
miguelcordero191 0:b444ea725ba7 295 }
miguelcordero191 0:b444ea725ba7 296
miguelcordero191 0:b444ea725ba7 297 int DDS::setMode(unsigned char mode){
miguelcordero191 0:b444ea725ba7 298
miguelcordero191 0:b444ea725ba7 299 this->cr_mode = mode & 0x07;
miguelcordero191 0:b444ea725ba7 300
miguelcordero191 0:b444ea725ba7 301 return this->__writeControlRegister();
miguelcordero191 0:b444ea725ba7 302 }
miguelcordero191 0:b444ea725ba7 303
miguelcordero191 0:b444ea725ba7 304 int DDS::setMultiplier(unsigned char multiplier, float clock){
miguelcordero191 0:b444ea725ba7 305
miguelcordero191 0:b444ea725ba7 306 this->cr_multiplier = multiplier & 0x1F;
miguelcordero191 0:b444ea725ba7 307 this->frequency = clock;
miguelcordero191 0:b444ea725ba7 308
miguelcordero191 0:b444ea725ba7 309 return this->__writeControlRegister();
miguelcordero191 0:b444ea725ba7 310 }
miguelcordero191 0:b444ea725ba7 311
miguelcordero191 0:b444ea725ba7 312 int DDS::setPhase1(unsigned char* phase){
miguelcordero191 0:b444ea725ba7 313
miguelcordero191 0:b444ea725ba7 314 return this->__writeDataAndVerify(0x00, 2, phase);
miguelcordero191 0:b444ea725ba7 315
miguelcordero191 0:b444ea725ba7 316 }
miguelcordero191 0:b444ea725ba7 317
miguelcordero191 0:b444ea725ba7 318 int DDS::setPhase2(unsigned char* phase){
miguelcordero191 0:b444ea725ba7 319
miguelcordero191 0:b444ea725ba7 320 return this->__writeDataAndVerify(0x01, 2, phase);
miguelcordero191 0:b444ea725ba7 321
miguelcordero191 0:b444ea725ba7 322 }
miguelcordero191 0:b444ea725ba7 323
miguelcordero191 0:b444ea725ba7 324 int DDS::setFrequency1(unsigned char* freq){
miguelcordero191 0:b444ea725ba7 325
miguelcordero191 0:b444ea725ba7 326 return this->__writeDataAndVerify(0x02, 6, freq);
miguelcordero191 0:b444ea725ba7 327
miguelcordero191 0:b444ea725ba7 328 }
miguelcordero191 0:b444ea725ba7 329 int DDS::setFrequency2(unsigned char* freq){
miguelcordero191 0:b444ea725ba7 330
miguelcordero191 0:b444ea725ba7 331 return this->__writeDataAndVerify(0x03, 6, freq);
miguelcordero191 0:b444ea725ba7 332
miguelcordero191 0:b444ea725ba7 333 }