Post Go back to editing

ADRV9009 TX2 QEC Enable

I used ADRV9009 to send QPSK signal, which belongs to 0 IF architecture.  In order not to affect the demodulation of QPSK signal, I moved the signal from 0 to 50MHz when generating baseband signal, but there was a strong mirror signal at LO-50MHz.And I've turned on TX QEC,But it didn't do anything,

"I didn't use the QPSK signal in the screenshot to demonstrate"

I provide my printout and talise_setup here.!!!

--------- ad9528 configured start!! ---------

ad9528_init() successfully!!!
ad9528_config() successfully with 0

ad9528_setup() done !

--------------- ADRV9009  Configuration Start ----------------
MESSAGE: 0: TALISE_resetDevice()
MESSAGE: 0: TALISE_initialize()
MESSAGE: 0: TALISE_calculateDigitalClocks()
MESSAGE: 0: TALISE_setSpiSettings()
MESSAGE: 0: TALISE_verifySpiReadWrite()
MESSAGE: 0: TALISE_getDeviceRev()
MESSAGE: 0: TALISE_initDigitalClocks()
MESSAGE: 0: TALISE_waitForEvent()
MESSAGE: 0: TALISE_waitForEvent()
MESSAGE: 0: TALISE_programFir()
MESSAGE: 0: TALISE_programFir()
MESSAGE: 0: TALISE_programRxGainTable()
MESSAGE: 0: TALISE_setRxManualGain()
MESSAGE: 0: TALISE_setRxManualGain()
MESSAGE: 0: TALISE_programFir()
MESSAGE: 0: TALISE_programOrxGainTable()
MESSAGE: 0: TALISE_setObsRxManualGain()
MESSAGE: 0: TALISE_setObsRxManualGain()
MESSAGE: 0: TALISE_setupJesd204bFramer()
MESSAGE: 0: TALISE_setupAdcSampleXbar()
MESSAGE: 0: talRecoveryActions_t()
MESSAGE: 0: TALISE_setupJesd204bFramer()
MESSAGE: 0: TALISE_setupAdcSampleXbar()
MESSAGE: 0: TALISE_setupDeserializers()
MESSAGE: 0: TALISE_setupDacSampleXbar()
MESSAGE: 0: TALISE_setupDacSampleXbar()
MESSAGE: 0: TALISE_enableDeframerLink()
MESSAGE: 0: TALISE_enableDeframerLink()
MESSAGE: 0: TALISE_setTxAttenuation()
MESSAGE: 0: TALISE_setTxAttenuation()
MESSAGE: 0: TALISE_getPllsLockStatus()
success : CLKPLL is locked
MESSAGE: 0: TALISE_enableMultichipSync()
MESSAGE: 0: TALISE_enableMultichipSync()
MESSAGE: 0: TALISE_SerializerReset()
MESSAGE: 0: TALISE_initArm()
MESSAGE: 0: TALISE_writeArmConfig()
MESSAGE: 0: TALISE_writeArmMem()
MESSAGE: 0: TALISE_loadAdcProfiles
MESSAGE: 0: TALISE_writeArmMem()
MESSAGE: 0: TALISE_writeArmMem()
MESSAGE: 0: TALISE_writeArmMem()
MESSAGE: 0: TALISE_writeArmMem()
MESSAGE: 0: TALISE_writeArmMem()
MESSAGE: 0: TALISE_loadStreamFromBinary()
MESSAGE: 0: TALISE_writeArmMem()
MESSAGE: 0: TALISE_loadArmFromBinary()
MESSAGE: 0: TALISE_writeArmMem()
MESSAGE: 0: TALISE_verifyArmChecksum()
MESSAGE: 0: TALISE_readArmMem()
MESSAGE: 0: TALISE_readArmMem()
MESSAGE: 0: TALISE_readArmMem()
MESSAGE: 0: TALISE_writeArmConfig()
MESSAGE: 0: TALISE_writeArmMem()
MESSAGE: 0: TALISE_sendArmCommand()
MESSAGE: 0: TALISE_waitArmCmdStatus()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
MESSAGE: 0: TALISE_verifyArmChecksum()
MESSAGE: 0: TALISE_readArmMem()
MESSAGE: 0: TALISE_readArmMem()
MESSAGE: 0: TALISE_getDeviceRev()
MESSAGE: 0: TALISE_getArmVersion()
MESSAGE: 0: TALISE_readArmMem()
MESSAGE: 0: TALISE_getApiVersion()
talise: Device Revision 192, Firmware 6.0.2, API 3.6.0.5
MESSAGE: 0: TALISE_readArmCmdStatusByte()
MESSAGE: 0: TALISE_writeArmMem()
MESSAGE: 0: TALISE_sendArmCommand()
MESSAGE: 0: TALISE_waitArmCmdStatus()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
success: TALISE_setRfPllFrequency() success,RF_PLL_LO_FREQUENCIES is:1000000000
MESSAGE: 0: TALISE_getPllsLockStatus()
MESSAGE: 0: TALISE_runInitCals()
MESSAGE: 0: TALISE_sendArmCommand()
success: TALISE_runInitCals() success,initCalMask is:941551
MESSAGE: 0: TALISE_waitArmCmdStatus()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
success: TALISE_waitInitCals() success,Flag is:0
talise: Calibrations completed successfully
MESSAGE: 0: TALISE_enableFramerLink()
MESSAGE: 0: TALISE_enableFramerLink()
success: TALISE_enableSysrefToFramer() TAL_FRAMER_A enable sysref success
MESSAGE: 0: TALISE_enableFramerLink()
MESSAGE: 0: TALISE_enableFramerLink()
success: TALISE_enableSysrefToFramer() TAL_FRAMER_B enable sysref success
MESSAGE: 0: TALISE_enableDeframerLink()
MESSAGE: 0: TALISE_enableDeframerLink()
success: TALISE_enableSysrefToFramer() TAL_DEFRAMER_A enable sysref success
success: axi_jesd204_rx_lane_clk_enable() rx.rxChannels != TAL_RXOFF
success: axi_jesd204_rx_lane_clk_enable() obsRxChannelsEnable != TAL_ORXOFF
success: axi_jesd204_tx_lane_clk_enable() txChannels != TAL_TXOFF
MESSAGE: 0: TALISE_readDeframerStatus()
MESSAGE: 0: TALISE_writeArmMem()
MESSAGE: 0: TALISE_sendArmCommand()
MESSAGE: 0: TALISE_waitArmCmdStatus()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
success: TALISE_enableTrackingCals() success,tackingCalMask is:131
MESSAGE: 0: TALISE_sendArmCommand()
MESSAGE: 0: TALISE_waitArmCmdStatus()
MESSAGE: 0: TALISE_readArmCmdStatusByte()
MESSAGE: 0: TALISE_getPllsLockStatus()
success: ALL PLL  is  locked!!
TALISE_getRadioState is : 3
ADRV9009  Configured with Success

adiHalErr_t talise_setup(taliseDevice_t *const pd, taliseInit_t *const pi)
{
  uint32_t talAction = TALACT_NO_ACTION;
  uint8_t errorFlag = 0;
  uint8_t mcsStatus = 0;
  uint8_t pllLockStatus = 0;
  uint32_t radioStatus = 0;

  uint32_t count = sizeof(armBinary);
  taliseArmVersionInfo_t talArmVersionInfo;
#if defined(ADRV9008_1)
  uint32_t initCalMask = TAL_ADC_TUNER | TAL_TIA_3DB_CORNER | TAL_DC_OFFSET |
                         TAL_RX_GAIN_DELAY | TAL_FLASH_CAL | TAL_RX_QEC_INIT;
#elif defined(ADRV9008_2)
  uint32_t initCalMask = TAL_TX_BB_FILTER | TAL_ADC_TUNER | TAL_TIA_3DB_CORNER |
                         TAL_DC_OFFSET | TAL_FLASH_CAL | TAL_PATH_DELAY |
                         TAL_TX_LO_LEAKAGE_INTERNAL | TAL_TX_QEC_INIT |
                         TAL_LOOPBACK_RX_LO_DELAY | TAL_LOOPBACK_RX_RX_QEC_INIT |
                         TAL_ORX_QEC_INIT | TAL_TX_DAC | TAL_ADC_STITCHING;
#else
  uint32_t initCalMask = TAL_TX_BB_FILTER | TAL_ADC_TUNER | TAL_TIA_3DB_CORNER |
                         TAL_DC_OFFSET | TAL_RX_GAIN_DELAY | TAL_FLASH_CAL |
                         TAL_PATH_DELAY | TAL_TX_LO_LEAKAGE_INTERNAL |
                         TAL_TX_QEC_INIT | TAL_LOOPBACK_RX_LO_DELAY |
                         TAL_LOOPBACK_RX_RX_QEC_INIT | TAL_RX_QEC_INIT |
                         TAL_ORX_QEC_INIT | TAL_TX_DAC | TAL_ADC_STITCHING;
#endif
  uint32_t trackingCalMask = TAL_TRACK_RX1_QEC |
                             TAL_TRACK_RX2_QEC |
                             TAL_TRACK_TX1_QEC |
                             TAL_TRACK_TX2_QEC;

  uint32_t api_vers[4];
  uint8_t rev;

  /*******************************/
  /**** Talise Initialization ***/
  /*******************************/

  /*Open Talise Hw Device*/
  talAction = TALISE_openHw(pd);
  if (talAction != TALACT_NO_ACTION)
  {
    /*** < User: decide what to do based on Talise recovery action returned > ***/
    printf("error: TALISE_openHw() failed\n");
    goto error_0;
  }

  /* Toggle RESETB pin on Talise device */
  talAction = TALISE_resetDevice(pd);
  if (talAction != TALACT_NO_ACTION)
  {
    /*** < User: decide what to do based on Talise recovery action returned > ***/
    printf("error: TALISE_resetDevice() failed\n");
    goto error_11;
  }

  /* TALISE_initialize() loads the Talise device data structure
   * settings for the Rx/Tx/ORx profiles, FIR filters, digital
   * filter enables, calibrates the CLKPLL, loads the user provided Rx
   * gain tables, and configures the JESD204b serializers/framers/deserializers
   * and deframers.
   */
  talAction = TALISE_initialize(pd, pi);
  if (talAction != TALACT_NO_ACTION)
  {
    /*** < User: decide what to do based on Talise recovery action returned > ***/
    printf("error: TALISE_initialize() failed\n");
    goto error_11;
  }

  /*******************************/
  /***** CLKPLL Status Check *****/
  /*******************************/
  talAction = TALISE_getPllsLockStatus(pd, &pllLockStatus);
  if (talAction != TALACT_NO_ACTION)
  {
    /*** < User: decide what to do based on Talise recovery action returned > ***/
    printf("error: TALISE_getPllsLockStatus() failed\n");
    goto error_11;
  }

  /* Assert that Talise CLKPLL is locked */
  if ((pllLockStatus & 0x01) == 0)
  {
    /* <user code - CLKPLL not locked - ensure lock before proceeding */
    printf("error: CLKPLL not locked\n");
    goto error_11;
  }
  else
  {

    printf("success : CLKPLL is locked\n");
  }

  /*******************************************************/
  /**** Perform MultiChip Sync (MCS) on Talise Device ***/
  /*******************************************************/
  talAction = TALISE_enableMultichipSync(pd, 1, &mcsStatus);
  if (talAction != TALACT_NO_ACTION)
  {
    /*** < User: decide what to do based on Talise recovery action returned > ***/
    printf("error: TALISE_enableMultichipSync() failed\n");
    goto error_11;
  }

  /*< user code - Request minimum 3 SYSREF pulses from Clock Device - > */
  ADIHAL_sysrefReq(pd->devHalInfo, SYSREF_PULSE);

  /*******************/
  /**** Verify MCS ***/
  /*******************/
  talAction = TALISE_enableMultichipSync(pd, 0, &mcsStatus);
  if ((mcsStatus & 0x0B) != 0x0B)
  {
    /*< user code - MCS failed - ensure MCS before proceeding*/
    printf("warning: TALISE_enableMultichipSync() failed\n");
  }

  /*******************************************************/
  /**** Prepare Talise Arm binary and Load Arm and	****/
  /**** Stream processor Binaryes 					****/
  /*******************************************************/
  if (pllLockStatus & 0x01)
  {
    talAction = TALISE_initArm(pd, pi);
    if (talAction != TALACT_NO_ACTION)
    {
      /*** < User: decide what to do based on Talise recovery action returned > ***/
      printf("error: TALISE_initArm() failed\n");
      goto error_11;
    }

    /*< user code- load Talise stream binary into streamBinary[4096] >*/
    /*< user code- load ARM binary byte array into armBinary[114688] >*/

    talAction = TALISE_loadStreamFromBinary(pd, &streamBinary[0]);
    if (talAction != TALACT_NO_ACTION)
    {
      /*** < User: decide what to do based on Talise recovery action returned > ***/
      printf("error: TALISE_loadStreamFromBinary() failed\n");
      goto error_11;
    }

    talAction = TALISE_loadArmFromBinary(pd, &armBinary[0], count);
    if (talAction != TALACT_NO_ACTION)
    {
      /*** < User: decide what to do based on Talise recovery action returned > ***/
      printf("error: TALISE_loadArmFromBinary() failed\n");
      goto error_11;
    }

    /* TALISE_verifyArmChecksum() will timeout after 200ms
     * if ARM checksum is not computed
     */
    talAction = TALISE_verifyArmChecksum(pd);
    if (talAction != TAL_ERR_OK)
    {
      /*< user code- ARM did not load properly - check armBinary & clock/profile settings >*/
      printf("error: TALISE_verifyArmChecksum() failed\n");
      goto error_11;
    }
  }
  else
  {
    /*< user code- check settings for proper CLKPLL lock  > ***/
    printf("error: CLKPLL not locked\n");
    goto error_11;
  }

  TALISE_getDeviceRev(pd, &rev);
  TALISE_getArmVersion_v2(pd, &talArmVersionInfo);
  TALISE_getApiVersion(pd,
                       &api_vers[0], &api_vers[1], &api_vers[2], &api_vers[3]);

  printf("talise: Device Revision %d, Firmware %u.%u.%u, API %u.%u.%u.%u\n",
         rev, talArmVersionInfo.majorVer,
         talArmVersionInfo.minorVer, talArmVersionInfo.rcVer,
         api_vers[0], api_vers[1], api_vers[2], api_vers[3]);

  /*******************************/
  /**Set RF PLL LO Frequencies ***/
  /*******************************/
  talAction = TALISE_setRfPllFrequency(pd, TAL_RF_PLL, RF_PLL_LO_FREQUENCIES);
  if (talAction != TALACT_NO_ACTION)
  {
    /*** < User: decide what to do based on Talise recovery action returned > ***/
    printf("error: TALISE_setRfPllFrequency() failed\n");
    goto error_11;
  }

  /*** < wait 200ms for PLLs to lock - user code here > ***/
  no_os_mdelay(200);

  talAction = TALISE_getPllsLockStatus(pd, &pllLockStatus);
  if ((pllLockStatus & 0x07) != 0x07)
  {
    /*< user code - ensure lock of all PLLs before proceeding>*/
    printf("error: RFPLL not locked\n");
    goto error_11;
  }

  /****************************************************/
  /**** Run Talise ARM Initialization Calibrations ***/
  /****************************************************/
  talAction = TALISE_runInitCals(pd, initCalMask);
  if (talAction != TALACT_NO_ACTION)
  {
    /*** < User: decide what to do based on Talise recovery action returned > ***/
    printf("error: TALISE_runInitCals() failed\n");
    goto error_11;
  }

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

  if (errorFlag)
  {
    /*< user code - Check error flag to determine ARM  error> */
    printf("error: Calibrations not completed\n");
    goto error_11;
  }
  else
  {
    /*< user code - Calibrations completed successfully > */
    printf("talise: Calibrations completed successfully\n");
  }

  /***************************************************/
  /**** Enable  Talise JESD204B Framer ***/
  /***************************************************/
  if (pi->jesd204Settings.framerA.M)
  {
    talAction = TALISE_enableFramerLink(pd, TAL_FRAMER_A, 0);
    if (talAction != TALACT_NO_ACTION)
    {
      printf("error: TALISE_enableFramerLink() failed\n");
      goto error_11;
    }

    talAction |= TALISE_enableFramerLink(pd, TAL_FRAMER_A, 1);
    if (talAction != TALACT_NO_ACTION)
    {
      printf("error: TALISE_enableFramerLink() failed\n");
      goto error_11;
    }

    /*************************************************/
    /**** Enable SYSREF to Talise JESD204B Framer ***/
    /*************************************************/
    /*** < User: Make sure SYSREF is stopped/disabled > ***/

    talAction = TALISE_enableSysrefToFramer(pd, TAL_FRAMER_A, 1);
    if (talAction != TALACT_NO_ACTION)
    {
      printf("error: TALISE_enableSysrefToFramer() failed\n");
      goto error_11;
    }
  }

  /***************************************************/
  /**** Enable  Talise JESD204B Framer ***/
  /***************************************************/
  if (pi->jesd204Settings.framerB.M)
  {
    talAction = TALISE_enableFramerLink(pd, TAL_FRAMER_B, 0);
    if (talAction != TALACT_NO_ACTION)
    {
      printf("error: TALISE_enableFramerLink() failed\n");
      goto error_11;
    }

    talAction |= TALISE_enableFramerLink(pd, TAL_FRAMER_B, 1);
    if (talAction != TALACT_NO_ACTION)
    {
      printf("error: TALISE_enableFramerLink() failed\n");
      goto error_11;
    }

    /*************************************************/
    /**** Enable SYSREF to Talise JESD204B Framer ***/
    /*************************************************/
    /*** < User: Make sure SYSREF is stopped/disabled > ***/

    talAction = TALISE_enableSysrefToFramer(pd, TAL_FRAMER_B, 1);
    if (talAction != TALACT_NO_ACTION)
    {
      printf("error: TALISE_enableSysrefToFramer() failed\n");
      goto error_11;
    }
  }

  /***************************************************/
  /**** Enable  Talise JESD204B Deframer ***/
  /***************************************************/
  if (pi->jesd204Settings.deframerA.M)
  {
    talAction = TALISE_enableDeframerLink(pd, TAL_DEFRAMER_A, 0);
    if (talAction != TALACT_NO_ACTION)
    {
      /*** < User: decide what to do based on Talise recovery action returned > ***/
      printf("error: TALISE_enableDeframerLink() failed\n");
      goto error_11;
    }

    talAction |= TALISE_enableDeframerLink(pd, TAL_DEFRAMER_A, 1);
    if (talAction != TALACT_NO_ACTION)
    {
      /*** < User: decide what to do based on Talise recovery action returned > ***/
      printf("error: TALISE_enableDeframerLink() failed\n");
      goto error_11;
    }
    /***************************************************/
    /**** Enable SYSREF to Talise JESD204B Deframer ***/
    /***************************************************/
    talAction = TALISE_enableSysrefToDeframer(pd, TAL_DEFRAMER_A, 1);
    if (talAction != TALACT_NO_ACTION)
    {
      /*** < User: decide what to do based on Talise recovery action returned > ***/
      printf("error: TALISE_enableDeframerLink() failed\n");
      goto error_11;
    }
  }

  /*** < User Sends SYSREF Here > ***/

  ADIHAL_sysrefReq(pd->devHalInfo, SYSREF_CONT_ON);

  if (talInit.rx.rxChannels != TAL_RXOFF)
    axi_jesd204_rx_lane_clk_enable(pd->devHalInfo);

  if (talInit.obsRx.obsRxChannelsEnable != TAL_ORXOFF)
    axi_jesd204_rx_lane_clk_enable(pd->devHalInfo);

  if (talInit.tx.txChannels != TAL_TXOFF)
  {
    axi_jesd204_tx_lane_clk_enable(pd->devHalInfo);

    /* RESET CDR */
    uint8_t phy_ctrl;
    ADIHAL_spiReadByte(pd->devHalInfo, TALISE_ADDR_DES_PHY_GENERAL_CTL_1,
                       &phy_ctrl);
    ADIHAL_spiWriteByte(pd->devHalInfo, TALISE_ADDR_DES_PHY_GENERAL_CTL_1,
                        phy_ctrl & ~NO_OS_BIT(7));
    ADIHAL_spiWriteByte(pd->devHalInfo, TALISE_ADDR_DES_PHY_GENERAL_CTL_1,
                        phy_ctrl);
  }

  ADIHAL_sysrefReq(pd->devHalInfo, SYSREF_CONT_OFF);

  no_os_mdelay(100);

  talAction = check_FramerDframerStatus(pd, pi);

  /***********************************************
   * Allow Rx1/2 QEC tracking and Tx1/2 QEC	   *
   * tracking to run when in the radioOn state	*
   * Tx calibrations will only run if radioOn and *
   * the obsRx path is set to OBS_INTERNAL_CALS   *
   * **********************************************/

  talAction = TALISE_enableTrackingCals(pd, trackingCalMask);
  if (talAction != TALACT_NO_ACTION)
  {
    /*** < User: decide what to do based on Talise recovery action returned > ***/
    printf("error: TALISE_enableTrackingCals() failed\n");
    goto error_11;
  }

  /* Function to turn radio on, Enables transmitters and receivers */
  /* that were setup during TALISE_initialize() */
  talAction = TALISE_radioOn(pd);
  if (talAction != TALACT_NO_ACTION)
  {
    /*** < User: decide what to do based on Talise recovery action returned > ***/
    printf("error: TALISE_radioOn() failed\n");
    goto error_11;
  }

  talAction = TALISE_setRxTxEnable(pd, TAL_RX1RX2_EN, TAL_TX1TX2);
  if (talAction != TALACT_NO_ACTION)
  {
    /*** < User: decide what to do based on Talise recovery action returned > ***/
    printf("error: TALISE_setRxTxEnable() failed\n");
  }

  /*Checks if the PLLs are locked */
  TALISE_getPllsLockStatus(pd, &pllLockStatus);
  if ((pllLockStatus & 0x07) != 0x07)
  {
    /*< user code - ensure lock of all PLLs before proceeding>*/
    printf("error: PLL not locked\n");
  }
  else
  {
    printf("success: ALL PLL  is  locked!!\n");
  }

  talAction = TALISE_getRadioState(pd, &radioStatus);
  printf("TALISE_getRadioState is : %x \n", radioStatus);

  return ADIHAL_OK;

error_11:
  TALISE_closeHw(pd);
error_0:
  return -1;
}

  •  This is my QPSK modulated signal, the baseband signal frequency is 50MHz, and the LOFreq-50MHz position is the mirrored signal.

  • In addition to performing QEC calibration, it is also necessary to perform LOL calibration. In addition, read the QEC tracking calibration status to check whether the QEC calibration is successful or not.

  • --------------- ADRV9009 Configuration Start ----------------
    success : CLKPLL is locked
    talise: Device Revision 192, Firmware 6.0.2, API 3.6.0.5
    success: TALISE_setRfPllFrequency() success,RF_PLL_LO_FREQUENCIES is:1000000000
    success: TALISE_runInitCals() success,initCalMask is:941551
    success: TALISE_waitInitCals() success,Flag is:0
    talise: Calibrations completed successfully
    success: TALISE_enableSysrefToFramer() TAL_FRAMER_A enable sysref success
    success: TALISE_enableSysrefToFramer() TAL_FRAMER_B enable sysref success
    success: TALISE_enableSysrefToFramer() TAL_DEFRAMER_A enable sysref success
    success: axi_jesd204_rx_lane_clk_enable() rx.rxChannels != TAL_RXOFF
    success: axi_jesd204_rx_lane_clk_enable() obsRxChannelsEnable != TAL_ORXOFF
    success: axi_jesd204_tx_lane_clk_enable() txChannels != TAL_TXOFF
    success: TALISE_enableTrackingCals() success,tackingCalMask is:243
    success: ALL PLL is locked!!
    TALISE_getRadioState is : 3
    taliseTxQecStatus_t_val errorCode is : 0
    taliseTxQecStatus_t_val correctionMetric is : 0
    taliseTxQecStatus_t_val iterCount is : 0
    taliseTxQecStatus_t_val percentComplete is : 64
    taliseTxQecStatus_t_val updateCount is : 0
    ADRV9009 Configured with Success

    --------- adrv9009 configured done ! ---------

    I have obtained the QEC status, please help me analyze it!Also, I've turned on LOL, but it's not working.

  • errorCode is 0: which means no error code is generated during the calibration process, which is normal.

    percentComplete ranges from 0 to 100 and is used to indicate the calibration progress. Obviously, 64 means that the calibration was not successful.

    iterCount and updateCount indicate the number of times the calibration was completed and the number of times the calibration was updated to the hardware, respectively. Obviously, the calibration was not successful, and the feedback values ​​of both items are 0.

    correctionMetric is a parameter related to calibration performance. The lower the calibration effect, the better. Therefore, you did not successfully perform the calibration operation.

    The following is the correct calibration status obtained after performing QEC initialization calibration and tracking calibration, for your reference:

    Please note that the Tracking calibration should be run after the transceiver channel is running normally, and the API should be used to check whether the calibration is successful.