Because of the holidays, TI E2E™ design support forum responses will be delayed from Dec. 25 through Jan. 2. Thank you for your patience.

This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

LMX2820: Certain frequencies do not lock when using Instant Calibration

Part Number: LMX2820

I've been working on configuring an LMX2820 for a while now, to enable it to sweep from 45MHz to 22.6GHz. It is my desire to implement Instant Calibration, which I believe I have finally done after piecing together information from the datasheet, document #SNAA342, and other posts from this forum.

I'm using a healthy 125MHz OSCIN and third-order MASH. I have INSTCAL_DLY set to 313 (based on the default bias capacitor value of .47uf and the 125MHz PFD).

The problem that I've been facing (since ostensibly getting Instant Calibration working) is that often times (but not always), lock-detect does not go high when setting the output frequency to 2079MHz, 4158MHz, or 8315MHz and using Instant Calibration.

As you can see, there is an obvious pattern for these frequencies (4158 being half of 8315, and 2079 being one quarter of 8315). However, none of these frequencies seem mathematically meaningful based on my configuration or any of the internal VCO bands.

When failing to lock a 2079 (for example), what I will often see is it takes X time to finally lock. Then, the next time my sweep tries to set 2079, it takes around X/2 time to lock. Then, it will take around X/4 time to lock, etc. In other words, every time one of these frequencies again, it takes less time to lock than it did previously at that frequency.

Also, I am controlling the LMX2820 by sending SPI commands via a Raspberry Pi, with my bus speed set to 10MHz. In other words, I am not using TICS Pro when sweeping.

  • Hi Dan, 
    Just to confirm beforehand, you're following all steps to set up full assist as outlined: 

    You finish calibration in step 10 and now when changing INSTCAL_PLL_NUM, PLL_N, PLL_NUM & PLL_DEN and then writing to R0 to trigger calibration to frequency hop you will have no issue achieving lock except for the following frequencies: 2079MHz, 4158MHz, & 8315MHz ?

    Regards, 

    Vicente 

  • Vicente,

    Thank you for responding so quickly. I'll try to provide you with as much information I can concerning my process.

    I initialize the LMX2820 initially with the following register writes:

    R122 0x7A0000
    R121 0x790000
    R120 0x780000
    R119 0x770000
    R118 0x760000
    R117 0x750000
    R116 0x740000
    R115 0x730000
    R114 0x720000
    R113 0x710000
    R112 0x70FFFF
    R111 0x6F0000
    R110 0x6E001F
    R109 0x6D0000
    R108 0x6C0000
    R107 0x6B0000
    R106 0x6A0000
    R105 0x69000A
    R104 0x680014
    R103 0x670014
    R102 0x660028
    R101 0x6503E8
    R100 0x640533
    R99 0x6319B9
    R98 0x621C80
    R97 0x610000
    R96 0x6017F8
    R95 0x5F0000
    R94 0x5E0000
    R93 0x5D1000
    R92 0x5C0000
    R91 0x5B0000
    R90 0x5A0000
    R89 0x590000
    R88 0x5803FF
    R87 0x57FF00
    R86 0x560040
    R85 0x550000
    R84 0x540040
    R83 0x530F00
    R82 0x520000
    R81 0x510000
    R80 0x5001C0
    R79 0x4F011E
    R78 0x4E0001
    R77 0x4D0608
    R76 0x4C0000
    R75 0x4B0000
    R74 0x4A0000
    R73 0x490000
    R72 0x480000
    R71 0x470000
    R70 0x4600FE
    R69 0x450011
    R68 0x440020
    R67 0x431000
    R66 0x42003F
    R65 0x410000
    R64 0x400080
    R63 0x3FC350
    R62 0x3E0000
    R61 0x3D03E8
    R60 0x3C01F4
    R59 0x3B1388
    R58 0x3A0000
    R57 0x390001
    R56 0x380001
    R55 0x370002
    R54 0x360000
    R53 0x350000
    R52 0x340000
    R51 0x33203F
    R50 0x320080
    R49 0x310000
    R48 0x304180
    R47 0x2F0300
    R46 0x2E0300
    R45 0x2D3333
    R44 0x2C3333
    R43 0x2B00C8
    R42 0x2A0000
    R41 0x290000
    R40 0x280000
    R39 0x2703E8
    R38 0x260000
    R37 0x250500
    R36 0x24002D
    R35 0x233180
    R34 0x220010
    R33 0x210000
    R32 0x201041
    R31 0x1F0401
    R30 0x1EB18C
    R29 0x1D318C
    R28 0x1C0639
    R27 0x1B8001
    R26 0x1A0DB0
    R25 0x190624
    R24 0x180E34
    R23 0x171102
    R22 0x16E2BF
    R21 0x151C64
    R20 0x14272C
    R19 0x132120
    R18 0x120000
    R17 0x1115C0
    R16 0x10171C
    R15 0x0F2001
    R14 0x0E3001
    R13 0x0D0038
    R12 0x0C0408
    R11 0x0B0602
    R10 0x0A0000
    R9 0x090005
    R8 0x08C802
    R7 0x070000
    R6 0x060A43
    R5 0x050032
    R4 0x044204
    R3 0x030041
    R2 0x028272
    R1 0x0157A2
    R0 0x004230

    This sets the LMX2820 to 5.65GHz without any calibration assist. At this point, FCAL_EN = 1, INSTCAL_DBLR_EN = 1, INSTCAL_EN = 0. The INSTCAL_DLY is also set at this point (register R2).

    I then set INSTCAL_EN = 1 and FCAL_EN = 1 (even though FCAL_EN is already 1).

    I verify that I am locked at 5.65GHz. Note: I am reading the MUXOUT register readback to verify lock, not the Lock Detect I/O pin.

    Then, I again set INSTCAL_EN = 1 and FCAL_EN = 1 (even though FCAL_EN is already 1).

    I wait 100ms.

    Then, set FCAL_EN = 0.

    At this point, Instant Calibration is complete and I can set the desired output frequency by writing the following registers:

    INSTCAL_PLL_NUM (R45, R44)
    PLL_N (R36)
    PLL_NUM (R43, R42)
    PLL_DEN (R39, R38)
    OUTA_MUX (R78)
    CHDIVA (R32)

    I then write 0x4220 to R0 so that FCAL_EN = 0

    And yes, I seem to have no issue achieving lock except for the frequencies I mentioned. I've verified using an oscilloscope that Instant Calibration is in effect based on observing a ~10usec total lock time per frequency.

    One observation if that I do not appear to be writing the INSTCAL_PLL_NUM as in Step 7, because it is already set properly by this point.


    ~~~~~~~~~~~~~~~~~~~~
    I think there needs to be published a corrected, definitive list of steps for enabling Instant Calibration, because the datasheet is at odds with the list of steps you provided above. It also omits the 100ms wait time between setting FCAL_EN to 1 and to 0.

    These are the steps listed in the datasheet for enabling Instant Calibration:

    1. Power up device Normally.
    2. Program INSTCAL_DLY.
    3. Program register R1 for Instant Calibration.
    • Set INSTCAL_EN = 1. The action of toggling INSTCAL_EN from 0 to 1 resets the instant calibration settings and sets the part up to generate settings the next time that register R0 is programmed with FCAL_EN = 1.
    • If the output doubler is used set INSTCAL_DBLR_EN = 1, otherwise set it to 0
    4. Program the device to output 5.65 GHz.
    5. Program INSTCAL_PLL_NUM = 232 × (PLL_NUM / PLL_DEN).
    6. Write R0 with FCAL_EN = 1 to generate the calibration settings.
    7. Write R0 with FCAL_EN = 0 to have the device lock to 5.65 GHz
    8. Wait for Lock Detect to go high.

    Now the device is initialized for the particular phase detector frequency that this was done at. Provided that power is not removed from the device and then phase detector frequency does not change, subsequent frequency changes an be done using the instant cal. To change frequencies after the instant calibration is initialized:

    1. Write the values for INSTCAL_PLL_NUM, PLL_N, PLL_NUM, PLL_DEN.
    2. Write R0 to trigger Calibration (with DBLR_CAL_EN = 0, FCAL_EN = 0).



    Furthermore, elsewhere in this forum, the following steps are given:

    1. enable all Double Buffer bits
    2. if VCO doubler is needed, enable INSTCAL_DBLR_EN
    3. Vcc power up the device
    4. Program all the registers to make the device lock to 5650MHz (INSTCAL_EN = 0, FCAL_EN=1, INSTCAL_PLL_NUM = according to your configuration)
    5. After it is locked, program INSTCAL_EN = 1

    6. Program FCAL_EN = 1

    7. Wait 100ms
    8. Program FCAL_EN = 0
    9. Instant calibration is complete

  • Hi Dan, 
    I followed the steps Noel listed in his thread you attached in the previous reply and had no issue using instant cal to lock to 2079MHz, 4158MHz, & 8316 MHz respectively. I find it extremely odd your able to successfully change frequency instant cal for most frequencies except these three you list. Can you please try instant calibration once more using the directions my colleague provide in the thread you attached above? 

    Once instant cal is done, writing to PLL_N, PLL_NUM, PLL_DEN & INSTCAL_PLL_NUM and writing to R0 (with FCAL_EN =0) should be the only parameters necessary to change. 

    As the directions for instant cal, I need to investigate why the procedures vary. 

    Regards, 

    Vicente 

  • I'm happy to try, but I'm stuck on how to do steps 1 and 2 before step 3. VCC powering the device prior to talking to it seems necessary, right? Or maybe "VCC power up the device" doesn't mean what I think it means?

  • Hi Dan, 
    I was able to power on first and following all subsequent steps Noel gave and managed to achieve lock to 2079MHz, 4158MHz, & 8316 MHz respectively using instant cal. Please try the procedure from the image above but applying power first and let me know if this works for you. 

    Regards, 

    Vicente 

  • I tried following the instructions as pedantically as possible. Here is what my script looks like when following Noel's procedure:


    def initialize_instant_calibration():
    # TI Forum recommendation
    # Initial register writes.
    initialize_LMX2820()
    print("Initial register writes done.")

    # Enable all Double Buffer bits
    write_spi_register(0x46, 0x00FE)

    # If VCO doubler is needed, enable INSTCAL_DBLR_EN
    write_spi_register(0x1, 0x57A2)
    print("INSTCAL_DBLR_EN=1")

    # Program all the registers to make the device lock to 5650MHz (INSTCAL_EN = 0, FCAL_EN=1, INSTCAL_PLL_NUM = according to your configuration)
    # INSTCAL_EN = 0
    write_spi_register(0x1, 0x57A2)
    # FCAL_EN=1
    write_spi_register(0x0, 0x4230)
    # INSTCAL_PLL_NUM for 5650
    write_spi_register(0x2C, 0x3333)
    write_spi_register(0x2D, 0x3333)

    # After it is locked...
    while read_spi_register(0x4A) >> 14 != 2:
    time.sleep(dwell)
    print("Locked at 5650 MHz")

    # ...program INSTCAL_EN = 1
    write_spi_register(0x1, 0x57A3)
    print("INSTCAL_EN enabled (0x0157A3)")

    # Program FCAL_EN = 1
    write_spi_register(0x0, 0x4230)
    print("FCAL_EN enabled (0x004230)")

    # Wait 100ms
    time.sleep(.1)
    print("Waited 100ms")

    # Program FCAL_EN = 0
    write_spi_register(0x0, 0x4220)
    print("FCAL_EN disabled (0x004220)")

    # Instant calibration is complete

    This results in my sweep stopping at 8315MHz.

    After tinkering with things for a while, I have found that the following script properly initializes Instant Calibration for me and allows me to reliably sweep from 45MHz to 22.6GHz:

    def initialize_instant_calibration():
    # GOLDEN
    # Initial register writes
    initialize_LMX2820()
    print("Initial register writes done.")

    write_spi_register(0x1, 0x57A3)
    write_spi_register(0x0, 0x4230)

    while read_spi_register(0x4A) >> 14 != 2:
    time.sleep(dwell)
    print("Locked at 5650 MHz")

    write_spi_register(0x1, 0x57A3)
    print("INSTCAL_EN=1")

    write_spi_register(0x0, 0x4230)
    print("FCAL_EN=1")

    time.sleep(.1)
    print("Waited 100ms")

    write_spi_register(0x0, 0x4220)
    print("FCAL_EN=0")

    # Turn on the LED
    GPIO.output(LED_PIN, GPIO.HIGH)

    While I may have stumbled upon a configuration that so far seems to be working reliably, I do not understand why it is working reliably, especially since it does not seem to strictly follow any published procedure.

    Dan
  • Hi Dan,

    let me look into this furthers this is vvery weird because it seems your following the correct procedure - a procedure that doesn’t give me any issues on bench.

  • Thank you. I am interested in what you find, but I'm more interested in a review and correction of the published Instant Calibration procedure in the datasheet. It is confusing, lacks details and explanation, and contradicts what is posted elsewhere.

  • Hi Dan, 
    The engineer most familiar with this parts returns this week after being out of office for quite some time. 
    I will bring this by them.

    Give me till the end of this week. 

    Regards, 

    Vicente