Post Go back to editing

ADF4371 Issues

EDIT: I think the output may not be fully locked and that is why my output frequency is jumping around (by 100MHz+), what I thought was jitter at first. If I turn off my reference frequency, the output changes significantly so I thought it was locked. It seems like it is tuning to the desired frequency but not locking. This is probably due to my weird register programming behavior but I am unsure. Attached is a scope image writing the default value of 0x32 to 0x72 which results in increased current draw even though I am writing a default value (a bit must be getting shifted and turning some AUX setting on?). MOSI in yellow, SCK in blue (sorry I do not have a 4 channel scope).

I am getting some odd behavior while programming registers as well as a large amount of jitter on my locked output. I am tuning the evaluation board to my desired frequency, then copying the memory map to my own PCB.

When programming the registers, there are 4 registers that if I do not write the default values listed in the datasheet, the device does not work. As long as these registers have their default values written, everything works fine other than the locked output having a large amount of jitter that is not seen on the evaluation board. I have copied the evaluation  board circuit on my PCB and have the 91 ohm resistor as suggested in the datasheet.

Here are the registers and their listed default values that I am having to write to get my 12.5 GHz output locked to a 10 MHz reference input:

Reg 0x52  Value 0xF4     //Default       Adds a large noise ripple down band
Reg 0x3E  Value 0x0C    //Default       Doesn't lock without this command, sits at 12.2 GHz Unlocked
Reg 0x1F  Value 0x01     //Default       No output after final command without writing this register
Reg 0x12  Value 0x40     //Default       If I don't write this register it locks at 11.6 GHz instead of 12.5 GHz
My output works fine (other than being jittery) if I skip over all other registers with default values. I am writing MSB of 0 first followed by 15 bit register addresses and 8 bits of data. Hold and setup times of 2 and 10 microseconds both produce the same results with SCK at 1 MHz. One other odd thing I have noticed is that if I write the default value of 0x32 to register 0x72, the current increases by about 33 mA as if something on the unused auxiliary output is changing.
Suggestions on how to solve the odd register behavior as well as points of interest on the PCB to inspect that could be adding to the jitter would be greatly appreciated. Could the output of the disabled 8 and 32 GHz still causing problems? The 16 GHz trace does pass by the disabled 8 GHz trace. The PCB is a 25mil thick, 4-layer RO4350 board.

Edit Notes

typo
[edited by: HWalker553 at 8:28 PM (GMT 0) on 9 May 2019]
  • Hi,

    As far as I understand you are all fine with the functionality and performance of eval board, right? But the results on your board is either very noisy or even not sure if it is locked. You can check register 0x007C[0] or the muxout pin (by configuring it as lock detect) to see if the PLL is locked or not.

    Are you using the same configuration, same reference frequency, output frequency, same power supply and LDOs? If all the same, then you need to follow the procedures given in the datasheet: Firstly write registers 0x0000 and 0x0001 with the given values and then write all registers from 0x007C down to 0x0010.

    Can you share the screenshot of your signal (a SSA is preferred if not with a spectrum analyzer)?

    The default register values do not mean the power-up register values. Default values are the used for the default configuration. 0x0072 is 0x00 at power up, then by writing 0x32 you are enabling the coupled_VCO which may cause some extra current consumption. The SPI diagram looks correct, also you said that the frequency looks correct then I do not think that is related with SPI. You can also test SPI by enbling/disabling the outputs, or trying to lock to another frequency.

    Regards,

  • Yes you are correct, my output does not match the evaluation board performance with the same settings and configuration. I am following the datasheet instructions to write to 0x0000 and 0x0001 first, followed by 0x007C down to 0x0010. The datasheet states that it is not required to write default/unchanged values to the registers, that is very misleading as it does not mention these are not the power up values shown in the table. If I write 0x0032 to 0x0072 my board no longer outputs at the correct frequency (even though ACE shows this value in the eval board memory map and it is also listed as a default value).  I am also unable to read any register values. Below are my read and write methods as well as the registers I am writing to and the resulting spectrum analyzer picture.

     public void Write(byte address, byte data) //MSB is read/write bit, 15-bit address, 8 data bits
            {
                tx[0] = (byte)0x00;  //Add write bit 0 as MSB of 16-bits
                tx[1] = address; 
                tx[2] = data;
                Thread.Sleep(10);
                bus.Write(tx);
                Thread.Sleep(10);
            }
    
    public byte Read(byte address)
            {
                txRead[0] = (byte)0x80;
                txRead[1] = address;
                Thread.Sleep(10);
                bus.WriteRead(txRead, rx);
                Thread.Sleep(10);
    
                return rx[0];
            }
            
            
            
    public static void Main()
            {
                Thread.Sleep(5000);
                Synth.InitSPI(1000);
                Thread.Sleep(50);
    
    
                //Step 1: Set up the SPI interface
                Synth.Write(0x00, 0x18); //Default, set SPI to 4-wire
                Thread.Sleep(100);
                Synth.Write(0x01, 0x00); //Default, Stalling Master readback control
                Thread.Sleep(100);
    
                //Step 2: Initialization sequnce, set registers in reverse order from 0x7C to 0x10 (Frequency change occurs on the write to 0x10)
                Synth.Write(0x73, 0x00); //Default
                Thread.Sleep(100);
                //   Synth.Write(0x72, 0x32); //Default, causes weird current spike when I send and does not output at right frequency
                //  Thread.Sleep(100);
                Synth.Write(0x71, 0x60); //Default
                Thread.Sleep(100);
                Synth.Write(0x70, 0x43);
                Thread.Sleep(100);
                Synth.Write(0x52, 0xF4); //Default     Raises adds a large noise ripple downband if I don't send
                Thread.Sleep(100);
                Synth.Write(0x47, 0xC0); //Default
                Thread.Sleep(100);
                Synth.Write(0x42, 0x00); //Default
                Thread.Sleep(100);
                Synth.Write(0x41, 0x28); //Default
                Thread.Sleep(100);
                Synth.Write(0x40, 0x50); //Default
                Thread.Sleep(100);
                Synth.Write(0x3F, 0x80); //Default
                Thread.Sleep(100);
                Synth.Write(0x3E, 0x0C);//Default     Doesn't lock without this command, sits at 12.2 GHz Unlocked
                Thread.Sleep(100);
                Synth.Write(0x3D, 0x00);//Default
                Thread.Sleep(10);
                Synth.Write(0x3A, 0x55);//Default
                Thread.Sleep(100);
                Synth.Write(0x39, 0x07);//Default    Small spikes are added 70 dbc down when this isn't written
                Thread.Sleep(100);
                Synth.Write(0x38, 0x00);//Default
                Thread.Sleep(100);
                Synth.Write(0x37, 0x00);//Default
                Thread.Sleep(100);
                Synth.Write(0x36, 0x30);//Default
                Thread.Sleep(100);
                Synth.Write(0x35, 0x32);
                Thread.Sleep(100);
                Synth.Write(0x34, 0x82);
                Thread.Sleep(100);
                Synth.Write(0x33, 0x22);
                Thread.Sleep(100);
                Synth.Write(0x32, 0x04);//Default
                Thread.Sleep(100);
                Synth.Write(0x31, 0x02);
                Thread.Sleep(100);
                Synth.Write(0x30, 0x09);
                Thread.Sleep(100);
                Synth.Write(0x2F, 0x94);//Default
                Thread.Sleep(100);
                Synth.Write(0x2E, 0x12);//Default
                Thread.Sleep(100);
                Synth.Write(0x2D, 0x11);//Default
                Thread.Sleep(100);
                Synth.Write(0x02C, 0x44);//Default
                Thread.Sleep(100);
                Synth.Write(0x2B, 0x00);
                Thread.Sleep(100);
                Synth.Write(0x2A, 0x00);//Default
                Thread.Sleep(100);
                //Synth.Write(0x28, 0x83); //ACE wants to enable double buffer for some reason, not sending this
                //Thread.Sleep(100);
                Synth.Write(0x27, 0xCD);
                Thread.Sleep(100);
                Synth.Write(0x26, 0x01);
                Thread.Sleep(100);
                Synth.Write(0x25, 0x0B);
                Thread.Sleep(100);
                Synth.Write(0x24, 0x80); //Default
                Thread.Sleep(100);
                Synth.Write(0x23, 0x00); //Default
                Thread.Sleep(100);
                Synth.Write(0x22, 0x20);
                Thread.Sleep(100);
                Synth.Write(0x20, 0x14); //Default
                Thread.Sleep(100);
                Synth.Write(0x1F, 0x01); //Default   No output after final command without writing this register
                Thread.Sleep(100);
                Synth.Write(0x1E, 0x08);
                Thread.Sleep(100);
                Synth.Write(0x1E, 0x98);
                Thread.Sleep(100);
                Synth.Write(0x1D, 0x00); //Default
                Thread.Sleep(100);
                Synth.Write(0x1C, 0x00); //Default
                Thread.Sleep(100);
                Synth.Write(0x1B, 0x00); //Default
                Thread.Sleep(100);
                Synth.Write(0x1A, 0x00);
                Thread.Sleep(100);
                Synth.Write(0x19, 0x01);
                Thread.Sleep(100);
                Synth.Write(0x18, 0x00); //Default
                Thread.Sleep(100);
                Synth.Write(0x17, 0x01);
                Thread.Sleep(100);
                Synth.Write(0x16, 0x0C);
                Thread.Sleep(100);
                Synth.Write(0x15, 0x14);
                Thread.Sleep(100);
                Synth.Write(0x14, 0xE8);
                Thread.Sleep(100);
                Synth.Write(0x12, 0x40); //Default If I don't write this value it locks at 11.6 GHz instead of 12.5 GHz
                Thread.Sleep(100);
                Synth.Write(0x11, 0x01);
                Thread.Sleep(100);
                Synth.Write(0x10, 0x38);
                Thread.Sleep(100);
    
                for (;;)
                {
                    test[0] = Synth.Read(0x14);
                    Thread.Sleep(100);
                }
            }

  • Hi,

    I cannot confirm your write/read methods, sorry I am not a software guy. I checked your register settings and they looks correct. Why you are not able to read the register values. Perhaps that is the first thing to solve. Also please confirm that your SPI works properly by enabling/disabling outputs and by trying to lock to another frequency (i.e. 12.6GHz and 10GHz).

    If that all works, I guess that the part (specifically exposed pad) is not soldered properly so it has poor RF GND. Another option is the value of a component in the loop filter is wrong (i.e. 10pF instead of 10nF) since the part finds the correct frequency but could not lock.

    Regards,

  • I can program to any frequency I want, previously I had it set to 16 GHz  and it was tracking, but not phase locking / kept drifting (same as a 12.5 GHz). I will try to post some scope images of attempted reads, I am waiting on a 4-channel scope to arrive. Please try to obtain the default power up values of all registers for me.

    The exposed pad was solder pasted and then silver epoxy was forced through the vias from the backside to further fill the ground pad area after it was attached. Solder paste was used on all pads then real solder was applied after it was in place. To shorten the RF ground return path, the backside of the board is exposed ground underneath the IC which rests on a standoff in the housing.

    I have all the same loop filter values as the evaluation board and replaced them twice to ensure there were no wrong components.

  • How come R8 and R10 are not installed on my eval board?

    I am also wondering why the eval board's loop filter circuit looks completely different than the simulation options in ADISimPLL? I was thinking of narrowing the loop band to see if noise is reduced but cannot tell which option to try.

  • Having a similar issue.  The topologies offered do not align with that on the board.  Even if I attempt to build that which is already installed on the board from values found in datasheet (e.g., 180kHz BW, 5GHz Freq, 100MHz Ref, 1.8mA CP, etc) then I get nothing close to what is in situ no matter which structure I chose.

    I was hoping that the ADF4371 would be one of the provided design files.

  • Here is what I get through use of ADIsimPLL:

    Here is what is described in the datasheet schematic:

  • I recommend copying the evaluation board schematic exactly. I had 3 issues with my setup that was causing the problems I mentioned above. After correcting these three issues, my design is working great. 

    1) My reference frequency source was broken and drifting, causing my output to drift.

    2) I was repeatedly attempting to read the lock register, creating large amounts of noise in my carrier signal (If lock detect is needed, use the MUXOUT configured to lock detect setting). Reading the registers during operation compromises signal integrity.

    3) The regulators I chose powering the ADF4371 were not low enough noise, use the recommended ones from the evaluation board, taking care to implement the DFN guard ring technique noted in the regulator datasheet.

    P.S. Make sure you are setting your registers in reverse order as mentioned in the data sheet. All registers must be written to (you can't skip ones that are default values). The "Default," register values listed in the data sheet are not the default power up values. They are the required values for "default / normal," operation  and must be re-rewritten every powerup.

  • Sorry if I mislead you, I am not capturing a new design.  Rather I am simply working with the evaluation board.  I am just trying to manipulate the loop filter bandwidth to better serve our applications.  The default loop filter is 180kHz wide (according to the datasheet and somewhat verified on the PNA) and targets the 100MHz Crystek on the evaluation board.  My design will use a 10MHz reference source and I want to use a more narrowband loop filter.  I am using the ADIsimPLL tool to help with this (assuming that it has the best representative model), but I am unable to verify the integrity of the tool as I am unable to reproduce the filter that they have already designed for the default application (as captured in the schematic).

  • Ah sorry, I can't help you there. I kept the 180 KHz default loop filter on my board. I did notice the evaluation board filter design does not seem to match any of the options in ADIsimPLL, maybe that is why you can't reproduce the evaluation board filter?

    P.S. A 10 MHz reference works well with both sine and square waves at this frequency (contrary to the data sheet says). If you want to test an external 10 MHz reference with the evaluation board, there are a few resistors you have to remove from the 100 MHz Crystal.