Post Go back to editing

ERROR: 247: TALISE_waitArmCmdStatus() failed due to thrown ARM error. ARM time out

Category: Software
Product Number: ADRV9008-1/ADRV9008-2/ADRV9009
Software Version: talise: Device Revision 192, Firmware 6.0.2, API 3.6.0.5

Hi,

I use ZYNQ XCZU7EV and ADRV9009, and use ARM A53 processor to configure ADRV9009. The current state is that SPI works normally and the ADRV9009 can be configured.

But now there is a cal or error with the validation.

"ERROR: 247: TALISE_waitArmCmdStatus() failed due to thrown ARM error. ARM time out"

Sincere regards,

Alan

  • Hi.

    I have provided the source code related to this incident here, in order to be able to accurately troubleshoot the problem.

    /****************************************************/
    	/**** 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");
    		printf("error: TALISE_runInitCals() failed,initCalMask is:%d\n",initCalMask);
    		goto error_11;
    	}
    	printf("success: TALISE_runInitCals() success,initCalMask is:%d\n",initCalMask);
    	no_os_mdelay(200);
    	uint32_t calsSincePowerUp = 0, calsLastRun = 0, calsMinimum = 0;
    	uint8_t initErrCal = 0, initErrCode = 0;
    	talAction = TALISE_getInitCalStatus(pd, &calsSincePowerUp, &calsLastRun, &calsMinimum, &initErrCal, &initErrCode);
    
    	printf("calsSincePowerUp: 0x%x\n", calsSincePowerUp);
    	printf("calsLastRun: 0x%x\n", calsLastRun);
    	printf("calsMinimum: 0x%x\n", calsMinimum);
    	printf("initErrCal: Ox%x\n", initErrCal);
    	printf("initErrCode: 0x%x\n", initErrCode);
    
    	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");
    		printf("error: TALISE_waitInitCals() failed,error Flag is:%d,\n",errorFlag);
    		printf("error: TALISE_waitInitCals() failed,error talAction is:%d,\n",talAction);
    		//goto error_11;
    	}
    	printf("success: TALISE_waitInitCals() success,Flag is:%d\n",errorFlag);
    
    	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");
    	}
    

    uint32_t TALISE_waitInitCals(taliseDevice_t *device, uint32_t timeoutMs,
    			     uint8_t *errorFlag)
    {
    	talRecoveryActions_t retVal = TALACT_NO_ACTION;
    	talRecoveryActions_t retValWarn = TALACT_NO_ACTION;
    	adiHalErr_t halError = ADIHAL_OK;
    	uint8_t cmdStatusByte = 0;
    	uint8_t _errFlag = 0;
    
    	static const uint16_t TIMEOUT_MS_FACTOR = 1000;
    	static const uint32_t CODECHECK_PARAM_WAITINITCALS_ERR = 2;
    
    #if TALISE_VERBOSE
    	halError = talWriteToLog(device->devHalInfo, ADIHAL_LOG_ALL, TAL_ERR_OK,
    				 "TALISE_waitInitCals()\n");
    	retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_LOG, halError, retVal,
    				  TALACT_WARN_RESET_LOG);
    #endif
    
    	if (errorFlag == NULL) {
    		return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
    						  TAL_ERR_WAIT_INITCALS_NULL_PARAM, retVal, TALACT_ERR_CHECK_PARAM);
    	}
    
    	retValWarn = retVal;
    
    	retVal = (talRecoveryActions_t)TALISE_waitArmCmdStatus(device,
    			TALISE_ARM_RUNINIT_OPCODE, &cmdStatusByte, (timeoutMs * TIMEOUT_MS_FACTOR),
    			WAITINITCALS_INTERVAL_US);
    	_errFlag = (cmdStatusByte >> 1);
    	no_os_mdelay(20);
    	/* SW Test */
    	if (device->devStateInfo.swTest == CODECHECK_PARAM_WAITINITCALS_ERR) {
    		retVal = TALACT_ERR_RESET_SPI;
    		cmdStatusByte = 2;
    		_errFlag = (cmdStatusByte >> 1);
    	}
    	no_os_mdelay(20);
    	/* Don't update errorFlag if SPI error because errorFlag could be a random */
    	/* value but update error flag for other recovery action types */
    	if (retVal == TALACT_ERR_RESET_SPI) {
    		*errorFlag = 0;
    	} else {
    		*errorFlag = _errFlag;
    	}
    
    	/* ARM error handler to provide valid recovery action based on ARM error
    	 * code */
    	if (_errFlag > 0) {
    		return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_ARM_CMD_ERR,
    						  ARMCMD_ERRCODE(TALISE_ARM_RUNINIT_OPCODE, 0, cmdStatusByte), retVal,
    						  TALACT_ERR_RESET_ARM);
    	} else {
    		IF_ERR_RETURN_U32(retVal);
    	}
    
    	/* if no error from higher priority calls, return possible log warning */
    	if (retVal == TALACT_NO_ACTION) {
    		retVal = retValWarn;
    	}
    
    	return (uint32_t)retVal;
    }

  • I provide the latest print information and my talise_config.c here.

    /**
     * \file adrv9009/profiles/tx_bw200_ir245p76_rx_bw200_or245p76_orx_bw200_or245p76_dc245p76/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 <driver/adrv9009/api/talise_agc.h>
    #include <driver/adrv9009/api/talise_error.h>
    #include <driver/adrv9009/api/talise_types.h>
    #include "talise_config.h"
    #ifdef ADI_ZYNQ_PLATFORM
    #include "zynq_platform.h"
    #endif
    
    int16_t txFirCoefs[20] = {33, -77, 123, -158, 171, -112, -155, 1040, -3011, 20121, -3011, 1040, -155, -112, 171, -158, 123, -77, 33, 0};
    
    int16_t rxFirCoefs[48] = {-7, -23, 33, 50, -70, -110, 144, 205, -259, -356, 437, 581, -698, -916, 1082, 1415, -1655, -2209, 2567, 3615, -4351, -7169, 9329, 31129, 31129, 9329, -7169, -4351, 3615, 2567, -2209, -1655, 1415, 1082, -916, -698, 581, 437, -356, -259, 205, 144, -110, -70, 50,  33, -23, -7};
    
    int16_t obsrxFirCoefs[48] = {-7, -21, 31, 48, -67, -106, 124, 164, -275, -334, 440, 552, -694, -872, 1069, 1351, -1633, -2111, 2541, 3477, -4295, -6877, 9433, 30825, 30825, 9433, -6877, -4295, 3477, 2541, -2111, -1633, 1351, 1069, -872, -694, 552, 440, -334, -275, 164, 124, -106, -67, 48, 31, -21, 7};
    
    #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) */
    	},
    
    	/* Rx settings */
    	.rx =
    	{
    		.rxProfile =
    		{
    			.rxFir =
    			{
    				.gain_dB = TAL_FIR_GAIN_NEG6_DB ,                /* filter gain */
    				.numFirCoefs = 48,            /* number of coefficients in the FIR filter */
    				.coefs = &rxFirCoefs[0]
    			},
    			.rxFirDecimation = 2,            /* 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) */
    			.rxOutputRate_kHz = 245760,            /* Rx IQ data rate in kHz */
    			.rfBandwidth_Hz = 200000000,    /* The Rx RF passband bandwidth for the profile */
    			.rxBbf3dBCorner_kHz = 200000,    /* Rx BBF 3dB corner in kHz */
    			.rxAdcProfile = {185, 141, 172, 90, 1280, 942, 1332, 90, 1368, 46, 1016, 19, 48, 48, 37, 208, 0, 0, 0, 0, 52, 0, 7, 6, 42, 0, 7, 6, 42, 0, 25, 27, 0, 0, 25, 27, 0, 0, 165, 44, 31, 905},            /* pointer to custom ADC profile */
    			.rxDdcMode = TAL_RXDDC_BYPASS,   /* Rx DDC mode */
    			.rxNcoShifterCfg =
    			{
    				.bandAInputBandWidth_kHz = 0,
    				.bandAInputCenterFreq_kHz = 0,
    				.bandANco1Freq_kHz = 0,
    				.bandANco2Freq_kHz = 0,
    				.bandBInputBandWidth_kHz = 0,
    				.bandBInputCenterFreq_kHz = 0,
    				.bandBNco1Freq_kHz = 0,
    				.bandBNco2Freq_kHz = 0
    			}
    		},
    		.framerSel = TAL_FRAMER_A,            /* Rx JESD204b framer configuration */
    		.rxGainCtrl =
    		{
    			.gainMode = TAL_MGC,            /* taliserxGainMode_t gainMode */
    			.rx1GainIndex = 255,            /* uint8_t rx1GainIndex */
    			.rx2GainIndex = 255,            /* uint8_t rx2GainIndex */
    			.rx1MaxGainIndex = 255,            /* uint8_t rx1MaxGainIndex */
    			.rx1MinGainIndex = 195,            /* uint8_t rx1MinGainIndex */
    			.rx2MaxGainIndex = 255,            /* uint8_t rx2MaxGainIndex */
    			.rx2MinGainIndex = 195            /* uint8_t rx2MinGainIndex */
    		},
    		.rxChannels = TAL_RX1RX2,                /* The desired Rx Channels to enable during initialization */
    	},
    
    
    	/* Tx settings */
    	.tx =
    	{
    		.txProfile =
    		{
    			.dacDiv = 1,                        /* The divider used to generate the DAC clock */
    			.txFir =
    			{
    				.gain_dB =  TAL_FIR_GAIN_0_DB ,                        /* 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 = 2,                    /* Tx Halfband3 filter interpolation (1,2)*/
    			.txInt5Interpolation = 1,                    /* Tx Int5 filter interpolation (1,5) */
    			.txInputRate_kHz = 245760,                    /* Primary Signal BW */
    			.primarySigBandwidth_Hz = 75000000,    /* The Rx RF passband bandwidth for the profile */
    			.rfBandwidth_Hz = 200000000,            /* The Tx RF passband bandwidth for the profile */
    			.txDac3dBCorner_kHz = 200000,                /* The DAC filter 3dB corner in kHz */
    			.txBbf3dBCorner_kHz = 100000,                /* The BBF 3dB corner in kHz */
    			.loopBackAdcProfile = {243, 143, 181, 90, 1280, 485, 1275, 37, 1317, 23, 797, 35, 48, 48, 30, 174, 0, 0, 0, 0, 44, 0, 7, 6, 42, 0, 7, 6, 42, 0, 25, 27, 0, 0, 25, 27, 0, 0, 165, 44, 31, 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 = 10000,                            /* Initial Tx1 Attenuation */
    		.tx2Atten_mdB = 10000,                            /* 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 = 48,            /* number of coefficients in the FIR filter */
    				.coefs = &obsrxFirCoefs[0]
    			},
    			.rxFirDecimation = 2,            /* 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 = 245760,            /* Rx IQ data rate in kHz */
    			.rfBandwidth_Hz = 200000000,    /* The Rx RF passband bandwidth for the profile */
    			.rxBbf3dBCorner_kHz = 225000,    /* Rx BBF 3dB corner in kHz */
    			.orxLowPassAdcProfile = {185, 141, 172, 90, 1280, 942, 1332, 90, 1368, 46, 1016, 19, 48, 48, 37, 208, 0, 0, 0, 0, 52, 0, 7, 6, 42, 0, 7, 6, 42, 0, 25, 27, 0, 0, 25, 27, 0, 0, 165, 44, 31, 905},
    			.orxBandPassAdcProfile = {185, 141, 172, 90, 1280, 942, 1332, 90, 1368, 46, 1016, 19, 48, 48, 37, 208, 0, 0, 0, 0, 52, 0, 7, 6, 42, 0, 7, 6, 42, 0, 25, 27, 0, 0, 25, 27, 0, 0, 165, 44, 31, 905},
    			.orxDdcMode = TAL_ORXDDC_DISABLED,   /* ORx DDC mode */
    			.orxMergeFilter  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
    		},
    		.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_ORXOFF,//TAL_ORX1ORX2,        /* 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,/*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//TAL_RFPLLMCS_INIT_AND_CONTTRACK                /* RFPLL MCS (Phase sync) mode */
    	},
    
    	/* JESD204B settings */
    	.jesd204Settings =
    	{
    		/* Framer A settings */
    		.framerA =
    		{
    			.bankId = 1,                    /* 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 = 4,                            /* 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 = 4,                            /* 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 = 0x0A,    /* serializerLanesEnabled - bit per lane, [0] = Lane0 enabled, [1] = Lane1 enabled */
    			.serializerLaneCrossbar = 0xCC,    /* serializerLaneCrossbar */
    			.lmfcOffset = 31,                /* lmfcOffset - LMFC offset value for deterministic latency setting */
    			.newSysrefOnRelink = 0,            /* newSysrefOnRelink */
    			.syncbInSelect = 0,                /* syncbInSelect; */
    			.overSample = 0,                    /* 1=overSample, 0=bitRepeat */
    			.syncbInLvdsMode = 1,
    			.syncbInLvdsPnInvert = 0,
    			.enableManualLaneXbar = 0 /* 0=auto, 1=manual */
    		},
    		/* 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 = 4,                            /* 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 = 4,                            /* 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 = 0x05,    /* serializerLanesEnabled - bit per lane, [0] = Lane0 enabled, [1] = Lane1 enabled */
    			.serializerLaneCrossbar = 0x33,    /* 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
    	}
    };
    

    Xilinx Zynq MP First Stage Boot Loader
    Release 2019.1   Oct 10 2023  -  15:28:19
    PMU-FW is not running, certain applications may not be supported.
    --------- ad9528 configured start!! ---------
    
    ad9528_init() successfully!!!
    ad9528_config() successfully with 0
    
    ad9528_setup() done !
    
    --------------- ADRV9009  Configuration Start ----------------
    MESSAGE: 0: TALISE_resetDevice()
    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
    warning**********: Start Perform MultiChip Sync (MCS) on Talise Device**********
    success: TALISE_enableMultichipSync() success,enableMcs is:1,talAction is:0
    MESSAGE: 0: TALISE_SerializerReset()
    error: TALISE_enableMultichipSync() failed,mcsStatus is:0
    error: TALISE_enableMultichipSync() failed,talAction is:0
    success: TALISE_enableMultichipSync() success,enableMcs is:0,talAction is:0
    success: TALISE_enableMultichipSync() success,enableMcs is:0,mcsStatus is:0
    warning**********: End Perform MultiChip Sync (MCS) on Talise Device**********
    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:1500000000
    MESSAGE: 0: TALISE_getPllsLockStatus()
    MESSAGE: 0: TALISE_runInitCals()
    MESSAGE: 0: TALISE_sendArmCommand()
    success: TALISE_runInitCals() success,initCalMask is:941551
    MESSAGE: 0: TALISE_getInitCalStatus()
    MESSAGE: 0: TALISE_sendArmCommand()
    MESSAGE: 0: TALISE_waitArmCmdStatus()
    MESSAGE: 0: TALISE_readArmCmdStatusByte()
    ERROR: 294: TALISE_waitArmCmdStatus() failed due to thrown ARM error. Is device in correct state for calling command?
    ERROR: 803588: Talise ARM Command not accepted in this state
    calsSincePowerUp: 0x0
    calsLastRun: 0x0
    calsMinimum: 0x0
    initErrCal: Ox0
    initErrCode: 0x0
    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()
    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()
    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()
    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()
    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()
    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()
    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()
    ERROR: 247: TALISE_waitArmCmdStatus() failed due to thrown ARM error. ARM time out
    error: TALISE_waitInitCals() failed,error Flag is:0,
    error: TALISE_waitInitCals() failed,error talAction is:5,
    success: TALISE_waitInitCals() success,Flag is:0
    talise: Calibrations completed successfully
    MESSAGE: 0: TALISE_enableFramerLink()
    MESSAGE: 0: TALISE_enableFramerLink()
    MESSAGE: 0: TALISE_enableSysrefToFramer()

  • Can you please try downloading the latest SW package from the below link and see if you still see ARM error . .

    https://www.analog.com/en/design-center/landing-pages/001/transceiver-evaluation-software.html

  • Hello ,

    I fixed the problem after I changed TAL_TX1TX2 to TAL_TX2 in talise_config.c.“ERROR: 247:TALISE_waitArmCmdStatus() failed due to thrown ARM error. ARM time out";

    I would like to fill in the running status of my ADRV9009 and my updated questions.

    What's bothering me at the moment is that I can't print the "jesd_status" status message.

    1.console output info:

    Xilinx Zynq MP First Stage Boot Loader
    Release 2019.1   Oct 19 2023  -  23:43:04
    PMU-FW is not running, certain applications may not be supported.
    --------- ad9528 configured start!! ---------
    
    ad9528_init() successfully!!!
    ad9528_config() successfully with 0
    
    ad9528_setup() done !
    
    --------------- ADRV9009  Configuration Start ----------------
    success : CLKPLL is locked
    warning**********: Start Perform MultiChip Sync (MCS) on Talise Device**********
    warning**********: End Perform MultiChip Sync (MCS) on Talise Device**********
    talise: Device Revision 192, Firmware 6.0.2, API 3.6.0.5
    success: TALISE_setRfPllFrequency() success,RF_PLL_LO_FREQUENCIES is:1500000000
    success: TALISE_runInitCals() success,initCalMask is:941551
    ERROR: 294: TALISE_waitArmCmdStatus() failed due to thrown ARM error. Is device in correct state for calling command?
    ERROR: 803588: Talise ARM Command not accepted in this state
    calsSincePowerUp: 0x0
    calsLastRun: 0x0
    calsMinimum: 0x0
    initErrCal: Ox0
    initErrCode: 0x0
    success: TALISE_waitInitCals() success,Flag is:0
    talise: Calibrations completed successfully
    warning: TAL_FRAMER_A status 0x1
    warning: TAL_FRAMER_B status 0x9
    warning: TAL_DEFRAMER_A status 0x13
    success: TALISE_enableTrackingCals() success,tackingCalMask is:195
    success: ALL PLL  is  locked!!
    TALISE_getRadioState is : 3
    ADRV9009  Configured with Success
    
    --------- adrv9009 configured done ! ---------
    

    2.app_talise.c Initialization process

    /***************************************************************************//**
     *   @file   app_talise.c
     *   @brief  Talise initialization and control routines.
     *   @author Darius Berghe (darius.berghe@analog.com)
    ********************************************************************************
     * Copyright 2019(c) Analog Devices, Inc.
     *
     * All rights reserved.
     *
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions are met:
     *  - Redistributions of source code must retain the above copyright
     *    notice, this list of conditions and the following disclaimer.
     *  - Redistributions in binary form must reproduce the above copyright
     *    notice, this list of conditions and the following disclaimer in
     *    the documentation and/or other materials provided with the
     *    distribution.
     *  - Neither the name of Analog Devices, Inc. nor the names of its
     *    contributors may be used to endorse or promote products derived
     *    from this software without specific prior written permission.
     *  - The use of this software may or may not infringe the patent rights
     *    of one or more patent holders.  This license does not release you
     *    from the requirement that you obtain separate licenses from these
     *    patent holders to use this software.
     *  - Use of the software either in source or binary form, must be run
     *    on or directly connected to an Analog Devices Inc. component.
     *
     * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR
     * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT,
     * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     * IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT,
     * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     * LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, PROCUREMENT OF SUBSTITUTE GOODS OR
     * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
     * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    *******************************************************************************/
    // stdlibs
    #include <driver/adrv9009/adi_hal/adi_hal.h>
    #include <driver/adrv9009/api/talise.h>
    #include <driver/adrv9009/api/talise_arm.h>
    #include <driver/adrv9009/api/talise_cals.h>
    #include <driver/adrv9009/api/talise_error.h>
    #include <driver/adrv9009/api/talise_jesd204.h>
    #include <driver/adrv9009/api/talise_radioctrl.h>
    #include <driver/adrv9009/api/talise_reg_addr_macros.h>
    #include <driver/adrv9009/firmware/talise_arm_binary.h>
    #include <driver/adrv9009/firmware/talise_stream_binary.h>
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
    
    // platform drivers
    #include "no_os_error.h"
    #include "no_os_delay.h"
    #include "no_os_util.h"
    
    // talise
    #include "talise_config.h"
    #include "plotfrom.h"
    #include "parameters.h"
    #include "app_talise.h"
    #include "app_config.h"
    #include "adrv9009_config.h"
    
    
    int adrv9009_check_sysref_rate(uint32_t lmfc, uint32_t sysref)
    {
    	uint32_t div, mod;
    
    	div = lmfc / sysref;
    	mod = lmfc % sysref;
    
    	/* Ignore minor deviations that can be introduced by rounding. */
    	return mod <= div || mod >= sysref - div;
    }
    adiHalErr_t TESTgpio(taliseDevice_t * const pd, taliseInit_t * const pi)
    {
    	for (uint8_t i = 0; i < 1000; i++) {
    
    		ADIHAL_TestGPIO(pd->devHalInfo, SYSREF_CONT_ON);//TEST
    
    		no_os_mdelay(500);
    		ADIHAL_TestGPIO(pd->devHalInfo, SYSREF_CONT_OFF);//TEST
    
    		no_os_mdelay(500);
    	}
    }
    
    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;
    	}
    	/*******************************/
    	  /**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;
    //	  }
    	//no_os_mdelay(200);
    	/*******************************/
    	/***** 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 ***/
    	/*******************************************************/
    
    	printf("warning**********: Start Perform MultiChip Sync (MCS) on Talise Device********** \n");
    	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");
    		printf("error: TALISE_enableMultichipSync() failed,mcsStatus is:%d \n",mcsStatus);
    		printf("error: TALISE_enableMultichipSync() failed,talAction is:%d \n",talAction);
    		goto error_11;
    	}
    //	printf("success: TALISE_enableMultichipSync() success,enableMcs is:1,talAction is:%d \n",talAction);
    
    	/*< 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");
    		printf("error: TALISE_enableMultichipSync() failed,mcsStatus is:%d \n",mcsStatus);
    		printf("error: TALISE_enableMultichipSync() failed,talAction is:%d \n",talAction);
    	}
    //	printf("success: TALISE_enableMultichipSync() success,enableMcs is:0,talAction is:%d \n",talAction);
    //	printf("success: TALISE_enableMultichipSync() success,enableMcs is:0,mcsStatus is:%d \n",mcsStatus);
    	printf("warning**********: End Perform MultiChip Sync (MCS) on Talise Device********** \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;
    	}
    	no_os_mdelay(100);
    	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");
    		printf("error: TALISE_setRfPllFrequency() failed,RF_PLL_LO_FREQUENCIES is:%d\n",RF_PLL_LO_FREQUENCIES);
    		goto error_11;
    	}
    	printf("success: TALISE_setRfPllFrequency() success,RF_PLL_LO_FREQUENCIES is:%d\n",RF_PLL_LO_FREQUENCIES);
    
    	/*** < 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");
    		printf("error: TALISE_runInitCals() failed,initCalMask is:%d\n",initCalMask);
    		goto error_11;
    	}
    	printf("success: TALISE_runInitCals() success,initCalMask is:%d\n",initCalMask);
    	no_os_mdelay(200);
    	uint32_t calsSincePowerUp = 0, calsLastRun = 0, calsMinimum = 0;
    	uint8_t initErrCal = 0, initErrCode = 0;
    	talAction = TALISE_getInitCalStatus(pd, &calsSincePowerUp, &calsLastRun, &calsMinimum, &initErrCal, &initErrCode);
    
    	printf("calsSincePowerUp: 0x%x\n", calsSincePowerUp);
    	printf("calsLastRun: 0x%x\n", calsLastRun);
    	printf("calsMinimum: 0x%x\n", calsMinimum);
    	printf("initErrCal: Ox%x\n", initErrCal);
    	printf("initErrCode: 0x%x\n", initErrCode);
    
    	talAction = TALISE_waitInitCals(pd, 30000, &errorFlag);
    	if (talAction != TALACT_NO_ACTION) {
    		/*** < User: decide what to do based on Talise recovery action returned > ***/
    		//printf("error: TALISE_waitInitCals() failed\n");
    		printf("error: TALISE_waitInitCals() failed,error Flag is:%d,\n",errorFlag);
    		printf("error: TALISE_waitInitCals() failed,error talAction is:%d,\n",talAction);
    		//goto error_11;
    	}
    	printf("success: TALISE_waitInitCals() success,Flag is:%d\n",errorFlag);
    
    	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;
    		}
    		no_os_mdelay(20);
    
    		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;
    		}
    		no_os_mdelay(20);
    		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;
    		}
    		no_os_mdelay(20);
    		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);
    	no_os_mdelay(100);
    	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,tackingCalMask is:%d\n",trackingCalMask);
    		goto error_11;
    	}
    	printf("success: TALISE_enableTrackingCals() success,tackingCalMask is:%d\n",trackingCalMask);
    
    	/* 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_TX2  );
    	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;
    }
    
    
    int talise_multi_chip_sync(taliseDevice_t * pd, int step , taliseInit_t * const pi)
    {
    	uint8_t mcsStatus = 0;
    	uint8_t phy_ctrl;
    	int ret = 0;
    
    	switch (step) {
    	case 0:
    		TALISE_radioOff(pd);
    		ADIHAL_sysrefReq(pd->devHalInfo, SYSREF_CONT_OFF);
    
    		axi_jesd204_rx_lane_clk_disable(pd->devHalInfo);
    		axi_jesd204_tx_lane_clk_disable(pd->devHalInfo);
    		break;
    	case 1:
    		/*******************************************************/
    		/**** Perform MultiChip Sync (MCS) on Talise Device ***/
    		/*******************************************************/
    		ret = TALISE_enableMultichipSync(pd, 1, &mcsStatus);
    		if (ret != TALACT_NO_ACTION) {
    			printf("%s:%d (ret %d)\n", __func__, __LINE__, ret);
    			ret = -1;
    		}
    		break;
    	case 2:
    		/*< user code - Request minimum 3 SYSREF pulses from Clock Device - > */
    		ADIHAL_sysrefReq(pd->devHalInfo, SYSREF_PULSE);
    		break;
    	case 3:
    		ret = TALISE_enableMultichipSync(pd, 0, &mcsStatus);
    		if ((mcsStatus & 0x0B) != 0x0B) {
    			printf("%s:%d Unexpected MCS sync status (0x%X)\n",
    			       __func__, __LINE__, mcsStatus);
    			ret = -1;
    		}
    		break;
    	case 4:
    		TALISE_enableMultichipRfLOPhaseSync(pd, 1);
    		break;
    	case 5:
    		/*< user code - Request minimum 4 SYSREF pulses from Clock Device - > */
    		ADIHAL_sysrefReq(pd->devHalInfo, SYSREF_PULSE);
    		break;
    	case 6:
    		TALISE_enableMultichipRfLOPhaseSync(pd, 0);
    		break;
    	case 7:
    		/*< user code - Request minimum 4 SYSREF pulses from Clock Device - > */
    		ADIHAL_sysrefReq(pd->devHalInfo, SYSREF_CONT_ON);
    		break;
    	case 8:
    		/***************************************************/
    		/**** Enable Talise JESD204B Framer ***/
    		/***************************************************/
    
    		if (talInit.jesd204Settings.framerA.M) {
    			ret = TALISE_enableSysrefToFramer(pd, TAL_FRAMER_A, 0);
    			if (ret != TALACT_NO_ACTION) {
    				printf("%s:%d (ret %d)\n", __func__, __LINE__, ret);
    				ret = -1;
    				break;
    			}
    
    			ret = TALISE_enableFramerLink(pd, TAL_FRAMER_A, 0);
    			if (ret != TALACT_NO_ACTION) {
    				printf("%s:%d (ret %d)\n", __func__, __LINE__, ret);
    				ret = -1;
    				break;
    			}
    
    			ret = TALISE_enableFramerLink(pd, TAL_FRAMER_A, 1);
    			if (ret != TALACT_NO_ACTION) {
    				printf("%s:%d (ret %d)\n", __func__, __LINE__, ret);
    				ret = -1;
    				break;
    			}
    
    			/*************************************************/
    			/**** Enable SYSREF to Talise JESD204B Framer ***/
    			/*************************************************/
    			/*** < User: Make sure SYSREF is stopped/disabled > ***/
    
    			ret = TALISE_enableSysrefToFramer(pd, TAL_FRAMER_A, 1);
    			if (ret != TALACT_NO_ACTION) {
    				printf("%s:%d (ret %d)\n", __func__, __LINE__, ret);
    				ret = -1;
    				break;
    			}
    		}
    
    		/***************************************************/
    		/**** Enable Talise JESD204B Framer ***/
    		/***************************************************/
    
    		if (talInit.jesd204Settings.framerB.M) {
    			ret = TALISE_enableSysrefToFramer(pd, TAL_FRAMER_B, 0);
    			if (ret != TALACT_NO_ACTION) {
    				printf("%s:%d (ret %d)\n", __func__, __LINE__, ret);
    				ret = -1;
    				break;
    			}
    
    			ret = TALISE_enableFramerLink(pd, TAL_FRAMER_B, 0);
    			if (ret != TALACT_NO_ACTION) {
    				printf("%s:%d (ret %d)\n", __func__, __LINE__, ret);
    				ret = -1;
    				break;
    			}
    
    			ret = TALISE_enableFramerLink(pd, TAL_FRAMER_B, 1);
    			if (ret != TALACT_NO_ACTION) {
    				printf("%s:%d (ret %d)\n", __func__, __LINE__, ret);
    				ret = -1;
    				break;
    			}
    
    			/*************************************************/
    			/**** Enable SYSREF to Talise JESD204B Framer ***/
    			/*************************************************/
    			/*** < User: Make sure SYSREF is stopped/disabled > ***/
    
    			ret = TALISE_enableSysrefToFramer(pd, TAL_FRAMER_B, 1);
    			if (ret != TALACT_NO_ACTION) {
    				printf("%s:%d (ret %d)\n", __func__, __LINE__, ret);
    				ret = -1;
    				break;
    			}
    		}
    		/***************************************************/
    		/**** Enable  Talise JESD204B Deframer ***/
    		/***************************************************/
    		if (talInit.jesd204Settings.deframerA.M) {
    			ret = TALISE_enableSysrefToDeframer(pd, TAL_DEFRAMER_A, 0);
    			if (ret != TALACT_NO_ACTION) {
    				printf("%s:%d (ret %d)\n", __func__, __LINE__, ret);
    				ret = -1;
    				break;
    			}
    
    			ret = TALISE_enableDeframerLink(pd, TAL_DEFRAMER_A, 0);
    			if (ret != TALACT_NO_ACTION) {
    				printf("%s:%d (ret %d)\n", __func__, __LINE__, ret);
    				ret = -1;
    				break;
    			}
    
    			ret |= TALISE_enableDeframerLink(pd, TAL_DEFRAMER_A, 1);
    			if (ret != TALACT_NO_ACTION) {
    				printf("%s:%d (ret %d)\n", __func__, __LINE__, ret);
    				ret = -1;
    				break;
    			}
    
    			/***************************************************/
    			/**** Enable SYSREF to Talise JESD204B Deframer ***/
    			/***************************************************/
    			ret = TALISE_enableSysrefToDeframer(pd, TAL_DEFRAMER_A, 1);
    			if (ret != TALACT_NO_ACTION) {
    				printf("%s:%d (ret %d)\n", __func__, __LINE__, ret);
    				ret = -1;
    				break;
    			}
    
    		}
    		break;
    	case 9:
    		axi_jesd204_tx_lane_clk_enable(pd->devHalInfo);
    
    		/* RESET CDR */
    
    		ret = ADIHAL_spiReadByte(pd->devHalInfo, TALISE_ADDR_DES_PHY_GENERAL_CTL_1,
    					 &phy_ctrl);
    		if (ret)
    			break;
    		ret = ADIHAL_spiWriteByte(pd->devHalInfo, TALISE_ADDR_DES_PHY_GENERAL_CTL_1,
    					  phy_ctrl & ~NO_OS_BIT(7));
    		if (ret)
    			break;
    		ret = ADIHAL_spiWriteByte(pd->devHalInfo, TALISE_ADDR_DES_PHY_GENERAL_CTL_1,
    					  phy_ctrl);
    		if (ret)
    			break;
    
    		axi_jesd204_rx_lane_clk_enable(pd->devHalInfo);
    		axi_jesd204_rx_lane_clk_enable(pd->devHalInfo);
    
    		break;
    	case 10:
    		/*** < User Sends SYSREF Here > ***/
    		ADIHAL_sysrefReq(pd->devHalInfo, SYSREF_CONT_ON);
    		break;
    	case 11:
    		/**************************************/
    		/**** Check Talise Deframer Status ***/
    		/**************************************/
    
    		ADIHAL_sysrefReq(pd->devHalInfo, SYSREF_CONT_OFF);
    
    		check_FramerDframerStatus( pd , pi );
    
    		TALISE_radioOn(pd);
    		break;
    	default:
    		ret = -1;
    	};
    
    	return ret;
    }
    
    void talise_shutdown(taliseDevice_t * const pd)
    {
    	uint32_t talAction = TALACT_NO_ACTION;
    
    	/***********************************************
    	* Shutdown Procedure *
    	* **********************************************/
    	/* Function to turn radio on, Disables transmitters and receivers */
    	talAction = TALISE_radioOff(pd);
    	if (talAction != TALACT_NO_ACTION) {
    		/*** < User: decide what to do based on Talise recovery action returned > ***/
    	}
    	/* Put Talise in safe state for power down */
    	talAction = TALISE_shutdown(pd);
    	if (talAction != TALACT_NO_ACTION) {
    		/*** < User: decide what to do based on Talise recovery action returned > ***/
    	}
    
    	/*Close Talise Hw Device*/
    	talAction = TALISE_closeHw(pd);
    	if(talAction != TALACT_NO_ACTION) {
    		/*** < User: decide what to do based on Talise recovery action returned > ***/
    	}
    }
    

    So far I'm not using the latest software packages.

    Sincere regards,

    alan.

  • Hi vanitha,

    I installed the latest installation package and created the Init.c script.

    I will use the latest script 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_config.h"
    #include "talise_error.h"
    #include "talise_agc.h"
    #ifdef ADI_ZYNQ_PLATFORM
    #include "zynq_platform.h"
    #endif
    
    int16_t txFirCoefs[40] = {-14, 5, -9, 6, -4, 19, -29, 27, -30, 46, -63, 77, -103, 150, -218, 337, -599, 1266, -2718, 19537, -2718, 1266, -599, 337, -218, 150, -103, 77, -63, 46, -30, 27, -29, 19, -4, 6, -9, 5, -14, 0};
    
    int16_t rxFirCoefs[48] = {-2, 23, 46, -17, -104, 10, 208, 23, -370, -97, 607, 240, -942, -489, 1407, 910, -2065, -1637, 3058, 2995, -4912, -6526, 9941, 30489, 30489, 9941, -6526, -4912, 2995, 3058, -1637, -2065, 910, 1407, -489, -942, 240, 607, -97, -370, 23, 208, 10, -104, -17, 46, 23, -2};
    
    int16_t obsrxFirCoefs[24] = {-10, 7, -10, -12, 6, -12, 16, -16, 1, 63, -431, 17235, -431, 63, 1, -16, 16, -12, 6, -12, -10, 7, -10, 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) */
    	},
    	
        /* Rx settings */
        .rx = 
        {
            .rxProfile =
            {
                .rxFir = 
                {
                    .gain_dB = -6,                /* filter gain */
                    .numFirCoefs = 48,            /* number of coefficients in the FIR filter */
                    .coefs = &rxFirCoefs[0]
                },
                .rxFirDecimation = 2,            /* 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) */
                .rxOutputRate_kHz = 245760,            /* Rx IQ data rate in kHz */
                .rfBandwidth_Hz = 200000000,    /* The Rx RF passband bandwidth for the profile */
                .rxBbf3dBCorner_kHz = 200000,    /* Rx BBF 3dB corner in kHz */
                .rxAdcProfile = {182, 142, 173, 90, 1280, 982, 1335, 96, 1369, 48, 1012, 18, 48, 48, 37, 208, 0, 0, 0, 0, 52, 0, 7, 6, 42, 0, 7, 6, 42, 0, 25, 27, 0, 0, 25, 27, 0, 0, 165, 44, 31, 905},            /* pointer to custom ADC profile */
                .rxDdcMode = TAL_RXDDC_BYPASS,   /* Rx DDC mode */
                .rxNcoShifterCfg =
                {
                    .bandAInputBandWidth_kHz = 0,
                    .bandAInputCenterFreq_kHz = 0,
                    .bandANco1Freq_kHz = 0,
                    .bandANco2Freq_kHz = 0,
                    .bandBInputBandWidth_kHz = 0,
                    .bandBInputCenterFreq_kHz = 0,
                    .bandBNco1Freq_kHz = 0,
                    .bandBNco2Freq_kHz = 0
                }
            },
            .framerSel = TAL_FRAMER_A,            /* Rx JESD204b framer configuration */
            .rxGainCtrl = 
            {
                .gainMode = TAL_MGC,            /* taliserxGainMode_t gainMode */
                .rx1GainIndex = 255,            /* uint8_t rx1GainIndex */
                .rx2GainIndex = 255,            /* uint8_t rx2GainIndex */
                .rx1MaxGainIndex = 255,            /* uint8_t rx1MaxGainIndex */
                .rx1MinGainIndex = 195,            /* uint8_t rx1MinGainIndex */
                .rx2MaxGainIndex = 255,            /* uint8_t rx2MaxGainIndex */
                .rx2MinGainIndex = 195            /* uint8_t rx2MinGainIndex */
            },
            .rxChannels = TAL_RX1RX2,                /* The desired Rx Channels to enable during initialization */
        },
    
    
        /* Tx settings */
        .tx = 
        {
            .txProfile =
            {
                .dacDiv = 1,                        /* The divider used to generate the DAC clock */
                .txFir = 
                {
                    .gain_dB = 6,                        /* filter gain */
                    .numFirCoefs = 40,                    /* 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 = 2,                    /* Tx Halfband3 filter interpolation (1,2)*/
                .txInt5Interpolation = 1,                    /* Tx Int5 filter interpolation (1,5) */
                .txInputRate_kHz = 245760,                    /* Primary Signal BW */
                .primarySigBandwidth_Hz = 100000000,    /* The Rx RF passband bandwidth for the profile */
                .rfBandwidth_Hz = 225000000,            /* The Tx RF passband bandwidth for the profile */
                .txDac3dBCorner_kHz = 225000,                /* The DAC filter 3dB corner in kHz */
                .txBbf3dBCorner_kHz = 113000,                /* The BBF 3dB corner in kHz */
                .loopBackAdcProfile = {212, 140, 175, 90, 1280, 699, 1304, 59, 1343, 33, 913, 27, 48, 48, 34, 192, 0, 0, 0, 0, 48, 0, 7, 6, 42, 0, 7, 6, 42, 0, 25, 27, 0, 0, 25, 27, 0, 0, 165, 44, 31, 905}
            },
            .deframerSel = TAL_DEFRAMER_A,                    /* Talise JESD204b deframer config for the Tx data path */
            .txChannels = TAL_TX2,                            /* 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 = 2,            /* RX Half band 1 decimation (1 or 2) */
                .orxOutputRate_kHz = 245760,            /* Rx IQ data rate in kHz */
                .rfBandwidth_Hz = 200000000,    /* The Rx RF passband bandwidth for the profile */
                .rxBbf3dBCorner_kHz = 225000,    /* Rx BBF 3dB corner in kHz */
                .orxLowPassAdcProfile = {185, 141, 172, 90, 1280, 942, 1332, 90, 1368, 46, 1016, 19, 48, 48, 37, 208, 0, 0, 0, 0, 52, 0, 7, 6, 42, 0, 7, 6, 42, 0, 25, 27, 0, 0, 25, 27, 0, 0, 165, 44, 31, 905},
                .orxBandPassAdcProfile = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                .orxDdcMode = TAL_ORXDDC_DISABLED,   /* ORx DDC mode */
                .orxMergeFilter  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
            },
            .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_ORX1ORX2,        /* 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_NOSYNC                /* RFPLL MCS (Phase sync) mode */
        },
    
        /* JESD204B settings */
        .jesd204Settings = 
        {
            /* Framer A settings */
            .framerA = 
            {
                .bankId = 1,                    /* 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 = 4,                            /* 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 = 4,                            /* 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 = 0x05,    /* 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 = 0,                /* syncbInSelect; */
                .overSample = 0,                    /* 1=overSample, 0=bitRepeat */
                .syncbInLvdsMode = 1,
                .syncbInLvdsPnInvert = 0,
                .enableManualLaneXbar = 0 /* 0=auto, 1=manual */
            },
            /* 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 = 4,                            /* 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 = 4,                            /* 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 = 0x0A,    /* 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 = 2,                            /* 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 = 0x01,    /* 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
        }
    };

    Sincere regards,

    Alan.

  • Hi   

    Can we continue to troubleshoot this fatal problem? It seems that there is a problem with my JESD link.

    warning: TAL_FRAMER_A status 0x1
    warning: TAL_FRAMER_B status 0x9
    warning: TAL_DEFRAMER_A status 0x13