Post Go back to editing

AD9102 Output Signal

Thread Summary

The user is unable to generate a signal using the AD9102 despite writing and reading all registers. The solution involves setting the DDS Tuning Word source to RAM data and using the DDS MSB as the SRAM address counter clock. Additionally, the user must ensure the RAMUPDATE register is set to 1 to transfer shadow register values to active registers. The data sheet lacks clear examples and specific details, leading to confusion about the initialization sequence and register settings.
AI Generated Content

I’m using  AD9102, I write and read in all register but I haven't output signal.

What is the minimum registers configuration for generate a signal?

Can it work without calibration?

In attachment the schematic.

Regards.

Valentino

ad9102.pdf
Parents
  • Hello Valemea,

    I struggled with this as well. The documentation is appalling.

    Anyway, the secret of making it work is to understand that it is only the shadow registers that are updated when you write to the register set. We used a clock frequency of 167.772160 MHz to give a 10 Hz step resolution. This is the sequence I used to output a sine wave based on the built in DDS sine wave generator:

    Out_port(~ad9102_nTrigger, ad9102_nTrigger);          //Trigger is off

    Out_port(~sig_gen_reset,sig_gen_reset );       //reset is inactive

    usleep(100);  //I don't know how long it takes to come out of reset - not in data sheet

    sig_gen_control_701(SPICONFIG, 0x0);    //use 4 wire mode - seperate transmit and receive pins

    sig_gen_control_701(POWERCONFIG,0);    //set the power config

    sig_gen_control_701(CLOCKCONFIG,0);    //set the clock config

    sig_gen_control_701(DDS_TW32, 0);                    //we go for 1000 Hz, in 10 Hz steps = 100. 0 in upper word

    sig_gen_control_701(DDS_TW1, 100 <<8);   //1kHz, but in upper 8 bits of lower tuning word

    sig_gen_control_701(DAC_DGAIN, DAC_GAIN_x1 <<4);          //set the gain to 1. DAC_GAINx1 = 0400h

    sig_gen_control_701(DACDOF, 0);                              //No offset

    sig_gen_control_701(WAV_CONFIG, WAVE_DDS_SINE | WAVE_prestored);          //set the waveform to DDS SINE

    sig_gen_control_701(PAT_TYPE,0);        //repeat continuously

    sig_gen_control_701(RAMUPDATE,1);   //update all SPI registers --ABSOLUTELY CRUCIAL

    sig_gen_control_701(PAT_STATUS,1);      //start pattern

    Out_port(~ad9102_nTrigger, 0);          //Start Trigger

    After that you can change frequency with:

    sig_gen_control_701(DDS_TW32, freq_value >> 8);  //put bits [23..8] in upper tuning word

    sig_gen_control_701(DDS_TW1, (freq_value & 0xFF) << 8);   //put bits [7..0] upper 8 bits of lower tuning word

    sig_gen_control_701(RAMUPDATE,1);   //update all SPI registers --ABSOLUTELY CRUCIAL

    I hope this helps.

    Bart

Reply
  • Hello Valemea,

    I struggled with this as well. The documentation is appalling.

    Anyway, the secret of making it work is to understand that it is only the shadow registers that are updated when you write to the register set. We used a clock frequency of 167.772160 MHz to give a 10 Hz step resolution. This is the sequence I used to output a sine wave based on the built in DDS sine wave generator:

    Out_port(~ad9102_nTrigger, ad9102_nTrigger);          //Trigger is off

    Out_port(~sig_gen_reset,sig_gen_reset );       //reset is inactive

    usleep(100);  //I don't know how long it takes to come out of reset - not in data sheet

    sig_gen_control_701(SPICONFIG, 0x0);    //use 4 wire mode - seperate transmit and receive pins

    sig_gen_control_701(POWERCONFIG,0);    //set the power config

    sig_gen_control_701(CLOCKCONFIG,0);    //set the clock config

    sig_gen_control_701(DDS_TW32, 0);                    //we go for 1000 Hz, in 10 Hz steps = 100. 0 in upper word

    sig_gen_control_701(DDS_TW1, 100 <<8);   //1kHz, but in upper 8 bits of lower tuning word

    sig_gen_control_701(DAC_DGAIN, DAC_GAIN_x1 <<4);          //set the gain to 1. DAC_GAINx1 = 0400h

    sig_gen_control_701(DACDOF, 0);                              //No offset

    sig_gen_control_701(WAV_CONFIG, WAVE_DDS_SINE | WAVE_prestored);          //set the waveform to DDS SINE

    sig_gen_control_701(PAT_TYPE,0);        //repeat continuously

    sig_gen_control_701(RAMUPDATE,1);   //update all SPI registers --ABSOLUTELY CRUCIAL

    sig_gen_control_701(PAT_STATUS,1);      //start pattern

    Out_port(~ad9102_nTrigger, 0);          //Start Trigger

    After that you can change frequency with:

    sig_gen_control_701(DDS_TW32, freq_value >> 8);  //put bits [23..8] in upper tuning word

    sig_gen_control_701(DDS_TW1, (freq_value & 0xFF) << 8);   //put bits [7..0] upper 8 bits of lower tuning word

    sig_gen_control_701(RAMUPDATE,1);   //update all SPI registers --ABSOLUTELY CRUCIAL

    I hope this helps.

    Bart

Children
No Data