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.
Dependents: JRO_DDSv2 JRO_DDSv2_rev2019
Revision 1:d81fca2297fb, committed 2019-09-04
- Comitter:
- miguelcordero191
- Date:
- Wed Sep 04 22:26:24 2019 +0000
- Parent:
- 0:156a9e15919e
- Commit message:
- 04/09/2019
Changed in this revision
| AD9854.cpp | Show annotated file Show diff for this revision Revisions of this file |
| AD9854.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/AD9854.cpp Tue Feb 24 20:08:13 2015 +0000
+++ b/AD9854.cpp Wed Sep 04 22:26:24 2019 +0000
@@ -2,15 +2,9 @@
static char controlRegister[4];
static char read_spi_data[6];
-
-static char* KO_MSG = "KO";
-static char* OK_MSG = "OK";
-static char* NI_MSG = "NI";
+static char message[0x32];
-static char* ZERO_MSG = "\x00";
-static char* ONE_MSG = "\x01";
-
-static char *MODULATION[6] = {"None ", "FSK ", "Ramped FSK ", "Chirp ", "BPSK ", "Not Allowed "};
+static char *MODULATION[6] = {"Single Tone ", "FSK ", "Ramped FSK ", "Chirp ", "BPSK ", "Not Allowed "};
DDS::DDS(SPI *spi_dev, DigitalOut *mreset, DigitalOut *outramp, DigitalOut *spmode, DigitalOut *cs, DigitalOut *ioreset, DigitalInOut *updclk){
@@ -111,11 +105,36 @@
return read_spi_data;
}
-int DDS::__writeDataAndVerify(char addr, char ndata, const char* wr_spi_data, SerialDriver *screen){
+int DDS::__writeDataAndVerify(char addr, char ndata, char* wr_spi_data, SerialDriver *screen){
int success;
char* rd_spi_data;
+ //Avoid some values in Control Register
+
+ if (addr==0x07){
+ wr_spi_data[2] = wr_spi_data[2] & 0xFE; //cr_ioupdclk always as an input = 0
+ wr_spi_data[3] = wr_spi_data[3] & 0xFD; //LSB first = 0, MSB first enabled
+ wr_spi_data[3] = wr_spi_data[3] | 0x01; //cr_sdo enable = 1
+
+ cr_qdac_pwdn = (wr_spi_data[0] & 0x04) >> 2;
+
+ cr_multiplier = (wr_spi_data[1] & 0x1F) >> 0;
+ cr_pll_bypass = (wr_spi_data[1] & 0x20) >> 5;
+ cr_pll_range = (wr_spi_data[1] & 0x40) >> 6;
+
+ cr_ioupdclk = (wr_spi_data[2] & 0x01) >> 0;
+ cr_mode = (wr_spi_data[2] & 0x07) >> 1;
+
+ cr_sdo = (wr_spi_data[3] & 0x01) >> 0;
+ cr_msb_lsb = (wr_spi_data[3] & 0x02) >> 1;
+ cr_osk_int = (wr_spi_data[3] & 0x10) >> 4;
+ cr_osk_en = (wr_spi_data[3] & 0x20) >> 5;
+ cr_inv_sinc = (wr_spi_data[3] & 0x40) >> 6;
+
+ }
+
+
this->__writeData(addr, ndata, wr_spi_data);
rd_spi_data = this->__readData(addr, ndata);
@@ -148,20 +167,18 @@
}
char* DDS::__getControlRegister(){
-
- bool pll_range = 0;
- bool pll_bypass = 1;
-
+ /*
if (cr_multiplier >= 4){
- pll_bypass = 0;
+ cr_pll_bypass = 0;
}
- if (clock >= 200){
- pll_range = 1;
+ if (this->clock >= 200.0){
+ cr_pll_range = 1;
}
-
+ */
+
controlRegister[0] = 0x10 + cr_qdac_pwdn*4;
- controlRegister[1] = pll_range*64 + pll_bypass*32 + (cr_multiplier & 0x1F);
+ controlRegister[1] = cr_pll_range*64 + cr_pll_bypass*32 + (cr_multiplier & 0x1F);
controlRegister[2] = (cr_mode & 0x07)*2 + cr_ioupdclk;
controlRegister[3] = cr_inv_sinc*64 + cr_osk_en*32 + cr_osk_int*16 + cr_msb_lsb*2 + cr_sdo;
@@ -221,6 +238,7 @@
wait_ms(1);
this->rf_enabled = false;
+ this->programmed = false;
return 0;
}
@@ -274,17 +292,23 @@
//printf("\r\nSetting default parameters in CR ...\r\n");
//Serial mode enabled
- this->clock = 200.0; // Work clock in MHz
+ this->clock = 200.0; // Work clock in MHz
this->cr_multiplier = 4; // Multiplier 4- 20
this->cr_mode = 0; // Single, FSK, Ramped FSK, Chirp, BPSK
this->cr_qdac_pwdn = 0; // QDAC power down enabled: 0 -> disable
this->cr_ioupdclk = 0; // IO Update clock direction: 0 -> input, 1 -> output
this->cr_inv_sinc = 0; // Sinc inverser filter enable: 0 -> enable
- this->cr_osk_en = 1; // Enable Amplitude multiplier: 0 -> disabled
+ this->cr_osk_en = 0; // Enable Amplitude multiplier: 0 -> disabled
this->cr_osk_int = 0; // register/counter output shaped control: 0 -> register, 1 -> counter
this->cr_msb_lsb = 0; // msb/lsb bit first: 0 -> MSB, 1 -> LSB
this->cr_sdo = 1; // SDO pin active: 0 -> inactive
+ this->cr_pll_range = 1; // Clock >= 200Mhz
+ this->cr_pll_bypass = 0;
+
+ this->cr_osk_en_bkp = this->cr_osk_en;
+ this->cr_osk_int_bkp = this->cr_osk_int;
+
//printf("\r\nSetting in serial mode ...\r\n");
*dds_sp_mode = 0;
*dds_cs = 1;
@@ -332,8 +356,8 @@
//Reaconditioning data to return
rd_data[0] = mult;
- rd_data[1] = ((int)clock >> 8) & 0xff;
- rd_data[2] = (int)clock & 0xff;
+ rd_data[1] = ((int)(this->clock) >> 8) & 0xff;
+ rd_data[2] = (int)(this->clock) & 0xff;
return rd_data;
}
@@ -401,6 +425,50 @@
return 0;
}
+
+int DDS::isAmplitudeEnabled(){
+
+ if (this->cr_osk_en)
+ return 1;
+
+ return 0;
+ }
+
+char* DDS::rdDeltaFrequency(){
+ char* rd_data;
+
+ rd_data = this->__readData(0x04, 6);
+
+ return rd_data;
+
+ }
+
+char* DDS::rdUpdateClock(){
+ char* rd_data;
+
+ rd_data = this->__readData(0x05, 4);
+
+ return rd_data;
+
+ }
+
+char* DDS::rdRampRateClock(){
+ char* rd_data;
+
+ rd_data = this->__readData(0x06, 3);
+
+ return rd_data;
+
+ }
+
+char* DDS::rdAmplitudeRampRate(){
+ char* rd_data;
+
+ rd_data = this->__readData(0x0A, 1);
+
+ return rd_data;
+
+ }
int DDS::wrMode(char mode){
@@ -408,7 +476,7 @@
return this->__writeControlRegister();
}
-
+
int DDS::wrMultiplier(char multiplier, float clock){
this->cr_multiplier = multiplier & 0x1F;
@@ -440,7 +508,10 @@
if (sts){
for (int i=0; i<6; i++)
frequency1[i] = freq[i];
+
+ this->programmed = true;
}
+
return sts;
}
@@ -478,24 +549,109 @@
}
+int DDS::wrDeltaFrequency(char* delta_freq, SerialDriver *screen){
+ int sts;
+
+ sts = this->__writeDataAndVerify(0x04, 6, delta_freq, screen);
+
+ if (sts){
+ for (int i=0; i<6; i++)
+ delta_frequency[i] = delta_freq[i];
+ }
+
+ return sts;
+
+ }
+
+int DDS::wrUpdateClock(char* upd_clock, SerialDriver *screen){
+ int sts;
+
+ sts = this->__writeDataAndVerify(0x05, 4, upd_clock, screen);
+
+ if (sts){
+ for (int i=0; i<4; i++)
+ update_clock[i] = upd_clock[i];
+ }
+
+ return sts;
+
+ }
+
+int DDS::wrRampRateClock(char* rr_clock, SerialDriver *screen){
+ int sts;
+
+ sts = this->__writeDataAndVerify(0x06, 3, rr_clock, screen);
+
+ if (sts){
+ for (int i=0; i<3; i++)
+ ramp_rate_clock[i] = rr_clock[i];
+ }
+
+ return sts;
+
+ }
+
+int DDS::wrAmplitudeRampRate(char* ampl_rate, SerialDriver *screen){
+ int sts;
+
+ sts = this->__writeDataAndVerify(0x0A, 1, ampl_rate, screen);
+
+ if (sts){
+ for (int i=0; i<1; i++)
+ amplitude_ramp_rate[i] = ampl_rate[i];
+ }
+
+ return sts;
+
+ }
+
+int DDS::enableAmplitude(){
+
+ this->cr_osk_en = 1;
+
+ return this->__writeControlRegister();
+ }
+
+int DDS::disableAmplitude(){
+
+ this->cr_osk_en = 0;
+
+ return this->__writeControlRegister();
+ }
+
int DDS::enableRF(){
+ this->cr_osk_en = this->cr_osk_en_bkp;
+ this->cr_osk_int = this->cr_osk_int_bkp;
+
+ this->__writeControlRegister();
+
+ this->__writeDataAndVerify(0x08, 2, this->amplitudeI);
+
this->rf_enabled = true;
- this->__writeDataAndVerify(0x08, 2, this->amplitudeI);
return this->__writeDataAndVerify(0x09, 2, this->amplitudeQ);
}
int DDS::disableRF(){
+ this->cr_osk_en_bkp = this->cr_osk_en;
+ this->cr_osk_int_bkp = this->cr_osk_int;
+
+ this->cr_osk_en = 1;
+ this->cr_osk_int = 0;
+
+ this->__writeControlRegister();
+
+ this->__writeDataAndVerify(0x08, 2, "\x00\x00");
+
this->rf_enabled = false;
- this->__writeDataAndVerify(0x08, 2, "\x00\x00");
return this->__writeDataAndVerify(0x09, 2, "\x00\x00");
}
-
+
int DDS::defaultSettings(SerialDriver *screen){
if (!(screen == NULL)){
@@ -510,25 +666,26 @@
this->wrFrequency2("\x00\x00\x00\x00\x00\x00");
this->wrPhase1("\x00\x00"); //0 grados
this->wrPhase2("\x20\x00"); //180 grados <> 0x20 0x00 <> 180/360*(2**14)
+ this->disableAmplitude();
this->disableRF();
if (!(screen == NULL)){
screen->putc(0x37);
screen->putc(0x31);
}
-
- return this->wrMode(4); //BPSK mode
+ this->programmed = false;
+ return this->wrMode(0); //BPSK mode
}
char* DDS::setCommand(unsigned short cmd, char* payload, unsigned long payload_len){
- bool success = false;
- char* tx_msg;
- unsigned long tx_msg_len;
+ bool success = false;
- tx_msg = KO_MSG;
- tx_msg_len = 2;
+ strcpy(message, MSG_CMD_OK);
+
+ this->cmd_answer = message;
+ this->cmd_answer_len = strlen(message);
//printf("cmd = %d, payload_len = %d", cmd, payload_len);
@@ -538,8 +695,11 @@
//Si el DDS no esta inicializado siempre retornar NI_MSG
if (not this->isConfig){
- this->cmd_answer = NI_MSG;
- this->cmd_answer_len = 2;
+
+ strcpy(message, MSG_STATUS_FAIL);
+
+ this->cmd_answer = message;
+ this->cmd_answer_len = strlen(message);
return this->cmd_answer;
}
@@ -548,6 +708,22 @@
{
case DDS_CMD_RESET:
success = this->init();
+ success = this->defaultSettings();
+ break;
+
+ case DDS_CMD_STATUS:
+
+ if (this->programmed == false)
+ strcpy(message, MSG_STATUS_ON);
+
+ if ((this->programmed == true) && (this->rf_enabled == false))
+ strcpy(message, MSG_STATUS_RF_DIS);
+
+ if ((this->programmed == true) && (this->rf_enabled == true))
+ strcpy(message, MSG_STATUS_RF_ENA);
+
+ this->cmd_answer = message;
+ this->cmd_answer_len = strlen(message);
break;
case DDS_CMD_ENABLE_RF:
@@ -558,7 +734,16 @@
success = this->enableRF();
}
break;
-
+
+ case DDS_CMD_ENABLE_AMP:
+ if (payload_len == 1){
+ if (payload[0] == 0)
+ success = this->disableAmplitude();
+ else
+ success = this->enableAmplitude();
+ }
+ break;
+
case DDS_CMD_MULTIPLIER:
if (payload_len == 1){
success = this->wrMultiplier(payload[0]);
@@ -610,71 +795,137 @@
success = this->wrAmplitudeQ(payload);
}
break;
-
+
+ case DDS_CMD_AMP_RAMP_RATE:
+ if (payload_len == 1){
+ success = this->wrAmplitudeRampRate(payload);
+ }
+ break;
+
+ case DDS_CMD_DELTA_FREQ:
+ if (payload_len == 1){
+ success = this->wrDeltaFrequency(payload);
+ }
+ break;
+
+ case DDS_CMD_UPD_CLOCK:
+ if (payload_len == 1){
+ success = this->wrUpdateClock(payload);
+ }
+ break;
+
+ case DDS_CMD_RAMP_RATE_CLOCK:
+ if (payload_len == 1){
+ success = this->wrRampRateClock(payload);
+ }
+ break;
+
case DDS_CMD_READ | DDS_CMD_ENABLE_RF:
if (this->isRFEnabled() == 1)
- tx_msg = ONE_MSG;
+ strcpy(message, MSG_ENABLED);
else
- tx_msg = ZERO_MSG;
+ strcpy(message, MSG_DISABLED);
- tx_msg_len = 1;
+ this->cmd_answer_len = strlen(message);
break;
+ case DDS_CMD_READ | DDS_CMD_ENABLE_AMP:
+ if (this->cr_osk_en == 1)
+ strcpy(message, MSG_ENABLED);
+ else
+ strcpy(message, MSG_DISABLED);
+
+ this->cmd_answer_len = strlen(message);
+
+ break;
+
case DDS_CMD_READ | DDS_CMD_MULTIPLIER:
- tx_msg = this->rdMultiplier();
- tx_msg_len = 1;
+ this->cmd_answer = this->rdMultiplier();
+ this->cmd_answer_len = 1;
break;
case DDS_CMD_READ | DDS_CMD_MODE:
- tx_msg = this->rdMode();
- tx_msg_len = 1;
+ this->cmd_answer = this->rdMode();
+ this->cmd_answer_len = 1;
break;
case DDS_CMD_READ | DDS_CMD_FREQUENCYA:
- tx_msg = this->rdFrequency1();
- tx_msg_len = 6;
+ this->cmd_answer = this->rdFrequency1();
+ this->cmd_answer_len = 6;
break;
case DDS_CMD_READ | DDS_CMD_FREQUENCYB:
- tx_msg = this->rdFrequency2();
- tx_msg_len = 6;
+ this->cmd_answer = this->rdFrequency2();
+ this->cmd_answer_len = 6;
break;
case DDS_CMD_READ | DDS_CMD_PHASEA:
- tx_msg = this->rdPhase1();
- tx_msg_len = 2;
+ this->cmd_answer = this->rdPhase1();
+ this->cmd_answer_len = 2;
break;
case DDS_CMD_READ | DDS_CMD_PHASEB:
- tx_msg = this->rdPhase2();
- tx_msg_len = 2;
+ this->cmd_answer = this->rdPhase2();
+ this->cmd_answer_len = 2;
break;
case DDS_CMD_READ | DDS_CMD_AMPLITUDE1:
- tx_msg = this->rdAmplitudeI();
- tx_msg_len = 2;
+ this->cmd_answer = this->rdAmplitudeI();
+ this->cmd_answer_len = 2;
break;
case DDS_CMD_READ | DDS_CMD_AMPLITUDE2:
- tx_msg = this->rdAmplitudeQ();
- tx_msg_len = 2;
+ this->cmd_answer = this->rdAmplitudeQ();
+ this->cmd_answer_len = 2;
+ break;
+
+ case DDS_CMD_READ | DDS_CMD_AMP_RAMP_RATE:
+ this->cmd_answer = this->rdAmplitudeRampRate();
+ this->cmd_answer_len = 1;
+ break;
+
+ case DDS_CMD_READ | DDS_CMD_DELTA_FREQ:
+ this->cmd_answer = this->rdDeltaFrequency();
+ this->cmd_answer_len = 6;
+ break;
+
+ case DDS_CMD_READ | DDS_CMD_UPD_CLOCK:
+ this->cmd_answer = this->rdUpdateClock();
+ this->cmd_answer_len = 4;
+ break;
+
+ case DDS_CMD_READ | DDS_CMD_RAMP_RATE_CLOCK:
+ this->cmd_answer = this->rdRampRateClock();
+ this->cmd_answer_len = 3;
+ break;
+
+ case DDS_CMD_WRITE:
+ if (payload_len == 0x28){
+ success = this->writeAllDevice(payload);
+ }
+ break;
+
+ case DDS_CMD_READ:
+ this->cmd_answer = this->readAllDevice();
+ this->cmd_answer_len = 0x28;
break;
default:
success = false;
+ strcpy(message, MSG_CMD_KO);
+ this->cmd_answer = message;
+ this->cmd_answer_len = strlen(message);
}
if (success){
- tx_msg = OK_MSG;
- tx_msg_len = 2;
+ strcpy(message, MSG_CMD_OK);
+ this->cmd_answer = message;
+ this->cmd_answer_len = strlen(message);
}
- this->cmd_answer = tx_msg;
- this->cmd_answer_len = tx_msg_len;
-
- return tx_msg;
+ return this->cmd_answer;
}
char* DDS::getCmdAnswer(){
@@ -689,55 +940,6 @@
}
-int DDS::setAllDevice(char* payload, SerialDriver *screen){
-
- int sts;
- char* phase1, *phase2;
- char* freq1, *freq2;
- char* delta_freq, *upd_rate_clk, *ramp_rate_clk;
- char* control_reg;
- char* amplitudeI, *amplitudeQ, *ampl_ramp_rate;
- char* qdac;
-
- phase1 = &payload[0x00];
- phase2 = &payload[0x02];
- freq1 = &payload[0x04];
- freq2 = &payload[0x0A];
- delta_freq = &payload[0x10];
- upd_rate_clk = &payload[0x16];
- ramp_rate_clk = &payload[0x1A];
- control_reg = &payload[0x1D];
- amplitudeI = &payload[0x21];
- amplitudeQ = &payload[0x23];
- ampl_ramp_rate = &payload[0x25];
- qdac = &payload[0x26];
-
- control_reg[2] = control_reg[2] & 0xFE; //cr_ioupdclk always as an input = 0
- control_reg[3] = control_reg[3] & 0xFD; //LSB first = 0, MSB first enabled
- control_reg[3] = control_reg[3] | 0x01; //cr_sdo enable = 1
-
- this->__writeDataAndVerify(0x04, 6, delta_freq);
- this->__writeDataAndVerify(0x05, 4, upd_rate_clk);
- this->__writeDataAndVerify(0x06, 3, ramp_rate_clk);
- this->__writeDataAndVerify(0x07, 4, control_reg);
-
- this->__writeDataAndVerify(0x0A, 1, ampl_ramp_rate);
- this->__writeDataAndVerify(0x0B, 2, qdac, screen);
-
- this->wrPhase1(phase1);
- this->wrPhase2(phase2);
- this->wrFrequency1(freq1);
- this->wrFrequency2(freq2);
- this->wrAmplitudeI(amplitudeI);
- this->wrAmplitudeQ(amplitudeQ);
-
- //Enabling RF
- sts = this->enableRF();
-
- return sts;
-
- }
-
bool DDS::wasInitialized(){
return this->isConfig;
@@ -771,4 +973,148 @@
return MODULATION[5];
return MODULATION[this->cr_mode];
-}
\ No newline at end of file
+}
+
+
+int DDS::writeAllDevice(char* payload, SerialDriver *screen){
+
+ int sts;
+ char* phase1, *phase2;
+ char* freq1, *freq2;
+ char* delta_freq, *upd_rate_clk, *ramp_rate_clk;
+ char* control_reg;
+ char* amplitudeI, *amplitudeQ, *ampl_ramp_rate;
+ char* qdac;
+
+ //parm = payload[ParallelAddress]
+ phase1 = &payload[0x00];
+ phase2 = &payload[0x02];
+ freq1 = &payload[0x04];
+ freq2 = &payload[0x0A];
+ delta_freq = &payload[0x10];
+ upd_rate_clk = &payload[0x16];
+ ramp_rate_clk = &payload[0x1A];
+ control_reg = &payload[0x1D];
+ amplitudeI = &payload[0x21];
+ amplitudeQ = &payload[0x23];
+ ampl_ramp_rate = &payload[0x25];
+ qdac = &payload[0x26];
+
+ control_reg[2] = control_reg[2] & 0xFE; //cr_ioupdclk always as an input = 0 when serial operation is used
+ control_reg[3] = control_reg[3] & 0xFD; //LSB first = 0, MSB first enabled
+ control_reg[3] = control_reg[3] | 0x01; //cr_sdo enable = 1
+
+ cr_osk_int_bkp = (control_reg[3] & 0x10) >> 4;
+ cr_osk_en_bkp = (control_reg[3] & 0x20) >> 5;
+
+ //this->__writeDataAndVerify(SerialAddress, NumberOfBytes, Bytes);
+ //this->__writeDataAndVerify(0x04, 6, delta_freq);
+ //this->__writeDataAndVerify(0x05, 4, upd_rate_clk);
+ //this->__writeDataAndVerify(0x06, 3, ramp_rate_clk);
+ this->__writeDataAndVerify(0x07, 4, control_reg);
+
+ //this->__writeDataAndVerify(0x0A, 1, ampl_ramp_rate);
+ this->__writeDataAndVerify(0x0B, 2, qdac, screen);
+
+ this->wrPhase1(phase1);
+ this->wrPhase2(phase2);
+ this->wrFrequency1(freq1);
+ this->wrFrequency2(freq2);
+ this->wrDeltaFrequency(delta_freq);
+ this->wrUpdateClock(upd_rate_clk);
+ this->wrRampRateClock(ramp_rate_clk);
+
+ this->wrAmplitudeI(amplitudeI);
+ this->wrAmplitudeQ(amplitudeQ);
+
+ this->wrAmplitudeRampRate(ampl_ramp_rate);
+
+ //Enabling RF
+ sts = this->enableRF();
+
+ return sts;
+
+ }
+
+
+char* DDS::readAllDevice(){
+
+ char* rd_data;
+ int i=0, k=0;
+
+ rd_data = this->rdPhase1();
+
+ for (i=0; i<2; i++)
+ message[k+i] = rd_data[i];
+ k += i;
+
+ rd_data = this->rdPhase2();
+
+ for (i=0; i<2; i++)
+ message[k+i] = rd_data[i];
+ k += i;
+
+ rd_data = this->rdFrequency1();
+
+ for (i=0; i<6; i++)
+ message[k+i] = rd_data[i];
+ k += i;
+
+ rd_data = this->rdFrequency2();
+
+ for (i=0; i<6; i++)
+ message[k+i] = rd_data[i];
+ k += i;
+
+ rd_data = this->rdDeltaFrequency();
+
+ for (i=0; i<6; i++)
+ message[k+i] = rd_data[i];
+ k += i;
+
+ rd_data = this->rdUpdateClock();
+
+ for (i=0; i<4; i++)
+ message[k+i] = rd_data[i];
+ k += i;
+
+ rd_data = this->rdRampRateClock();
+
+ for (i=0; i<3; i++)
+ message[k+i] = rd_data[i];
+ k += i;
+
+ rd_data = this->__readData(0x07, 4);
+
+ for (i=0; i<4; i++)
+ message[k+i] = rd_data[i];
+ k += i;
+
+ rd_data = this->rdAmplitudeI();
+
+ for (i=0; i<2; i++)
+ message[k+i] = rd_data[i];
+ k += i;
+
+ rd_data = this->rdAmplitudeQ();
+
+
+ for (i=0; i<2; i++)
+ message[k+i] = rd_data[i];
+ k += i;
+
+ rd_data = this->rdAmplitudeRampRate();
+
+ for (i=0; i<1; i++)
+ message[k+i] = rd_data[i];
+ k += i;
+
+ rd_data = this->__readData(0x0B, 2);
+
+ for (i=0; i<2; i++)
+ message[k+i] = rd_data[i];
+ k += i;
+
+ return message;
+
+ }
\ No newline at end of file
--- a/AD9854.h Tue Feb 24 20:08:13 2015 +0000
+++ b/AD9854.h Wed Sep 04 22:26:24 2019 +0000
@@ -8,6 +8,8 @@
#define SPI_MODE 0
#define SPI_FREQ 1000000
+#define DDS_CMD_STATUS 0X04
+
#define DDS_CMD_RESET 0X10
#define DDS_CMD_ENABLE_RF 0x11
#define DDS_CMD_MULTIPLIER 0X12
@@ -18,8 +20,27 @@
#define DDS_CMD_PHASEB 0x17
#define DDS_CMD_AMPLITUDE1 0X18
#define DDS_CMD_AMPLITUDE2 0x19
+#define DDS_CMD_ENABLE_AMP 0x1A
+#define DDS_CMD_AMP_RAMP_RATE 0x1B
+#define DDS_CMD_DELTA_FREQ 0x1C
+#define DDS_CMD_UPD_CLOCK 0x1D
+#define DDS_CMD_RAMP_RATE_CLOCK 0x1E
+
+#define DDS_CMD_WRITE 0x50
#define DDS_CMD_READ 0x8000
+#define MSG_CMD_KO "0:Command not recognized"
+#define MSG_CMD_OK "1:Configuration received and saved"
+
+#define MSG_STATUS_FAIL "0:DDS Clock not connected"
+#define MSG_STATUS_ON "1:DDS was not programmed"
+#define MSG_STATUS_RF_DIS "2:RF disabled"
+#define MSG_STATUS_RF_ENA "3:RF enabled"
+
+#define MSG_DISABLED "0:ENABLED"
+#define MSG_ENABLED "1:DISABLED"
+
+
class DDS{
private:
float clock; // Work frequency in MHz
@@ -32,14 +53,25 @@
bool cr_osk_int; // ext/int output shaped control: 0 -> external
bool cr_msb_lsb; // msb/lsb bit first: 0 -> MSB
bool cr_sdo; // SDO pin active: 0 -> inactive
-
+ bool cr_pll_range;
+ bool cr_pll_bypass;
+
+ bool cr_osk_en_bkp; // Enable AM: 0 -> disabled
+ bool cr_osk_int_bkp;
+
char frequency1[6];
char frequency2[6];
char phase1[2];
char phase2[2];
char amplitudeI[2];
char amplitudeQ[2];
+ char delta_frequency[6];
+ char update_clock[4];
+ char ramp_rate_clock[3];
+ char amplitude_ramp_rate[1];
+
bool rf_enabled;
+ bool programmed;
double factor_freq1;
double factor_freq2;
@@ -58,7 +90,7 @@
int __writeData(char addr, char ndata, const char* data);
char* __readData(char addr, char ndata);
- int __writeDataAndVerify(char addr, char ndata, const char* wr_spi_data, SerialDriver *screen=NULL);
+ int __writeDataAndVerify(char addr, char ndata, char* wr_spi_data, SerialDriver *screen=NULL);
char* __getControlRegister();
int __writeControlRegister();
@@ -79,7 +111,14 @@
char* rdFrequency2();
char* rdAmplitudeI();
char* rdAmplitudeQ();
+ char* rdDeltaFrequency();
+ char* rdUpdateClock();
+ char* rdRampRateClock();
+ char* rdAmplitudeRampRate();
+
int isRFEnabled();
+ int isAmplitudeEnabled();
+
int wrMode(char mode);
int wrMultiplier(char multiplier, float clock=200.0);
int wrPhase1(char* phase, SerialDriver *screen=NULL);
@@ -88,13 +127,21 @@
int wrFrequency2(char* freq, SerialDriver *screen=NULL);
int wrAmplitudeI(char* amplitude, SerialDriver *screen=NULL);
int wrAmplitudeQ(char* amplitude, SerialDriver *screen=NULL);
+ int wrDeltaFrequency(char* delta_freq, SerialDriver *screen=NULL);
+ int wrUpdateClock(char* upd_clock, SerialDriver *screen=NULL);
+ int wrRampRateClock(char* rr_clock, SerialDriver *screen=NULL);
+ int wrAmplitudeRampRate(char* ampl_ramp_rate, SerialDriver *screen=NULL);
+
int enableRF();
int disableRF();
+ int enableAmplitude();
+ int disableAmplitude();
+
int defaultSettings(SerialDriver *screen=NULL);
char* setCommand(unsigned short cmd, char* payload, unsigned long payload_len);
char* getCmdAnswer();
unsigned long getCmdAnswerLen();
- int setAllDevice(char* payload, SerialDriver *screen=NULL);
+
bool wasInitialized();
char getMultiplier();
double getFreqFactor1();
@@ -102,6 +149,9 @@
char getMode();
char* getModeStr();
+ int writeAllDevice(char* payload, SerialDriver *screen=NULL);
+ char* readAllDevice();
+
};
#endif
\ No newline at end of file