Post Go back to editing

ADRV9009 DAC (TX) output Issues

Category: Software
Product Number: ADRV9009
Software Version: Vivado 2018.3

Hi Team,

              We are using a custom ADRV9009 with evaluation ZCU102. In custom ADRV9009 design has HMC7044 PLL clock source instead of AD9528 PLL. The ADRV9009 initializations are done and the no-os prints are as expected. 

 But we observed that the DAC output of ADRV9009 contains LO leakage issues. The DAC outputs of ADRV9009 contain LO, fm+LO , fm-LO frequencies. Let's say, ADRV9009 LO is tuned to 2.5GHz and we are providing 1MHz offset from DDS then the DAC output has 2499MHz, 2500MHz and 2501MHz frequencies.  

 When we are used TALISE_enableTxNCO() API, we observed only LO+fm frequency. But as per TALISE_enableTxNCO() API is used,  fm+LO and fm-LO frequencies are present.

When we are used ADI DDS from SDK, we observed fm+LO and fm-LO frequencies in the DAC output.

What could be the reason for fm-LO (Image frequency) in he DAC output of ADRV9009 ? 

             
Here I'm attaching the no-os prints:
Thanks in Advance 
Goli Ganesh
Parents
  • There seems to be an issue with the way the data is sent from the FPGA. Make sure that the data that you are sending has I and Q phase difference of 90 degree. With internal NCO, you will not see two tones at the output.

    Refer to the below link for some example files, you can try loading  the same files :

    https://wiki.analog.com/resources/eval/user-guides/ad-fmcomms2-ebz/software/basic_iq_datafiles 

  • Hi  ,

                      Thanks for the reply. The data we are sending has an I and Q phase difference of 90 degrees. I loaded the example files provided in the above link, with that data also both fm+LO and fm-LO frequencies are observed in the DAC output of ADRV9009.
    Thanks and Regards
    Goli Ganesh
  • The issue looks to be coming from the DDS, and the way the tone is generated from the FPGA. If you dont involve our chip, and loopback TX to RX only in your FPGA, you will see similar results.

     Can you test with a modulated waveform? 

  • HI  ,

           

                Sorry for the delayed response. I plotted the DDS module output which is given to the DAC(TX) module. In the DDS output we observed only fm+LO frequency. The same DDS module when we use the ADRV9009 evaluation board then only fm+LO frequency was observed. But the same DDS module when we use custom ADRV9009 then we get fm+LO and fm-LO(image frequency) frequencies as observed in the TX output.  I also tested with modulated signal then also image frequency was observed.

    Here I'm attaching the DDS module output FFT plot

    Thanks and Regards

    Goli Ganesh

  • This kind of two tone output at TX can occur if either the I or Q signal  gets dropped while the data is being sent to the chip. Check if both I and Q data is being sent from the DDS to the JESD. Make sure that the data packing is correct.

    Can you try testing RX to TX loopback using the attached script? Send a tone from siggen to RX input and check if you are seeing the same tone at TX output. 

    RX_TX_loopback.zip

  • Hi  ,

             

                 Thanks for the response. I loopback the RX output to TX and then test it on hardware. In the TX output, both fm+LO and fm-LO(Image frequency) frequencies were observed in the spectrum. But in the RX output we plotted the FFT then fm+LO frequency only was observed. I also checked the data path between DDS to JESD with system ILA , the data packing was in the correct order.
    Thanks and Regards
    Goli Ganesh
  • I think its clear that the issue is from the TX side . Can you please  share the TX QEC Tracking cal status using getTxQecStatus() API .

  • Hi  ,

                        Here I'm attaching the TX QEC Tracking cal status:

    Thanks and Regards

    Goli Ganesh

                    

  • It looks like TX QEC cal is not running , Please check if the QEC Cal is run properly .

    The  iteration count and update count should be incremented as shown in the working case below .

  • Enable  the initial calibrations and tracking calibrations using the below API's

    TALISE_runInitCals(taliseDevice_t *device, uint32_t calMask)

    TALISE_enableTrackingCals(taliseDevice_t *device, uint32_t enableMask)

    Please make sure that the QEC init cal and tracking cal are enabled.

    Attached the script for the same .

    ########################
    #ADI Demo Python Script
    ########################
    
    #Import Reference to the DLL
    import clr
    import System
    import time
    clr.AddReferenceToFileAndPath("C:\\Program Files (x86)\\Analog Devices\\ADRV9009 Transceiver Evaluation Software_Latest17thOct2022Installed\\AdiCmdServerClient.dll")
    from AdiCmdServerClient import AdiCommandServerClient
    from AdiCmdServerClient import Talise
    from AdiCmdServerClient import FpgaTalise
    from System import Array
    
    #Create an Instance of the Class
    Link = AdiCommandServerClient.Instance
    
    #Connect to the Zynq Platform
    if(Link.hw.Connected == 1):
        Connect = 0
    else:
        Connect = 1
        Link.hw.Connect("192.168.1.50", 55555)
    
    print Link.Version()
    ##################################################
    # Tracking Cals
    ##################################################
    time.sleep(1)
    #trackingCalMask = 0
    #Link.Talise.EnableTrackingCals(0)
    print "Enabled Tracking Cals After Init Cal", Link.Talise.GetEnabledTrackingCals(0)
    txlol = Link.Talise.GetTxLolStatus(Link.Talise.TxChannel.Tx1)
    print "Tx LOL Tracking Cals Status"
    print "\tErrorCode", txlol.ErrorCode
    print "\tPercentComplete", txlol.PercentComplete
    print "\tVarianceMetric", txlol.VarianceMetric
    print "\tIterCount", txlol.IterCount
    print "\tUpdateCount", txlol.UpdateCount
    
    #Link.Talise.EnableTrackingCals(0)
    print "Enabled Tracking Cals After Init Cal", Link.Talise.GetEnabledTrackingCals(0)
    #txlol = Link.Talise.GetTxQECStatus(Link.Talise.TxChannel.Tx1)
    txQEC = Link.Talise.GetTxQecStatus(Link.Talise.TxChannel.Tx1)
    print "Tx QEC Tracking Cals Status"
    print "\tErrorCode", txQEC.ErrorCode
    print "\tPercentComplete", txQEC.PercentComplete
    print "\tCorrectionMetric", txQEC.CorrectionMetric
    print "\tIterCount", txQEC.IterCount
    print "\tUpdateCount", txQEC.UpdateCount
    
    
    trackingCalMask=0
    trackingCalMask |= int(Link.Talise.TrackingCalMask.Rx1Qec)
    trackingCalMask |= int(Link.Talise.TrackingCalMask.Rx2Qec)
    trackingCalMask |= int(Link.Talise.TrackingCalMask.ORx1Qec)
    trackingCalMask |= int(Link.Talise.TrackingCalMask.Tx1Qec)
    trackingCalMask |= int(Link.Talise.TrackingCalMask.Tx2Qec)
    Link.Talise.GetEnabledTrackingCals(trackingCalMask)
    print "Enabled Tracking Cals After Init Cal", Link.Talise.GetEnabledTrackingCals(0)
    #LoopBW = Link.Talise.GetRfPllLoopFilter(0)
    Z = 0
    Y = 0
    print "\nLoopbandwidth_KHz", Link.Talise.GetRfPllLoopFilter(Z,Y)
    
    
    
    #Disconnect from the Zynq Platform
    
    if(Connect == 1):
        Link.hw.Disconnect()
    
    

  • Hi  ,

                We are using both TALISE_runInitCals(taliseDevice_t *device, uint32_t calMask) and TALISE_enableTrackingCals(taliseDevice_t *device, uint32_t enableMask) API's. The QEC init cal and tracking cal are also enabled. Still the update count and Iteration count are 0 for getTxQecStatus() in our case. What could be the reason for this ?

    Thanks and Regards

    Goli Ganesh

  • What is the initcal mask used ?

    Can you please try reading back the init and tracking cals status using getInitCalStatus() and getEnabledTrackingCals() ?

Reply Children