Post Go back to editing

Unable to write to FRAC1WORD registers on ADF4382

Thread Summary

The user encountered issues with the ADF4382 PLL where the FRAC1WORD registers (0x0012, 0x0013, 0x0014) would not hold the programmed values, causing frequency inaccuracies. The solution was to correctly set the INT_MODE bit (reg0015, bit2) based on the FRAC1WORD value: INT_MODE = 1 if FRAC1WORD = 0, otherwise INT_MODE = 0. This resolved the frequency accuracy issue, and the output was verified to be within 1 Hz using a spectrum analyzer.
AI Generated Content
Category: Hardware
Product Number: ADF4382A

Hi all,

I am attempting to control an ADF4382 PLL over SPI and I have noticed that when the PLL locks, the frequency is often slightly off from what I intended to program. During debugging I have read back the register values after I have written them and I have discovered that the registers 0x0012, 0x0013, 0x0014, which are the registers holding the FRAC1WORD, are not holding the values which I write to the. All of these registers consistently read as 0x00 (their reset values).  All other registers which I write to are reading back as the correct, intended value.  This essentially means that I will not be able to accurately generate a frequency which is not an integer multiple of my reference.

I thought that maybe I just needed to set the PLL device into 'fractional mode', which I have attempted to do by writing bit2 of register 0x0015 to 0 (which reads back correctly.)

Does anyone know if there is any other reason why I am unable to write just to these specific registers? They are listed as having R/W access, and I haven't been able to find anything specific on the datasheet about controlling access to these registers.

Any guidance would be much appreciated.

Thanks

  • Do you power up the ADF4382 and apply the reference clock before trying to program the device?

  • Answering my own question in case anyone hits this in the future.

    The problem actually was with the Integer mode Vs Fractional mode.  

    In my initial attempt at programming, I had left the INT_MODE bit to always be 1, which would mean that the fractional part would never be used. So the output would only ever be exactly correct if the desired frequency was an integer multiple of the reference.  The fix was simply to set the value of INT_MODE (reg0015, bit2) based on the value of FRAC1WORD. If FRAC1WORD = 0, then INT_MODE = 1, otherwise, INT_MODE = 0. Simple.

    What was confusing me was that I initially attempted to verify this fix by writing and then reading back the values of the FRAC1WORD registers, but they always read back as 0. I'm still not sure exactly why this was - maybe because the values are double buffered? But regardless, when I finally rebuilt the entire RF chain and hooked up the output to a spectrum analyser, the resulting frequency was accurate to within 1hz.