Post Go back to editing

ADRV9008-2 at 491.52MSPS cannot set RF frequency below 280MHZ

Thread Summary

The user encountered initialization calibration errors with the ADRV9008-2 at 270 MHz RF frequency, despite the device supporting lower frequencies. The error was resolved by setting the RF frequency to 300 MHz and then changing it to 246 MHz after the TALISE_runInitCals call. The issue persists with lower sampling rates and bandwidths, suggesting a potential problem with the chip API or configuration. The user also noted that the S11 response and ORX termination did not affect the error.
AI Generated Content
Category: Software
Product Number: ADRV9008-2

I'm using ADRV9008-2 at 491.52 MSPS for TX and ORX.
I'm working on ZCU102 + ADRV9008-2 W/PCBZ boards, with no-OS firmware.
This is workink fine if I set the RF frequency to 280MHz and above.
If I set the RF frequency at 270MHz I get this consle output:

Zynq MP First Stage Boot Loader

Release 2023.2 Jun 18 2025 - 07:00:25
PMU-FW is not running, certain applications may not be supported.

Hello
tx_clkgen: MMCM-PLL locked (245760000 Hz)
rx_os_clkgen: MMCM-PLL locked (245760000 Hz)
tx_adxcvr: OK (9830400 kHz)
rx_os_adxcvr: OK (9830400 kHz)
talise: Device Revision 192, Firmware 6.2.1, API 3.6.2.4294967297
ERROR: 294: TALISE_waitArmCmdStatus() failed due to thrown ARM error. Is device in correct state for calling command?
ERROR: 131086: Talise init calibration error encountered
error: TALISE_waitInitCals() failed
Bye

This is strange because I think that in my case it must be possible to have a RF frequency down to 245.76MHz.
Actually if I try to set an RF frequency below this value I get a message tha the RF frequency is too low.

I use this talise_config.c file:

/**
 * \file talise_config.c
 * \brief Contains Talise configuration settings for the Talise API
 *
 * Copyright 2015-2017 Analog Devices Inc.
 * Released under the AD9378-AD9379 API license, for more information see the "LICENSE.txt" file in this zip file.
 *
 * The top level structure taliseDevice_t talDevice uses keyword
 * extern to allow the application layer main() to have visibility
 * to these settings.
 *
 * This file may not be fully complete for the end user application and
 * may need to updated for AGC, GPIO, and DAC full scale settings.
 * To create a full initialisation routine, the user should also refer to the
 * Iron Python initialisation routine generated by the GUI, and also the Talise User Guide.
 *
 */


#include "talise_types.h"

#include "talise_error.h"
#include "talise_agc.h"
#ifdef ADI_ZYNQ_PLATFORM
#include "zynq_platform.h"
#endif
#include "../WorkingProfile/talise_config.h"

int16_t txFirCoefs[20] = {-3, 9, -28, 69, -131, 246, -507, 1182, -2648, 19449, -2648, 1182, -507, 246, -131, 69, -28, 9, -3, 0};

int16_t obsrxFirCoefs[24] = {61, -9, 8, -6, -2, 12, -55, 91, -192, 460, -1719, 19205, -1719, 460, -192, 91, -55, 12, -2, -6, 8, -9, 61, 0};

#ifdef ADI_ZYNQ_PLATFORM /** < Insert Customer Platform HAL State Container here>*/
/*
 * Platform Layer SPI settings - this structure is specific to ADI's platform layer code.
 * User should replace with their own structure or settings for their hardware
 */
zynqSpiSettings_t spiDev1 =
{
	.chipSelectIndex = 1,
	.writeBitPolarity = 0,
	.longInstructionWord = 1,
	.CPHA = 0,
	.CPOL = 0,
	.mode = 0,
	.spiClkFreq_Hz = 25000000
};

/*
 * Platform Layer settings - this structure is specific to ADI's platform layer code.
 * User should replace with their own structure or settings for their hardware
 * The structure is held in taliseDevice_t below as a void pointer, allowing
 * the customer to pass any information for their specific hardware down to the
 * hardware layer code.
 */
zynqAdiDev_t talDevHalInfo =
{
	.devIndex = 1,
	.spiSettings = &spiDev1,
	.spiErrCode = 0,
	.timerErrCode = 0,
	.gpioErrCode = 0,
	.logLevel = ADIHAL_LOG_ALL
};
#endif
/**
 *  TalDevice a structure used by the Talise API to hold the platform hardware
 *  structure information, as well as an internal Talise API state container
 *  (devStateInfo) of runtime information used by the API.
 **/
taliseDevice_t talDevice =
{
#ifdef ADI_ZYNQ_PLATFORM
    /* Void pointer of users platform HAL settings to pass to HAL layer calls
     * Talise API does not use the devHalInfo member */
	.devHalInfo = &talDevHalInfo,
#else
	.devHalInfo = NULL,     /*/** < Insert Customer Platform HAL State Container here>*/
#endif
	/* devStateInfo is maintained internal to the Talise API, just create the memory */
	.devStateInfo = {0}

};

taliseInit_t talInit =
{
	/* SPI settings */
    .spiSettings =
    {
		.MSBFirst            = 1,  /* 1 = MSBFirst, 0 = LSBFirst */
		.enSpiStreaming      = 0,  /* Not implemented in ADIs platform layer. SW feature to improve SPI throughput */
		.autoIncAddrUp       = 1,  /* Not implemented in ADIs platform layer. For SPI Streaming, set address increment direction. 1= next addr = addr+1, 0:addr=addr-1 */
		.fourWireMode        = 1,  /* 1: Use 4-wire SPI, 0: 3-wire SPI (SDIO pin is bidirectional). NOTE: ADI's FPGA platform always uses 4-wire mode */
		.cmosPadDrvStrength  = TAL_CMOSPAD_DRV_2X /* Drive strength of CMOS pads when used as outputs (SDIO, SDO, GP_INTERRUPT, GPIO 1, GPIO 0) */
	},

    /* Tx settings */
    .tx =
    {
        .txProfile =
        {
            .dacDiv = 1,                        /* The divider used to generate the DAC clock */
            .txFir =
            {
                .gain_dB = 0,                        /* filter gain */
                .numFirCoefs = 20,                    /* number of coefficients in the FIR filter */
                .coefs = &txFirCoefs[0]
            },
            .txFirInterpolation = 1,                    /* The Tx digital FIR filter interpolation (1,2,4) */
            .thb1Interpolation = 2,                    /* Tx Halfband1 filter interpolation (1,2) */
            .thb2Interpolation = 2,                    /* Tx Halfband2 filter interpolation (1,2)*/
            .thb3Interpolation = 1,                    /* Tx Halfband3 filter interpolation (1,2)*/
            .txInt5Interpolation = 1,                    /* Tx Int5 filter interpolation (1,5) */
            .txInputRate_kHz = 491520,                    /* Primary Signal BW */
            .primarySigBandwidth_Hz = 200000000,    /* The Rx RF passband bandwidth for the profile */
            .rfBandwidth_Hz = 450000000,            /* The Tx RF passband bandwidth for the profile */
            .txDac3dBCorner_kHz = 450000,                /* The DAC filter 3dB corner in kHz */
            .txBbf3dBCorner_kHz = 225000,                /* The BBF 3dB corner in kHz */
            .loopBackAdcProfile = {150, 178, 181, 90, 1280, 1338, 1699, 493, 1386, 162, 934, 4, 48, 46, 35, 201, 0, 0, 0, 0, 50, 0, 0, 6, 24, 0, 0, 6, 24, 0, 25, 27, 0, 0, 25, 27, 0, 0, 165, 44, 15, 905}
        },
        .deframerSel = TAL_DEFRAMER_A,                    /* Talise JESD204b deframer config for the Tx data path */
        .txChannels = TAL_TX1TX2,                            /* The desired Tx channels to enable during initialization */
        .txAttenStepSize = TAL_TXATTEN_0P05_DB,            /* Tx Attenuation step size */
        .tx1Atten_mdB = 0,                            /* Initial Tx1 Attenuation */
        .tx2Atten_mdB = 0,                            /* Initial Tx2 Attenuation */
        .disTxDataIfPllUnlock = TAL_TXDIS_TX_RAMP_DOWN_TO_ZERO    /* Options to disable the transmit data when the RFPLL unlocks. */
    },


    /* ObsRx settings */
    .obsRx =
    {
        .orxProfile =
        {
            .rxFir =
            {
                .gain_dB = -6,                /* filter gain */
                .numFirCoefs = 24,            /* number of coefficients in the FIR filter */
                .coefs = &obsrxFirCoefs[0]
            },
            .rxFirDecimation = 1,            /* Rx FIR decimation (1,2,4) */
            .rxDec5Decimation = 4,            /* Decimation of Dec5 or Dec4 filter (5,4) */
            .rhb1Decimation = 1,            /* RX Half band 1 decimation (1 or 2) */
            .orxOutputRate_kHz = 491520,            /* Rx IQ data rate in kHz */
            .rfBandwidth_Hz = 450000000,    /* The Rx RF passband bandwidth for the profile */
            .rxBbf3dBCorner_kHz = 225000,    /* Rx BBF 3dB corner in kHz */
            .orxLowPassAdcProfile = {155, 163, 181, 90, 1280, 1254, 1572, 340, 1431, 142, 973, 8, 48, 47, 36, 205, 0, 0, 0, 0, 51, 0, 0, 6, 24, 0, 0, 6, 24, 0, 25, 27, 0, 0, 25, 27, 0, 0, 165, 44, 15, 905},
            .orxBandPassAdcProfile = {124, 131, 154, 90, 1280, 2779, 1986, 0, 1037, 839, 988, 109, 11, 15, 28, 179, 0, 0, 0, 0, 45, 0, 0, 0, 24, 0, 0, 0, 24, 0, 25, 27, 0, 0, 25, 27, 0, 0, 165, 44, 15, 905},
            .orxDdcMode = TAL_ORXDDC_DISABLED,   /* ORx DDC mode */
            .orxMergeFilter  = {-167, 419, -208, -498, 968, -320, -1273, 2154, -402, -4155, 9170, 21413}
        },
        .orxGainCtrl =
        {
            .gainMode = TAL_MGC,
            .orx1GainIndex = 255,
            .orx2GainIndex = 255,
            .orx1MaxGainIndex = 255,
            .orx1MinGainIndex = 195,
            .orx2MaxGainIndex = 255,
            .orx2MinGainIndex = 195
        },
        .framerSel = TAL_FRAMER_B,                /* ObsRx JESD204b framer configuration */
        .obsRxChannelsEnable = TAL_ORX1,        /* The desired ObsRx Channels to enable during initialization */
        .obsRxLoSource = TAL_OBSLO_RF_PLL                /* The ORx mixers can use the TX_PLL */
    },

    /* Digital Clock Settings */
    .clocks =
    {
        .deviceClock_kHz = 245760,            /* CLKPLL and device reference clock frequency in kHz */
        .clkPllVcoFreq_kHz = 9830400,        /* CLKPLL VCO frequency in kHz */
        .clkPllHsDiv = TAL_HSDIV_2P5,            /* CLKPLL high speed clock divider */
        .rfPllUseExternalLo = 0,                /* 1= Use external LO for RF PLL, 0 = use internal LO generation for RF PLL */
        .rfPllPhaseSyncMode = TAL_RFPLLMCS_INIT_AND_CONTTRACK                /* RFPLL MCS (Phase sync) mode */
    },

    /* JESD204B settings */
    .jesd204Settings =
    {
        /* Framer B settings */
        .framerB =
        {
            .bankId = 0,                    /* JESD204B Configuration Bank ID -extension to Device ID (Valid 0..15) */
            .deviceId = 0,                    /* JESD204B Configuration Device ID - link identification number. (Valid 0..255) */
            .lane0Id = 0,                    /* JESD204B Configuration starting Lane ID.  If more than one lane used, each lane will increment from the Lane0 ID. (Valid 0..31) */
            .M = 2,                            /* number of ADCs (0, 2, or 4) - 2 ADCs per receive chain */
            .K = 32,                        /* number of frames in a multiframe (default=32), F*K must be a multiple of 4. (F=2*M/numberOfLanes) */
            .F = 2,                            /* F (number of bytes per frame) */
            .Np = 16,                            /* Np (converter sample resolution) */
            .scramble = 1,                    /* scrambling off if framerScramble= 0, if framerScramble>0 scramble is enabled. */
            .externalSysref = 1,            /* 0=use internal SYSREF, 1= use external SYSREF */
            .serializerLanesEnabled = 0x0C,    /* serializerLanesEnabled - bit per lane, [0] = Lane0 enabled, [1] = Lane1 enabled */
            .serializerLaneCrossbar = 0xE4,    /* serializerLaneCrossbar */
            .lmfcOffset = 31,                /* lmfcOffset - LMFC offset value for deterministic latency setting */
            .newSysrefOnRelink = 0,            /* newSysrefOnRelink */
            .syncbInSelect = 1,                /* syncbInSelect; */
            .overSample = 0,                    /* 1=overSample, 0=bitRepeat */
            .syncbInLvdsMode = 1,
            .syncbInLvdsPnInvert = 0,
            .enableManualLaneXbar = 0 /* 0=auto, 1=manual */
        },
        /* Framer A settings */
        .framerA =
        {
            .bankId = 0,                    /* JESD204B Configuration Bank ID -extension to Device ID (Valid 0..15) */
            .deviceId = 0,                    /* JESD204B Configuration Device ID - link identification number. (Valid 0..255) */
            .lane0Id = 0,                    /* JESD204B Configuration starting Lane ID.  If more than one lane used, each lane will increment from the Lane0 ID. (Valid 0..31) */
            .M = 2,                            /* number of ADCs (0, 2, or 4) - 2 ADCs per receive chain */
            .K = 32,                        /* number of frames in a multiframe (default=32), F*K must be a multiple of 4. (F=2*M/numberOfLanes) */
            .F = 0,                            /* F (number of bytes per frame) */
            .Np = 16,                            /* Np (converter sample resolution) */
            .scramble = 1,                    /* scrambling off if framerScramble= 0, if framerScramble>0 scramble is enabled. */
            .externalSysref = 1,            /* 0=use internal SYSREF, 1= use external SYSREF */
            .serializerLanesEnabled = 0x03,    /* serializerLanesEnabled - bit per lane, [0] = Lane0 enabled, [1] = Lane1 enabled */
            .serializerLaneCrossbar = 0xE4,    /* serializerLaneCrossbar */
            .lmfcOffset = 31,                /* lmfcOffset - LMFC offset value for deterministic latency setting */
            .newSysrefOnRelink = 0,            /* newSysrefOnRelink */
            .syncbInSelect = 1,                /* syncbInSelect; */
            .overSample = 0,                    /* 1=overSample, 0=bitRepeat */
            .syncbInLvdsMode = 1,
            .syncbInLvdsPnInvert = 0,
            .enableManualLaneXbar = 0 /* 0=auto, 1=manual */
        },
        /* Deframer A settings */
        .deframerA =
        {
            .bankId = 0,                    /* bankId extension to Device ID (Valid 0..15) */
            .deviceId = 0,                    /* deviceId  link identification number. (Valid 0..255) */
            .lane0Id = 0,                    /* lane0Id Lane0 ID. (Valid 0..31) */
            .M = 4,                            /* M  number of DACss (0, 2, or 4) - 2 DACs per transmit chain */
            .K = 32,                        /* K  #frames in a multiframe (default=32), F*K=multiple of 4. (F=2*M/numberOfLanes) */
            .scramble = 1,                    /* scramble  scrambling off if scramble= 0 */
            .externalSysref = 1,            /* externalSysref  0= use internal SYSREF, 1= external SYSREF */
            .deserializerLanesEnabled = 0x0F,    /* deserializerLanesEnabled  bit per lane, [0] = Lane0 enabled */
            .deserializerLaneCrossbar = 0xE4,    /* deserializerLaneCrossbar */
            .lmfcOffset = 17,                /* lmfcOffset	 LMFC offset value to adjust deterministic latency */
            .newSysrefOnRelink = 0,            /* newSysrefOnRelink */
            .syncbOutSelect = 0,                /* SYNCBOUT0/1 select */
            .Np = 16,                /* Np (converter sample resolution) */
            .syncbOutLvdsMode = 1,
            .syncbOutLvdsPnInvert = 0,
            .syncbOutCmosSlewRate = 0,
            .syncbOutCmosDriveLevel = 0,
            .enableManualLaneXbar = 0 /* 0=auto, 1=manual */
        },
        /* Deframer B settings */
        .deframerB =
        {
            .bankId = 0,                    /* bankId extension to Device ID (Valid 0..15) */
            .deviceId = 0,                    /* deviceId  link identification number. (Valid 0..255) */
            .lane0Id = 0,                    /* lane0Id Lane0 ID. (Valid 0..31) */
            .M = 0,                            /* M  number of DACss (0, 2, or 4) - 2 DACs per transmit chain */
            .K = 32,                        /* K  #frames in a multiframe (default=32), F*K=multiple of 4. (F=2*M/numberOfLanes) */
            .scramble = 1,                    /* scramble  scrambling off if scramble= 0 */
            .externalSysref = 1,            /* externalSysref  0= use internal SYSREF, 1= external SYSREF */
            .deserializerLanesEnabled = 0x00,    /* deserializerLanesEnabled  bit per lane, [0] = Lane0 enabled */
            .deserializerLaneCrossbar = 0xE4,    /* deserializerLaneCrossbar */
            .lmfcOffset = 0,                /* lmfcOffset	 LMFC offset value to adjust deterministic latency */
            .newSysrefOnRelink = 0,            /* newSysrefOnRelink */
            .syncbOutSelect = 1,                /* SYNCBOUT0/1 select */
            .Np = 16,                /* Np (converter sample resolution) */
            .syncbOutLvdsMode = 1,
            .syncbOutLvdsPnInvert = 0,
            .syncbOutCmosSlewRate = 0,
            .syncbOutCmosDriveLevel = 0,
            .enableManualLaneXbar = 0 /* 0=auto, 1=manual */
        },
        .serAmplitude = 15,                    /* Serializer amplitude setting. Default = 15. Range is 0..15 */
        .serPreEmphasis = 1,                /* Serializer pre-emphasis setting. Default = 1 Range is 0..4 */
        .serInvertLanePolarity = 0,            /* Serializer Lane PN inversion select. Default = 0. Where, bit[0] = 1 will invert lane [0], bit[1] = 1 will invert lane 1, etc. */
        .desInvertLanePolarity = 0,            /* Deserializer Lane PN inversion select.  bit[0] = 1 Invert PN of Lane 0, bit[1] = Invert PN of Lane 1, etc */
        .desEqSetting = 1,                    /* Deserializer Equalizer setting. Applied to all deserializer lanes. Range is 0..4 */
        .sysrefLvdsMode = 1,                /* Use LVDS inputs on Talise for SYSREF */
        .sysrefLvdsPnInvert = 0              /*0= Do not PN invert SYSREF */
    }
};

//Only needs to be called if user wants to setup AGC parameters
static taliseAgcCfg_t rxAgcCtrl =
{
    4,
    255,
    195,
    255,
    195,
    30720,  /* AGC gain update time in us (125us-250us - based on IQ data rate - set for 125us @ 245.76 Mhz) */
    10,
    10,
    16,
    0,
    1,
    0,
    0,
    0,
    1,
    31,
    246,
    4,
    1,          /*!<1- bit field to enable the multiple time constants in AGC loop for fast attack and fast recovery to max gain. */
    /* agcPower */
    {
        1,      /*!<1-bit field, enables the Rx power measurement block. */
        1,      /*!<1-bit field, allows using Rx PFIR for power measurement. */
        0,      /*!<1-bit field, allows to use the output of the second digital offset block in the Rx datapath for power measurement. */
        9,      /*!<AGC power measurement detect lower 0 threshold. Default = -12dBFS == 5, 7-bit register value where max = 0x7F, min = 0x00 */
        2,      /*!<AGC power measurement detect lower 1 threshold. Default = (offset) 4dB == 0, 4-bit register value where  max = 0xF, min = 0x00 */
        4,      /*!<AGC power measurement detect lower 0 recovery gain step. Default = 2dB - based on gain table step  size, 5-bit register value where max = 0x1F, min = 0x00 */
        4,      /*!<AGC power measurement detect lower 1 recovery gain step. Default = 4dB - based on gain table step size, 5-bit register value where max = 0x1F, min = 0x00 */
        5,      /*!< power measurement duration used by the decimated power block. Default = 0x05, 5-bit register value where max = 0x1F, min = 0x00 */
        5,      /*!<Allows power detection of data for a specific slice of the gain update counter. 16-bit register value (currently not used) */
        1,      /*!<Allows power detection of data for a specific slice of the gain update counter. 16-bit register value (currently not used) */
        5,      /*!<Allows power detection of data for a specific slice of the gain update counter. 16-bit register value (currently not used) */
        1,      /*!<Allows power detection of data for a specific slice of the gain update counter. 16-bit register value (currently not used) */
        2,      /*!<Default value should be 2*/
        0,
        0
    },
    /* agcPeak */
    {
        205,        /*!<1st update interval for the multiple time constant in AGC loop mode, Default:205. */
        2,          /*!<sets the 2nd update interval for the multiple time constant in AGC loop mode. Calculated as a multiple of  agcUnderRangeLowInterval  , Default: 4 */
        4,          /*!<sets the 3rd update interval for the multiple time constant in AGC loop mode. Calculated as a multiple of agcUnderRangeMidInterval and agcUnderRangeLowInterval, Default: 4 */
        39,         /*!<AGC APD high threshold. Default=0x1F, 6-bit register value where max=0x3F, min =0x00 */
        49,         /*!<AGC APD peak detect high threshold. default = 0x1F, 6-bit register value where max = 0x3F, min = 0x00.  Set to 3dB below apdHighThresh */
        23,         /*!<AGC APD peak detect low threshold. default = 3dB below high threshold, 6-bit register value where max =0x3F, min = 0x00 */
        19,         /*!<AGC APD peak detect low threshold. default = 3dB below high threshold, 6-bit register value where max = 0x3F, min = 0x00 . Set to 3dB below apdLowThresh  */
        6,          /*!<AGC APD peak detect upper threshold count. Default = 0x06 8-bit register value where max = 0xFF, min = 0x20  */
        3,          /*!<AGC APD peak detect lower threshold count. Default = 0x03, 8-bit register value where max = 0xFF, min = 0x00  */
        4,          /*!<AGC APD peak detect attack gain step. Default = 2dB step - based on gain table step size, 5-bit register  value, where max = 0x1F, min = 0x00  */
        2,          /*!<AGC APD gain index step size. Recommended to be same as hb2GainStepRecovery. Default = 0x00, 5-bit register value where max = 0x1F, min = 0x00  */
        1,          /*!<1-bit field, enables or disables the HB2 overload detector.  */
        1,          /*!<3-bit field. Sets the window of clock cycles (at the HB2 output rate) to meet the overload count. */
        1,          /*!<4-bit field. Sets the number of actual overloads required to trigger the overload signal.  */
        181,        /*!<AGC decimator output high threshold. Default = 0xB5, 8-bit register value where max = 0xFF, min = 0x00 */
        45,         /*!<AGC decimator output low threshold. Default = 0x80, 8-bit register value where max = 0xFF, min = 0x00 */
        90,         /*!<AGC decimator output low threshold. Default = 0x80, 8-bit register value where max = 0xFF, min = 0x00 */
        128,        /*!<AGC decimator output low threshold. Default = 0x80, 8-bit register value where max = 0xFF, min = 0x00 */
        6,          /*!<AGC HB2 output upper threshold count. Default = 0x06, 8-bit register value where max = 0xFF, min =  0x20 */
        3,          /*!<AGC HB2 output lower threshold count. Default = 0x03, 8-bit register value where max = 0xFF, min = 0x00 */
        2,          /*!<AGC decimator gain index step size. Default = 0x00, 5-bit register value where max = 0x1F, min = 0x00 */
        4,          /*!<AGC HB2 gain index step size, when the HB2 Low Overrange interval 0 triggers a programmable number  of times. Default = 0x08, 5-bit register value where max = 0x1F, min = 0x00 */
        8,          /*!<AGC HB2 gain index step size, when the HB2 Low Overrange interval 1 triggers a programmable number of times. Default = 0x04, 5-bit register value where max = 0x1F, min = 0x00 */
        4,          /*!<AGC decimator output attack gain step. Default = 2dB step - based on gain table step size, 5-bit register value, where max = 0x1F, min = 0x00 */
        1,
        0,
        0
    }
};

Any suggestion?

Thasnk you
Maurizio Sonzogni

Thread Notes

  • Hi, Any chance you still have the Linux SD Card to try to make this change there and see if it gives the same result ? If there is a bug, this would at least tell us if it's a bug manifesting in no-OS projects or in Linux projects or both. If it's both, it could be in the adrv9008 API.

  • Hi buha,

    there is the same problem if I use the talise_config.c file for 122.88MSPS provided in the no-OS project: in this case the problem arises when I try to go below 90MHz.

    I'll try to find the original SD card and make the same test with it, but it's strange that this test wasn't done by the developers.

    Thank you

    Maurizio Sonzogni

  • Hi buha,

    I've made the test with original Linux SD Card and the ADRV9009 Transceiver Evaluation Software.

    I got the same problem: at 280MHz center frequency it's all OK and at 270MHz center frequency I got an error.

    This is the configuration of the TES program:

    and this is the error window:

    This is the log file:

    import clr
    import System
    import time
    clr.AddReferenceToFileAndPath("C:\\Program Files (x86)\\Analog Devices\\ADRV9009 Transceiver Evaluation Software\\AdiCmdServerClient.dll")
    from AdiCmdServerClient import AdiCommandServerClient
    from AdiCmdServerClient import Talise
    from AdiCmdServerClient import FpgaTalise
    from AdiCmdServerClient import FpgaTddGpioConfig
    from AdiCmdServerClient import TaliseArmGpioConfig
    from AdiCmdServerClient import DacSampleXbar
    from AdiCmdServerClient import TaliseRxDataFormat
    from AdiCmdServerClient import GpioSel
    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.10.185", 55555)
    #Read the Version
    print Link.Version()
    
    ##################################################
    # # GUI Version: 3.6.2.1		DLL Version: 3.6.2.1	FPGA Version: 4E00021A	ArmVersion: 6.2.1 Build type = TAL_ARM_BUILD_RELEASE	StreamVersion: 2.17
    ##################################################
    Link.FpgaTalise.StopTxData()
    Link.Ad9528.InitDeviceDataStructure(122880000, 30720000, 122880000)
    Link.Ad9528.ResetDevice()
    Link.Ad9528.Initialize()
    time.sleep(0.5)
    arePllsLocked = Link.Ad9528.WaitForPllLock()
    print 'Ad9528 arePllsLocked =', hex(arePllsLocked)
    
    Link.Ad9528.EnableClockOutputs(0x300A)
    Link.FpgaRead(0x24)
    Link.SetSpiChannel(1)
    Link.FpgaTalise.ResetFpgaRegisters()
    Link.FpgaTalise.ResetFpgaIp(FpgaTalise.FpgaResets.ClearAllRst)
    
    ##################################################
    # Init Structures
    ##################################################
    Link.Talise.InitClearProfiles()
    Link.Talise.InitClocks(1, 122880, 9830400, 2, Talise.HsDiv.HsDiv2p5)
    Link.Talise.InitRfPllUseExternalLo(1, 0)
    Link.Talise.InitTxProfiles(1, 1, 1, 2, 2, 1, 1, 491520, 200000000, 450000000, 450000, 225000, Array[System.Int16]([150, 178, 181, 90, 1280, 1338, 1699, 493, 1386, 162, 934, 4, 48, 46, 35, 201, 0, 0, 0, 0, 50, 0, 0, 6, 24, 0, 0, 6, 24, 0, 25, 27, 0, 0, 25, 27, 0, 0, 165, 44, 15, 905]))
    Link.Talise.InitFirFilters(1, Talise.FilterName.Tx, "C:\\Program Files (x86)\\Analog Devices\\ADRV9009 Transceiver Evaluation Software\\Resources\\DigitalFilters\\TxPFIRApp116_IR491p52_BW450_PriSigBW200.ftr")
    Link.Talise.InitTxSettings(1, Talise.TxAttenStepSize.TxAtten0P05DB, Talise.TxChannel.Tx1, 20000, 0, Talise.DeframerSelect.DeframerA, Talise.TxDataIfPllUnlock.TxRampedDownToZero)
    Link.Talise.InitObsProfiles(1, 1, 4, 1, 491520, 450000000, 225000, Array[System.Int16]([155, 163, 181, 90, 1280, 1254, 1572, 340, 1431, 142, 973, 8, 48, 47, 36, 205, 0, 0, 0, 0, 51, 0, 0, 6, 24, 0, 0, 6, 24, 0, 25, 27, 0, 0, 25, 27, 0, 0, 165, 44, 15, 905]),Array[System.Int16]([124, 131, 154, 90, 1280, 2779, 1986, 0, 1037, 839, 988, 109, 11, 15, 28, 179, 0, 0, 0, 0, 45, 0, 0, 0, 24, 0, 0, 0, 24, 0, 25, 27, 0, 0, 25, 27, 0, 0, 165, 44, 15, 905]),Talise.OrxDdcMode.OrxDdcDisabled, Array[System.Int16]([-167, 419, -208, -498, 968, -320, -1273, 2154, -402, -4155, 9170, 21413]))
    Link.Talise.InitFirFilters(1, Talise.FilterName.ORx, "C:\\Program Files (x86)\\Analog Devices\\ADRV9009 Transceiver Evaluation Software\\Resources\\DigitalFilters\\ORxPFIRApp314_BW450_ADC1966p08_OR491p52.ftr")
    Link.Talise.InitObsRxSettings(1, Talise.ObsRxChannel.ObsRx1, Talise.ObsRxLoSource.RfPll, Talise.FramerSelect.FramerA)
    Link.Talise.InitRfPllEnablePhaseSync(1, Talise.RfPllMcs.NoSync)
    Link.Talise.InitRxNcoShiftCfg(1, 0, 0, 0, 0, 0, 0, 0, 0)
    
    ##################################################
    # Init Jesd
    ##################################################
    Link.Talise.InitJesd204bFramer(1, Talise.FramerSelect.FramerA, 0, 0, 0, 2, 32, 2, 16, 1, 1, 3, 228, 31, 0, 0, 0, 1, 0, 0)
    Link.FpgaTalise.SetupTxConvXbar(FpgaTalise.FpgaFramerSelect.FramerA, 0xE4)
    Link.FpgaTalise.SetupTxConvXbar(FpgaTalise.FpgaFramerSelect.FramerB, 0xE4)
    Link.GetPcbDescript()
    Link.Talise.InitJesd204bDeframer(1, Talise.DeframerSelect.DeframerA, 0, 0, 0, 2, 32, 1, 1, 3, 228, 17, 0, 0, 16, 1, 0, 0, 0, 0)
    Link.FpgaTalise.ResetFpgaIp(FpgaTalise.FpgaResets.TxJesdRst)
    time.sleep(0.5)
    Link.FpgaTalise.ResetFpgaIp(FpgaTalise.FpgaResets.ClearAllRst)
    Link.FpgaTalise.SetupJesd204(122880, 0, 0, 0, 32, 1, 0, 0, 491520, 2, 3, 32, 1, 16, 491520, 2, 3, 32, 1, 1, 16, FpgaTalise.FpgaFramerSelect.FramerA, FpgaTalise.FpgaDeframerSelect.DeframerA, FpgaTalise.FpgaDeframerSelect.DeframerA, False)
    Link.FpgaRead(0x400)
    Link.FpgaWrite(0x400, 0xF80020F)
    Link.FpgaRead(0x408)
    Link.FpgaWrite(0x408, 0xF)
    Link.FpgaRead(0x400)
    Link.FpgaWrite(0x400, 0xF80020F)
    Link.FpgaRead(0x408)
    Link.FpgaWrite(0x408, 0xF)
    Link.FpgaTalise.SetupJesd204bDeserializer(1, 0)
    
    ##################################################
    # Program Talise
    ##################################################
    Link.Talise.ResetDevice()
    Link.Talise.Initialize()
    Link.Talise.SetDacFullScale(Talise.DacFullScale.DacFs0dB)
    pllStatus = Link.Talise.GetPllsLockStatus()
    print 'Talise pllStatus =', hex(pllStatus)
    Link.Talise.EnableMultichipSync(0x1, 0x0)
    Link.Ad9528.RequestSysref(1)
    Link.Ad9528.RequestSysref(1)
    Link.Ad9528.RequestSysref(1)
    time.sleep(0.1)
    mcsStatus = Link.Talise.EnableMultichipSync(0x0, 0x0)
    print 'MCS Status = ', hex(mcsStatus)
    
    Link.FpgaTalise.SetupJesd204bOversampler(FpgaTalise.FpgaDeframerSelect.DeframerB, FpgaTalise.FpgaSampleDecimation.DecimateBy1)
    Link.SetLogLevel(0)
    if pllStatus & 0x01:
    	Link.Talise.InitArm()
    	Link.Talise.LoadStreamProcessor("C:\\Users\\Maurizio\\AppData\\Local\\Temp\\TaliseStream.bin")
    	Link.Talise.LoadArm("C:\\Program Files (x86)\\Analog Devices\\ADRV9009 Transceiver Evaluation Software\\Resources\\arm_firmware\\TaliseTxArmFirmware.bin")
    	isArmGood = Link.Talise.VerifyArmChecksum()
    	print 'isArmGood =', hex(isArmGood)
    	if isArmGood & 1:
    		print "ARM Loaded Successfully"
    	else:
    		print "ARM File not loaded correctly"
    else:
    	print "pll Lock Status is Incorrect"
    Link.Talise.GetArmVersion()
    Link.SetLogLevel(63)
    Link.Talise.SetPllLoopFilter(Talise.PllName.RfPll, 50, 3)
    Link.Talise.SetRfPllFrequency(Talise.PllName.RfPll, 270000000)
    pllStatus = Link.Talise.GetPllsLockStatus()
    print 'Talise pllStatus =', hex(pllStatus)
    
    ##################################################
    # InitCals
    ##################################################
    Link.Talise.AbortInitCals(0)
    #initCalMask = 0
    #initCalMask |= int(Link.Talise.CalMask.TxBaseBandFilter)
    #initCalMask |= int(Link.Talise.CalMask.AdcTuner)
    #initCalMask |= int(Link.Talise.CalMask.Tia3dBCorner)
    #initCalMask |= int(Link.Talise.CalMask.DcOffset)
    #initCalMask |= int(Link.Talise.CalMask.FlashCal)
    #initCalMask |= int(Link.Talise.CalMask.PathDelay)
    #initCalMask |= int(Link.Talise.CalMask.TxLoLeakageInternal)
    #initCalMask |= int(Link.Talise.CalMask.TxQecInit)
    #initCalMask |= int(Link.Talise.CalMask.LoopbackRxLoDelay)
    #initCalMask |= int(Link.Talise.CalMask.LoopbackRxRxQecInit)
    #initCalMask |= int(Link.Talise.CalMask.RxQecInit)
    #initCalMask |= int(Link.Talise.CalMask.ORxQecInit)
    #initCalMask |= int(Link.Talise.CalMask.TxDac)
    #initCalMask |= int(Link.Talise.CalMask.AdcStitching)
    Link.Talise.RunInitCals(0xE5DCF)
    Link.Talise.WaitInitCals(60000, 0)
    Link.Talise.GetInitCalStatus()
    
    ##################################################
    # Disconnect from the Zynq
    ##################################################
    if(Connect == 1):
    	Link.hw.Disconnect()
    

    and this is the error log file:

    2025-06-25 11:38:25,380  FATAL AdiCmdServerClient.Logging  - Initialization calibration timed out with an error: 7, ERROR: 131086, Talise init calibration error encountered
    
    
    2025-06-25 11:38:25,380  FATAL AdiCmdServerClient.Logging  - AdiCmdServerClient.InvalidRespException: Initialization calibration timed out with an error: 7, ERROR: 131086, Talise init calibration error encountered
    
    
       at TaliseApiCommands.Api.API_WaitInitCals()
       at TaliseApiCommands.Api.API_InitCals(UInt32 initCalMask)
    2025-06-25 11:38:25,380  FATAL AdiCmdServerClient.Logging  - AdiCmdServerClient.InvalidRespException: Initialization calibration timed out with an error: 7, ERROR: 131086, Talise init calibration error encountered
    
    
       at TaliseApiCommands.Api.API_InitCals(UInt32 initCalMask)
       at Analog.Views.ConfigPages.initCals()
    2025-06-25 11:38:25,380  FATAL AdiCmdServerClient.Logging  - ERROR: initErrCal=17, initErrCode=3, initErrMsg=ORxQEC Init Cal: Error configuring Cal PLL
    
    2025-06-25 11:38:25,380  FATAL AdiCmdServerClient.Logging  - AdiCmdServerClient.InvalidRespException: ERROR: initErrCal=17, initErrCode=3, initErrMsg=ORxQEC Init Cal: Error configuring Cal PLL
    
       at AdiCmdServerClient.Talise.GetInitCalStatus(UInt32& calsSincePowerUp, UInt32& calsLastRun, UInt32& calsMinimum, Byte& initErrCal, Byte& initErrCode)
       at TaliseApiCommands.Api.API_GetInitCals()
    2025-06-25 11:38:27,405  FATAL AdiCmdServerClient.Logging  - System.InvalidOperationException: Initialization calibration timed out with an error: 7, ERROR: 131086, Talise init calibration error encountered
    
    
       at Analog.Views.ConfigPages.initCals()
       at Analog.Views.ConfigPages.bgw_DoWork(Object sender, DoWorkEventArgs e)
    

    If I set a very low center frequency (e.g. 100 MHz) I correctly got the error that the RF frequency is too low.

    It is very strange that is not possible to go down to the minimum allowable frequency (Sample frequency / 2).

    Any idea?

    Thank you

    Maurizio

  • Hi,

    any news?

    If can help this is the API call log in the case of reported error:

    Link.FpgaRead(0x30)
    Link.Talise.GetRadioState(0)
    Link.FpgaRead(0x30)
    Link.Talise.GetRadioState(0)
    Link.FpgaRead(0x30)
    Link.Talise.GetRadioState(0)
    Link.Talise.GetRxTxEnable(Talise.RxOrxChannel.RxOff, Talise.TxChannel.TxOff)
    Link.Talise.SetRxTxEnable(Talise.RxOrxChannel.RxOff, Talise.TxChannel.TxOff)
    Link.FpgaTalise.EnableRxDataPaths(FpgaTalise.RxDataPath.Disable)
    Link.FpgaTalise.EnableRxDataPaths(FpgaTalise.RxDataPath.Disable)
    Link.Talise.GetRxTxEnable(Talise.RxOrxChannel.RxOff, Talise.TxChannel.TxOff)
    Link.Talise.SetRxTxEnable(Talise.RxOrxChannel.RxOff, Talise.TxChannel.TxOff)
    Link.Talise.InitObsProfiles(1, 1, 4, 1, 491520, 450000000, 225000, Array[System.Int16]([155, 163, 181, 90, 1280, 1254, 1572, 340, 1431, 142, 973, 8, 48, 47, 36, 205, 0, 0, 0, 0, 51, 0, 0, 6, 24, 0, 0, 6, 24, 0, 25, 27, 0, 0, 25, 27, 0, 0, 165, 44, 15, 905]),Array[System.Int16]([124, 131, 154, 90, 1280, 2779, 1986, 0, 1037, 839, 988, 109, 11, 15, 28, 179, 0, 0, 0, 0, 45, 0, 0, 0, 24, 0, 0, 0, 24, 0, 25, 27, 0, 0, 25, 27, 0, 0, 165, 44, 15, 905]),Talise.OrxDdcMode.OrxDdcDisabled, Array[System.Int16]([-167, 419, -208, -498, 968, -320, -1273, 2154, -402, -4155, 9170, 21413]))
    Link.Talise.InitFirFilters(1, Talise.FilterName.ORx, "C:\\Program Files (x86)\\Analog Devices\\ADRV9009 Transceiver Evaluation Software\\Resources\\DigitalFilters\\ORxPFIRApp314_BW450_ADC1966p08_OR491p52.ftr")
    Link.Talise.InitTxProfiles(1, 1, 1, 2, 2, 1, 1, 491520, 200000000, 450000000, 450000, 225000, Array[System.Int16]([150, 178, 181, 90, 1280, 1338, 1699, 493, 1386, 162, 934, 4, 48, 46, 35, 201, 0, 0, 0, 0, 50, 0, 0, 6, 24, 0, 0, 6, 24, 0, 25, 27, 0, 0, 25, 27, 0, 0, 165, 44, 15, 905]))
    Link.Talise.InitFirFilters(1, Talise.FilterName.Tx, "C:\\Program Files (x86)\\Analog Devices\\ADRV9009 Transceiver Evaluation Software\\Resources\\DigitalFilters\\TxPFIRApp116_IR491p52_BW450_PriSigBW200.ftr")
    Link.FpgaTalise.StopTxData()
    Link.Ad9528.InitDeviceDataStructure(122880000, 30720000, 122880000)
    Link.Ad9528.ResetDevice()
    Link.Ad9528.Initialize()
    Link.Ad9528.WaitForPllLock()
    Link.Ad9528.EnableClockOutputs(0x300A)
    Link.FpgaRead(0x24)
    Link.SetSpiChannel(1)
    Link.FpgaTalise.ResetFpgaRegisters()
    Link.FpgaTalise.ResetFpgaIp(FpgaTalise.FpgaResets.ClearAllRst)
    Link.Talise.InitClearProfiles()
    Link.Talise.InitClocks(1, 122880, 9830400, 2, Talise.HsDiv.HsDiv2p5)
    Link.Talise.InitRfPllUseExternalLo(1, 0)
    Link.Talise.InitTxProfiles(1, 1, 1, 2, 2, 1, 1, 491520, 200000000, 450000000, 450000, 225000, Array[System.Int16]([150, 178, 181, 90, 1280, 1338, 1699, 493, 1386, 162, 934, 4, 48, 46, 35, 201, 0, 0, 0, 0, 50, 0, 0, 6, 24, 0, 0, 6, 24, 0, 25, 27, 0, 0, 25, 27, 0, 0, 165, 44, 15, 905]))
    Link.Talise.InitFirFilters(1, Talise.FilterName.Tx, "C:\\Program Files (x86)\\Analog Devices\\ADRV9009 Transceiver Evaluation Software\\Resources\\DigitalFilters\\TxPFIRApp116_IR491p52_BW450_PriSigBW200.ftr")
    Link.Talise.InitTxSettings(1, Talise.TxAttenStepSize.TxAtten0P05DB, Talise.TxChannel.Tx1, 20000, 0, Talise.DeframerSelect.DeframerA, Talise.TxDataIfPllUnlock.TxRampedDownToZero)
    Link.Talise.InitObsProfiles(1, 1, 4, 1, 491520, 450000000, 225000, Array[System.Int16]([155, 163, 181, 90, 1280, 1254, 1572, 340, 1431, 142, 973, 8, 48, 47, 36, 205, 0, 0, 0, 0, 51, 0, 0, 6, 24, 0, 0, 6, 24, 0, 25, 27, 0, 0, 25, 27, 0, 0, 165, 44, 15, 905]),Array[System.Int16]([124, 131, 154, 90, 1280, 2779, 1986, 0, 1037, 839, 988, 109, 11, 15, 28, 179, 0, 0, 0, 0, 45, 0, 0, 0, 24, 0, 0, 0, 24, 0, 25, 27, 0, 0, 25, 27, 0, 0, 165, 44, 15, 905]),Talise.OrxDdcMode.OrxDdcDisabled, Array[System.Int16]([-167, 419, -208, -498, 968, -320, -1273, 2154, -402, -4155, 9170, 21413]))
    Link.Talise.InitFirFilters(1, Talise.FilterName.ORx, "C:\\Program Files (x86)\\Analog Devices\\ADRV9009 Transceiver Evaluation Software\\Resources\\DigitalFilters\\ORxPFIRApp314_BW450_ADC1966p08_OR491p52.ftr")
    Link.Talise.InitObsRxSettings(1, Talise.ObsRxChannel.ObsRx1, Talise.ObsRxLoSource.RfPll, Talise.FramerSelect.FramerA)
    Link.Talise.InitRfPllEnablePhaseSync(1, Talise.RfPllMcs.NoSync)
    Link.Talise.InitRxNcoShiftCfg(1, 0, 0, 0, 0, 0, 0, 0, 0)
    Link.Talise.InitJesd204bFramer(1, Talise.FramerSelect.FramerA, 0, 0, 0, 2, 32, 2, 16, 1, 1, 3, 228, 31, 0, 0, 0, 1, 0, 0)
    Link.FpgaTalise.SetupTxConvXbar(FpgaTalise.FpgaFramerSelect.FramerA, 0xE4)
    Link.FpgaTalise.SetupTxConvXbar(FpgaTalise.FpgaFramerSelect.FramerB, 0xE4)
    Link.GetPcbDescript()
    Link.Talise.InitJesd204bDeframer(1, Talise.DeframerSelect.DeframerA, 0, 0, 0, 2, 32, 1, 1, 3, 228, 17, 0, 0, 16, 1, 0, 0, 0, 0)
    Link.FpgaTalise.ResetFpgaIp(FpgaTalise.FpgaResets.TxJesdRst)
    Link.FpgaTalise.ResetFpgaIp(FpgaTalise.FpgaResets.ClearAllRst)
    Link.FpgaTalise.SetupJesd204(122880, 0, 0, 0, 32, 1, 0, 0, 491520, 2, 3, 32, 1, 16, 491520, 2, 3, 32, 1, 1, 16, FpgaTalise.FpgaFramerSelect.FramerA, FpgaTalise.FpgaDeframerSelect.DeframerA, FpgaTalise.FpgaDeframerSelect.DeframerA, False)
    Link.FpgaRead(0x400)
    Link.FpgaWrite(0x400, 0xF80020F)
    Link.FpgaRead(0x408)
    Link.FpgaWrite(0x408, 0xF)
    Link.FpgaRead(0x400)
    Link.FpgaWrite(0x400, 0xF80020F)
    Link.FpgaRead(0x408)
    Link.FpgaWrite(0x408, 0xF)
    Link.FpgaTalise.SetupJesd204bDeserializer(1, 0)
    Link.Talise.ResetDevice()
    Link.Talise.Initialize()
    Link.Talise.SetDacFullScale(Talise.DacFullScale.DacFs0dB)
    Link.Talise.GetPllsLockStatus()
    Link.Talise.EnableMultichipSync(0x1, 0x0)
    Link.Ad9528.RequestSysref(1)
    Link.Ad9528.RequestSysref(1)
    Link.Ad9528.RequestSysref(1)
    Link.Talise.EnableMultichipSync(0x0, 0x0)
    Link.FpgaTalise.SetupJesd204bOversampler(FpgaTalise.FpgaDeframerSelect.DeframerB, FpgaTalise.FpgaSampleDecimation.DecimateBy1)
    Link.SetLogLevel(0)
    Link.Talise.InitArm()
    Link.Talise.LoadStreamProcessor("C:\\Users\\Maurizio\\AppData\\Local\\Temp\\TaliseStream.bin")
    Link.Talise.LoadArm("C:\\Program Files (x86)\\Analog Devices\\ADRV9009 Transceiver Evaluation Software\\Resources\\arm_firmware\\TaliseTxArmFirmware.bin")
    Link.Talise.VerifyArmChecksum()
    Link.Talise.GetArmVersion()
    Link.SetLogLevel(63)
    Link.Talise.SetPllLoopFilter(Talise.PllName.RfPll, 50, 3)
    Link.Talise.SetRfPllFrequency(Talise.PllName.RfPll, 270000000)
    Link.Talise.GetPllsLockStatus()
    Link.Talise.AbortInitCals(0)
    Link.Talise.RunInitCals(0xE5DCF)
    Link.Talise.WaitInitCals(60000, 0)
    Link.Talise.GetInitCalStatus()
    Link.FpgaRead(0x30)
    Link.Talise.GetRadioState(0)
    Link.FpgaRead(0x30)
    Link.Talise.GetRadioState(0)
    Link.FpgaRead(0x30)
    Link.Talise.GetRadioState(0)
    Link.FpgaRead(0x30)
    Link.Talise.GetRadioState(0)
    Link.FpgaRead(0x30)
    Link.Talise.GetRadioState(0)
    Link.FpgaRead(0x30)
    Link.Talise.GetRadioState(0)
    Link.FpgaRead(0x30)
    Link.Talise.GetRadioState(0)
    Link.FpgaRead(0x30)
    Link.Talise.GetRadioState(0)
    Link.FpgaRead(0x30)
    Link.Talise.GetRadioState(0)
    Link.FpgaRead(0x30)
    Link.Talise.GetRadioState(0)
    Link.FpgaRead(0x30)
    Link.Talise.GetRadioState(0)
    Link.FpgaRead(0x30)
    Link.Talise.GetRadioState(0)
    Link.FpgaRead(0x30)
    Link.Talise.GetRadioState(0)
    Link.FpgaRead(0x30)
    Link.Talise.GetRadioState(0)
    Link.FpgaRead(0x30)
    Link.Talise.GetRadioState(0)
    Link.FpgaRead(0x30)
    Link.Talise.GetRadioState(0)
    Link.FpgaRead(0x30)
    Link.Talise.GetRadioState(0)
    Link.FpgaRead(0x30)
    Link.Talise.GetRadioState(0)
    Link.FpgaRead(0x30)
    Link.Talise.GetRadioState(0)
    

    Waiting for some update

    Thank you

    Maurizio

  • Thanks for reporting the linux test result. Since it happens on both, I suspect it could be a problem in the chip API which comes from the adrv9009 design group, so I'm moving the thread there for an opinion.

  • Can you try out with a lower sampling rate profile(say 245.76Msps and lower BW of 100MHz) and see if you are still facing the issue?

    In general, QEC cal fails when the matching is not good. 

  • As mentioned above there is the same problem if I use the talise_config.c file for 122.88MSPS provided in the no-OS project: in this case the problem arises when I try to go below 90MHz.

    If I use 245.76Msps and 200 MHz BW in TES I can get it with 150 MHz RF frequency but I got error with 140 MHz RF Frequency.

  • Based on the frequency of operation you wanted to use, can you please try tuning the match of board as per your requirement.

    QEC cal typically fails due to the matching. Can you please repeat the experiment with improved matching?

  • This is the input circuit for the ORX input:

    we have changed C250 from 18pF to 100pF to improve matching at low frequencies, but the behaviour remains the same. The frequency where the problem arises is exactly the same at 1 Hz level: at 272.154999 MHz we have this problem, at 272.145000 Hz we have no problem. 

    In the no-OS environment the error comes from this call in the talise_cals.c file:

    retVal = (talRecoveryActions_t)TALISE_waitArmCmdStatus(device,
                 TALISE_ARM_RUNINIT_OPCODE, &cmdStatusByte, (timeoutMs * TIMEOUT_MS_FACTOR),
                 WAITINITCALS_INTERVAL_US);

    after this call we have:

    retVal = TALACT_ERR_RESET_ARM

    cmdStatusByte = 0x0E

    By the way we have increased the timeout but the error arises immediatly.

    This kind of error does not seem to be due to calibration problerms related to impedance matching, and in any case it seems strange to me that the internal calibration is done without excluding the external circuit.

    Any suggestion?

    Thank you

    Maurizio

  • Can you please try tuning the ORx path using a network analyzer across the BW and frequency of operation and then see if it helps?