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; }