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 Larry,

    sadly the link you included did not go anywhere. I did see your memory content. All I actually need is the very few register allocations to show how to make the RAM address use the DDS MSB as clock rather than the input clock.

    Now I don't want to chirp the DDS, I want to output directly from the RAM, WITHOUT the DDS, but using the DDS_MSB as clock. (I do understand that this means I could get jitter of 1 CLK In period, but I can work around that).  I have this horrible feeling that the chip does not work this way. Yet another failing of the data sheet.

    Currently this is my complete initialization (sig_gen_control_701 does the work of saving to the AD9102) to get going with:

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

    sig_gen_control_701(SPICONFIG, 0x0);    //use 4 wire mode

    sig_gen_control_701(PAT_STATUS,0);      //stop patterns if they are on

    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);         //initialize with 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

    //The important bit:

    sig_gen_control_701(DDS_CONFIG, RAM_DDS_MSB_CLK); //the RAM sequence is output on the rising DDS MSB    <----- this is what I do, but it has no effect  (RAM_DDS_MSB_CLK = 0x04)

    sig_gen_control_701(DAC_DGAIN, DAC_GAIN_x1 <<4);          //set the gain to 1

    sig_gen_control_701(DACDOF, 0);                              //No offset

    sig_gen_control_701(SAW_CONFIG, SAW_TRIANGLE);  //make the sawtooth a triangle, with 1 sample/step

    sig_gen_control_701(WAV_CONFIG, 0);          //set the waveform to output from RAM from start to stop address

    sig_gen_control_701(PAT_TYPE,0);        //repeat continuously

    sig_gen_control_701(PAT_PERIOD,4000);   //the pattern is 4000 samples long - just to experiment with

    sig_gen_control_701(START_ADDR,0<<4);      //set the start address to 0 - used for square wave output

    sig_gen_control_701(STOP_ADDR,4000<<4);       //set end address inclusive

    sig_gen_control_701(DAC_CST,0); //make sure constant value is 0   

    sig_gen_control_701(PAT_STATUS,MEM_ACCESS); //access memory

    for (n=0; n<2000; n++) sig_gen_control_701(SRAM_DATA+n,0x7fff);      //output minimum value for square wave

    for (n=2000; n<4000; n++) sig_gen_control_701(SRAM_DATA+n,0x8000);      //output max value for square wave

    sig_gen_control_701(SRAM_DATA+4000, 0); //output 0 value - just to check how start/stop address works

    sig_gen_control_701(PAT_STATUS,1);      //start pattern

    Out_port(~ad9102_nTrigger, 0);          //Trigger is on

    My whole design was predicated on the chip working this way, and this is the way I read the data sheet. I am very sad that I cannot do a swept Triangle wave, and now it looks like I can't do a swept arbitrary wave either. I guess that means throwing away the board (made a 100 so far), and just using a DAC, and using the FPGA instead. I was trying to save time, but no. (As an aside this is the second AD disappointment this year. The first was major, and caused a complete extra design loop, with added component cost and loss of performance - I'm using the AD4817 op-amp, and discovered when you power it down that the +IN input gets dragged to -V, confirmed with the designer as a chip bug. Now I have to isolate the input with a relay. Blah).

    regards

    Bart

Reply
  • Hello Larry,

    sadly the link you included did not go anywhere. I did see your memory content. All I actually need is the very few register allocations to show how to make the RAM address use the DDS MSB as clock rather than the input clock.

    Now I don't want to chirp the DDS, I want to output directly from the RAM, WITHOUT the DDS, but using the DDS_MSB as clock. (I do understand that this means I could get jitter of 1 CLK In period, but I can work around that).  I have this horrible feeling that the chip does not work this way. Yet another failing of the data sheet.

    Currently this is my complete initialization (sig_gen_control_701 does the work of saving to the AD9102) to get going with:

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

    sig_gen_control_701(SPICONFIG, 0x0);    //use 4 wire mode

    sig_gen_control_701(PAT_STATUS,0);      //stop patterns if they are on

    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);         //initialize with 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

    //The important bit:

    sig_gen_control_701(DDS_CONFIG, RAM_DDS_MSB_CLK); //the RAM sequence is output on the rising DDS MSB    <----- this is what I do, but it has no effect  (RAM_DDS_MSB_CLK = 0x04)

    sig_gen_control_701(DAC_DGAIN, DAC_GAIN_x1 <<4);          //set the gain to 1

    sig_gen_control_701(DACDOF, 0);                              //No offset

    sig_gen_control_701(SAW_CONFIG, SAW_TRIANGLE);  //make the sawtooth a triangle, with 1 sample/step

    sig_gen_control_701(WAV_CONFIG, 0);          //set the waveform to output from RAM from start to stop address

    sig_gen_control_701(PAT_TYPE,0);        //repeat continuously

    sig_gen_control_701(PAT_PERIOD,4000);   //the pattern is 4000 samples long - just to experiment with

    sig_gen_control_701(START_ADDR,0<<4);      //set the start address to 0 - used for square wave output

    sig_gen_control_701(STOP_ADDR,4000<<4);       //set end address inclusive

    sig_gen_control_701(DAC_CST,0); //make sure constant value is 0   

    sig_gen_control_701(PAT_STATUS,MEM_ACCESS); //access memory

    for (n=0; n<2000; n++) sig_gen_control_701(SRAM_DATA+n,0x7fff);      //output minimum value for square wave

    for (n=2000; n<4000; n++) sig_gen_control_701(SRAM_DATA+n,0x8000);      //output max value for square wave

    sig_gen_control_701(SRAM_DATA+4000, 0); //output 0 value - just to check how start/stop address works

    sig_gen_control_701(PAT_STATUS,1);      //start pattern

    Out_port(~ad9102_nTrigger, 0);          //Trigger is on

    My whole design was predicated on the chip working this way, and this is the way I read the data sheet. I am very sad that I cannot do a swept Triangle wave, and now it looks like I can't do a swept arbitrary wave either. I guess that means throwing away the board (made a 100 so far), and just using a DAC, and using the FPGA instead. I was trying to save time, but no. (As an aside this is the second AD disappointment this year. The first was major, and caused a complete extra design loop, with added component cost and loss of performance - I'm using the AD4817 op-amp, and discovered when you power it down that the +IN input gets dragged to -V, confirmed with the designer as a chip bug. Now I have to isolate the input with a relay. Blah).

    regards

    Bart

Children
No Data