Post Go back to editing

High phase variation in higher and lower frequency bands

Category: Software
Product Number: ZCU102_FMCOMMS8
Software Version: Vivado 2021.2

Hi Team,

                   

               I am using FMCOMMS8_ZCU102 setup with a 200MHz bandwidth receiver, sampling at 245.76Msps. When I'm tuning any LO in lower band range (150MHz to 900MHz) or higher band range (5GHz to 6GHz) using FHM GPIO Mode, then the phase variation is upto +/- 10 degrees. Whereas phase variation is upto +/- 1 degree in case of middle bands (900MHz to 5GHz) . Why is there so much variation for phase difference in side bands ? Are there any suggestions for improvement in phase particularly in these bands?



Thanks & Regards

Goli Ganesh

Parents
  • Can you try testing using FHM in SPI mode?

  • Hi  ,



                

    Can you try testing using FHM in SPI mode?

           Yes, we have tried using FHM in SPI mode but observed the same phase variation in lower and higher bands.


    Thanks and Regards

    Goli Ganesh

  • Hi  ,

                     
                            Is there any update on this ?


    Thanks and regards
    Goli Ganesh
                    

  • We are looking into this , will get back to you 

  • Hi   ,


                             Thanks for looking at the issue and we are anticipating your reply.


    Regards
    Goli

  • Hi Goli,

    Wondering what are you FHM init settings?

    Are you using something like this?

    DEVICES="
    adrv9009-phy-c
    adrv9009-phy-d"


    for devices in $DEVICES
    do
    echo $devices:
    iio_attr -u ip:$1 -D $devices adi,fhm-mode-fhm-trigger-mode $2
    iio_attr -u ip:$1 -D $devices adi,fhm-mode-fhm-init-frequency_hz 250000000
    iio_attr -u ip:$1 -D $devices adi,fhm-config-fhm-min-freq_mhz 180
    iio_attr -u ip:$1 -D $devices adi,fhm-config-fhm-max-freq_mhz 6000
    iio_attr -u ip:$1 -D $devices adi,fhm-mode-enable-mcs-sync 1
    iio_attr -u ip:$1 -D $devices adi,fhm-config-fhm-gpio-pin 8
    done

    iio_attr -u ip:$1 -T0 -d adrv9009-phy-d jesd204_fsm_ctrl 1

    iio_attr -u ip:$1 -c adrv9009-phy-c altvoltage0 frequency_hopping_mode_enable 1
    iio_attr -u ip:$1 -c adrv9009-phy-d altvoltage0 frequency_hopping_mode_enable 1

    -Michael

  • Hi  ,

                
                    Thank you for the response.  Actually we are not using Linux Drivers. We are using no-OS-2021_R2 and hdl_2021_R2.



    Regards
    Goli Ganesh

  • Actually we are not using Linux Drivers. We are using no-OS-2021_R2 and hdl_2021_R2.

    If you use NoOS and the API directly there are 1:1 corresponding members in structures 

    • taliseFhmConfig_t
    • taliseFhmMode_t

    -Michael

  •    This is the function that we are using and the corresponding FHM settings are also present inside this function.





    /*
    * freq_hop.c
    *
    *
    * Author: goli
    */

    #include "talise.h"
    #include "talise_config.h"
    #include "app_config.h"
    #include "app_clocking.h"
    #include "app_jesd.h"
    #include "app_transceiver.h"
    #include "app_talise.h"
    #include "talise_tx.h"
    #include "talise_radioctrl.h"

    #include "xil_printf.h"
    #include "sleep.h"

    #include "xgpiops.h"
    #include "xgpio.h"

    #include "xparameters.h"

    #include "freq_hop.h"

    #include "xtime_l.h"
    #include "talise_error_types.h"

    #include "talise_radioctrl.h"

    #include "talise_cals.h"


    int adrv_freq_hop(taliseDevice_t *device, freq_hop *freq_hop_ptr_obj){

    uint64_t freq = 0;

    taliseFhmConfig_t fhmConfig;
    taliseFhmMode_t fhmMode ,fhmMode_get;
    uint32_t initCalMaskCal = TAL_FHM_CALS;
    uint8_t errorFlag = 0;
    uint32_t talAction = 0;



    TALISE_setGpioOe(device, 0x00000 , 0x3FFFF); //input enable

    TALISE_radioOff(device);

    fhmConfig.fhmGpioPin = TAL_GPIO_14;
    fhmConfig.fhmMinFreq_MHz = 150;
    fhmConfig.fhmMaxFreq_MHz = 6000;

    device->devStateInfo.talFhmFreqRange.fhmMinFreq_MHz = freq_hop_ptr_obj->min_freq_mhz;
    device->devStateInfo.talFhmFreqRange.fhmMaxFreq_MHz = freq_hop_ptr_obj->max_freq_mhz;


    TALISE_setFhmConfig(device, &fhmConfig);


    talAction = TALISE_runInitCals(device, initCalMaskCal);
    if (talAction != TALACT_NO_ACTION) {
    ** < User: decide what to do based on Talise recovery action returned > **
    printf("error: TALISE_runInitCals() failed\n");

    }

    talAction = TALISE_waitInitCals(device, 60000, &errorFlag);
    if (talAction != TALACT_NO_ACTION) {
    ** < User: decide what to do based on Talise recovery action returned > **
    printf("error: TALISE_waitInitCals() failed\n");

    }

    if (errorFlag) {
    < user code - Check error flag to determine ARM error>
    printf("error: Calibrations not completed\n");

    } else {
    < user code - Calibrations completed successfully >
    printf("talise: Calibrations completed successfully\n");
    }


    TALISE_radioOn(device);



    fhmMode.fhmEnable = 1;
    fhmMode.enableMcsSync = 1;

    fhmMode.fhmTriggerMode = TAL_FHM_GPIO_MODE;




    fhmMode.fhmInitFrequency_Hz = (freq_hop_ptr_obj->min_freq_mhz * (uint64_t)1000000);

    TALISE_setFhmMode(device, &fhmMode);


    while(1){

    TALISE_setFhmHop(device, freq_hop_ptr_obj->hop_freqs[0]);

    XGpio_Out32(XPAR_AXI_GPIO_10_BASEADDR, 0);
    XGpio_Out32(XPAR_AXI_GPIO_10_BASEADDR, 1);


    usleep(50);

    TALISE_setFhmHop(device, freq_hop_ptr_obj->hop_freqs[1]);

    XGpio_Out32(XPAR_AXI_GPIO_10_BASEADDR, 0);
    XGpio_Out32(XPAR_AXI_GPIO_10_BASEADDR, 1);


    usleep(50);

    }


    }





Reply
  •    This is the function that we are using and the corresponding FHM settings are also present inside this function.





    /*
    * freq_hop.c
    *
    *
    * Author: goli
    */

    #include "talise.h"
    #include "talise_config.h"
    #include "app_config.h"
    #include "app_clocking.h"
    #include "app_jesd.h"
    #include "app_transceiver.h"
    #include "app_talise.h"
    #include "talise_tx.h"
    #include "talise_radioctrl.h"

    #include "xil_printf.h"
    #include "sleep.h"

    #include "xgpiops.h"
    #include "xgpio.h"

    #include "xparameters.h"

    #include "freq_hop.h"

    #include "xtime_l.h"
    #include "talise_error_types.h"

    #include "talise_radioctrl.h"

    #include "talise_cals.h"


    int adrv_freq_hop(taliseDevice_t *device, freq_hop *freq_hop_ptr_obj){

    uint64_t freq = 0;

    taliseFhmConfig_t fhmConfig;
    taliseFhmMode_t fhmMode ,fhmMode_get;
    uint32_t initCalMaskCal = TAL_FHM_CALS;
    uint8_t errorFlag = 0;
    uint32_t talAction = 0;



    TALISE_setGpioOe(device, 0x00000 , 0x3FFFF); //input enable

    TALISE_radioOff(device);

    fhmConfig.fhmGpioPin = TAL_GPIO_14;
    fhmConfig.fhmMinFreq_MHz = 150;
    fhmConfig.fhmMaxFreq_MHz = 6000;

    device->devStateInfo.talFhmFreqRange.fhmMinFreq_MHz = freq_hop_ptr_obj->min_freq_mhz;
    device->devStateInfo.talFhmFreqRange.fhmMaxFreq_MHz = freq_hop_ptr_obj->max_freq_mhz;


    TALISE_setFhmConfig(device, &fhmConfig);


    talAction = TALISE_runInitCals(device, initCalMaskCal);
    if (talAction != TALACT_NO_ACTION) {
    ** < User: decide what to do based on Talise recovery action returned > **
    printf("error: TALISE_runInitCals() failed\n");

    }

    talAction = TALISE_waitInitCals(device, 60000, &errorFlag);
    if (talAction != TALACT_NO_ACTION) {
    ** < User: decide what to do based on Talise recovery action returned > **
    printf("error: TALISE_waitInitCals() failed\n");

    }

    if (errorFlag) {
    < user code - Check error flag to determine ARM error>
    printf("error: Calibrations not completed\n");

    } else {
    < user code - Calibrations completed successfully >
    printf("talise: Calibrations completed successfully\n");
    }


    TALISE_radioOn(device);



    fhmMode.fhmEnable = 1;
    fhmMode.enableMcsSync = 1;

    fhmMode.fhmTriggerMode = TAL_FHM_GPIO_MODE;




    fhmMode.fhmInitFrequency_Hz = (freq_hop_ptr_obj->min_freq_mhz * (uint64_t)1000000);

    TALISE_setFhmMode(device, &fhmMode);


    while(1){

    TALISE_setFhmHop(device, freq_hop_ptr_obj->hop_freqs[0]);

    XGpio_Out32(XPAR_AXI_GPIO_10_BASEADDR, 0);
    XGpio_Out32(XPAR_AXI_GPIO_10_BASEADDR, 1);


    usleep(50);

    TALISE_setFhmHop(device, freq_hop_ptr_obj->hop_freqs[1]);

    XGpio_Out32(XPAR_AXI_GPIO_10_BASEADDR, 0);
    XGpio_Out32(XPAR_AXI_GPIO_10_BASEADDR, 1);


    usleep(50);

    }


    }





Children