DDS AD9854, library to configure a AD9854 Serial Interface (SPI)

Dependents:   JRO_DDSv2 JRO_DDSv2_rev2019

AD9854.h

Committer:
miguelcordero191
Date:
2019-09-04
Revision:
1:d81fca2297fb
Parent:
0:156a9e15919e

File content as of revision 1:d81fca2297fb:

#ifndef        AD9854_SER_DRIVER
#define        AD9854_SER_DRIVER

#include "mbed.h"
#include "SerialDriver.h"

#define SPI_BITS 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
#define DDS_CMD_MODE        0x13
#define DDS_CMD_FREQUENCYA  0X14
#define DDS_CMD_FREQUENCYB  0x15
#define DDS_CMD_PHASEA      0X16
#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
        char            cr_multiplier;         // Multiplier 4- 20
        char            cr_mode;                // Single, FSK, Ramped FSK, Chirp, BPSK
        bool            cr_qdac_pwdn;           // Q DAC power down enable: 0 -> disable
        bool            cr_ioupdclk;            // IO Update clock enable: 0 -> input
        bool            cr_inv_sinc;            // Inverse sinc filter enable: 0 -> enable
        bool            cr_osk_en;              // Enable AM: 0 -> disabled
        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;
        
        SPI             *spi_device;
        //DDS I/O
        DigitalOut      *dds_mreset;
        DigitalOut      *dds_outramp;
        DigitalOut      *dds_sp_mode;
        DigitalOut      *dds_cs;
        DigitalOut      *dds_io_reset;
        DigitalInOut    *dds_updclk;
        
        char*           cmd_answer;
        unsigned long   cmd_answer_len;
        
        int __writeData(char addr, char ndata, const char* data);
        char* __readData(char addr, char ndata);
        int __writeDataAndVerify(char addr, char ndata, char* wr_spi_data, SerialDriver *screen=NULL);
        char* __getControlRegister();
        int __writeControlRegister();
        
    public:
        bool isConfig;

        
        DDS(SPI *spi_dev, DigitalOut *mreset, DigitalOut *outramp, DigitalOut *spmode, DigitalOut *cs, DigitalOut *ioreset, DigitalInOut *updclk);
        int init();
        int reset();
        int scanIOUpdate();
        int find();
        char* rdMode();
        char* rdMultiplier();
        char* rdPhase1();
        char* rdPhase2();
        char* rdFrequency1();
        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);
        int wrPhase2(char* phase, SerialDriver *screen=NULL);
        int wrFrequency1(char* freq, SerialDriver *screen=NULL);
        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();
        
        bool wasInitialized();
        char getMultiplier();
        double getFreqFactor1();
        double getFreqFactor2();
        char getMode();
        char* getModeStr();
        
        int writeAllDevice(char* payload, SerialDriver *screen=NULL);
        char* readAllDevice();
        
};

#endif