Hi,
We are implementing DPD with ADRV9029. We have taken the configuration parameters for DPD from the python script given below and implemented the same in c. The model file is taken form ADI Ezone. None for the API are getting failed and the error code in DPD status is also found to be 0 but we could see the configurations are not affecting. What can be issue ?
Is there any sample c code for DPD configuration ?
Thanks in advance.
################################################################################# #GUI Version: 5.1.0.30 #DLL Version: 5.1.0.21 #Cmd Server Version: 5.1.0.21 #FPGA Version: 0xD9000007 #ARM Version: 5.1.0.9(ADI_ADRV9025_ARMBUILD_TESTOBJ) #StreamVersion: 8.1.0.1 ################################################################################# #Import Reference to the DLL import System import clr import time from math import log10, sqrt from System import Array clr.AddReferenceToFileAndPath("C:\\Program Files\\Analog Devices\\ADRV9025 Transceiver Evaluation Software_x64_FULL\\adrvtrx_dll.dll") from adrv9010_dll import AdiEvaluationSystem from adrv9010_dll import Types from adrv9010_dll import Ad9528Types ########################## HELPER FUNCTIONS ####################################### def dpdStatusGet(txChannel): print"***************************************" print "Retrieving DPD status" #dpdStatus = Types.adi_adrv9010_DpdStatus_t() dpdStatus = Types.adi_adrv9025_DpdStatusX_t() retVal = link.platform.board.Adrv9010Device.Dfe.DpdStatusGet(txChannel, dpdStatus) dpdStatus = retVal[1] print "dpdErrorCode:",dpdStatus.dpdErrorCode print "dpdPercentComplete",dpdStatus.dpdPercentComplete print "dpdPerformanceMetric",dpdStatus.dpdPerformanceMetric print "dpdIterCount",dpdStatus.dpdIterCount print "dpdUpdateCount",dpdStatus.dpdUpdateCount print "dpdSyncStatus",dpdStatus.dpdSyncStatus meanTu = dpdStatus.dpdStatistics.dpdMeanTuPower peakTu = dpdStatus.dpdStatistics.dpdPeakTuPower meanTx = dpdStatus.dpdStatistics.dpdMeanTxPower peakTx = dpdStatus.dpdStatistics.dpdPeakTxPower meanOrx = dpdStatus.dpdStatistics.dpdMeanOrxPower peakOrx = dpdStatus.dpdStatistics.dpdPeakOrxPower print "dpdModelTable",dpdStatus.dpdModelTable if int(meanTu*10 + peakTu*10 + meanTx*10 + peakTx*10 + meanOrx*10 + peakOrx*10) != 0: print "dpdMeanTuPower",20*log10(sqrt(meanTu) / 32768) print "dpdPeakTuPower",20*log10(sqrt(peakTu) / 32768) print "dpdMeanTxPower",20*log10(sqrt(meanTx) / 32768) print "dpdPeakTxPower",20*log10(sqrt(peakTx) / 32768) print "dpdMeanOrxPower",20*log10(sqrt(meanOrx) / 32768) print "dpdPeakOrxPower",20*log10(sqrt(peakOrx) / 32768) print "dpdDirectEvm",dpdStatus.dpdStatistics.dpdDirectEvm print "dpdIndirectEvm",dpdStatus.dpdStatistics.dpdIndirectEvm print "dpdSelectError",dpdStatus.dpdStatistics.dpdSelectError print "dpdIndirectError",dpdStatus.dpdStatistics.dpdIndirectError print "dpdErrorStatus0 (metrics:actions): X:X", dpdStatus.dpdErrorStatus0.dpdMetricsMask, dpdStatus.dpdErrorStatus0.dpdActionMask print "dpdErrorStatus1 (metrics:actions): X:X", dpdStatus.dpdErrorStatus1.dpdMetricsMask, dpdStatus.dpdErrorStatus1.dpdActionMask print "dpdPersistentErrorStatus0 (metrics:actions): X:X", dpdStatus.dpdPersistentErrorStatus0.dpdMetricsMask, dpdStatus.dpdPersistentErrorStatus0.dpdActionMask print "dpdPersistentErrorStatus1 (metrics:actions): X:X", dpdStatus.dpdPersistentErrorStatus1.dpdMetricsMask, dpdStatus.dpdPersistentErrorStatus1.dpdActionMask print "reservedPM",dpdStatus.reservedPM print "reservedTP",dpdStatus.reservedTP print "reservedPR",dpdStatus.reservedPR print"***************************************" def dpdTrackingConfigSet( txChMask = 0x1): print"***************************************" print"Setting up DPD Tracking Config" FULL_SCALE_CODE = 32768 #Create a new instance of DPD tracking Config and read back values in the device dpdTrackCfg = Types.adi_adrv9025_DpdTrackingConfig_t() dpdTrackCfgGet = Types.adi_adrv9025_DpdTrackingConfig_t() retVal = link.platform.board.Adrv9010Device.Dfe.DpdTrackingConfigGet(Types.adi_adrv9010_TxChannels_e.ADI_ADRV9010_TX1,dpdTrackCfgGet) dpdTrackCfg = retVal[1] #Update DPD mode dpdTrackCfg.dpdUpdateMode = Types.adi_adrv9010_DpdTrackingUpdateMode_e.ADI_ADRV9025_DPD_TRACKING_UPDATE_MODE_2 #Update Peak search window and other params dpdTrackCfg.dpdPeakSearchWindowSize = 65535 dpdTrackCfg.dpdIndirectRegularizationValue = 20 dpdTrackCfg.dpdSamples = 16384 dpdTrackCfg.dpdIndirectRegularizationLowPowerValue = 20 dpdTrackCfg.dpdFilterSel = 1 dpdTrackCfg.enableDirectLearning = 0 dpdTrackCfg.dpdMu = 0 #Update low power threshold DpdLowPowerThreshold_dBFS = -46 dpdTrackCfg.minAvgSignalLevel = System.UInt16(pow(10,(DpdLowPowerThreshold_dBFS/20.0))*FULL_SCALE_CODE) #Update ORx low power threshold DpdLowPowerThresholdORx_dBFS = -36 dpdTrackCfg.minAvgSignalLevelOrx = System.UInt16(pow(10,(DpdLowPowerThresholdORx_dBFS/20.0))*FULL_SCALE_CODE) #Convert M-Threshold in dBFS to linear scale MThreshold_dBFS = -40 temp = pow(10,(MThreshold_dBFS/20.0))*FULL_SCALE_CODE dpdTrackCfg.dpdMThreshold = pow(temp,2) #Program the values dpdTrackCfg.txChannelMask = txChMask link.platform.board.Adrv9010Device.Dfe.DpdTrackingConfigSet(dpdTrackCfg) #Read back the programmed values retVal = link.platform.board.Adrv9010Device.Dfe.DpdTrackingConfigGet(Types.adi_adrv9010_TxChannels_e.ADI_ADRV9010_TX1,dpdTrackCfgGet) dpdTrackCfg = retVal[1] print"DPD Tx Low Power Threshold(dBFS) = ",20*log10(dpdTrackCfg.minAvgSignalLevel/32768.0) print"DPD ORx Low Power Threshold(dBFS) = ",20*log10(dpdTrackCfg.minAvgSignalLevelOrx/32768.0) print"DPD M Threshold(dBFS) = ",20*log10(pow(dpdTrackCfg.dpdMThreshold,0.5)/32768.0) print"DPD Peak Search Window Size = ",dpdTrackCfg.dpdPeakSearchWindowSize print"DPD Regularization Value = ",dpdTrackCfg.dpdIndirectRegularizationValue print"DPD Samples = ",dpdTrackCfg.dpdSamples print"DPD Update Mode = ",dpdTrackCfg.dpdUpdateMode print " DPD Indirect Regularization Value LowPower", dpdTrackCfg.dpdIndirectRegularizationLowPowerValue print " dpdFilterSel", dpdTrackCfg.dpdFilterSel print "enableDirectLearning", dpdTrackCfg.enableDirectLearning print "dpdMu", dpdTrackCfg.dpdMu print"***************************************" DPD_MODEL_FILE = "C:\\Users\\pvalavan\\Desktop\\DFE\\DPD TESTING\\ADRV9025_4txDPD_TESTING\\DPD_Model\\Gen3_95coefficients.txt" lut = Array.CreateInstance(Types.adi_adrv9010_DpdLut_e, 31) lut[0] = Types.adi_adrv9010_DpdLut_e.ADI_ADRV9010_DPD_LUT0 lut[1] = Types.adi_adrv9010_DpdLut_e.ADI_ADRV9010_DPD_LUT1 lut[2] = Types.adi_adrv9010_DpdLut_e.ADI_ADRV9010_DPD_LUT2 lut[3] = Types.adi_adrv9010_DpdLut_e.ADI_ADRV9010_DPD_LUT3 lut[4] = Types.adi_adrv9010_DpdLut_e.ADI_ADRV9010_DPD_LUT4 lut[5] = Types.adi_adrv9010_DpdLut_e.ADI_ADRV9010_DPD_LUT5 lut[6] = Types.adi_adrv9010_DpdLut_e.ADI_ADRV9010_DPD_LUT6 lut[7] = Types.adi_adrv9010_DpdLut_e.ADI_ADRV9010_DPD_LUT7 lut[8] = Types.adi_adrv9010_DpdLut_e.ADI_ADRV9010_DPD_LUT8 lut[9] = Types.adi_adrv9010_DpdLut_e.ADI_ADRV9010_DPD_LUT9 lut[10] = Types.adi_adrv9010_DpdLut_e.ADI_ADRV9010_DPD_LUT10 lut[11] = Types.adi_adrv9010_DpdLut_e.ADI_ADRV9010_DPD_LUT11 lut[12] = Types.adi_adrv9010_DpdLut_e.ADI_ADRV9010_DPD_LUT12 lut[13] = Types.adi_adrv9010_DpdLut_e.ADI_ADRV9010_DPD_LUT13 lut[14] = Types.adi_adrv9010_DpdLut_e.ADI_ADRV9010_DPD_LUT14 lut[15] = Types.adi_adrv9010_DpdLut_e.ADI_ADRV9010_DPD_LUT15 lut[16] = Types.adi_adrv9010_DpdLut_e.ADI_ADRV9010_DPD_LUT16 lut[17] = Types.adi_adrv9010_DpdLut_e.ADI_ADRV9010_DPD_LUT17 lut[18] = Types.adi_adrv9010_DpdLut_e.ADI_ADRV9010_DPD_LUT18 lut[19] = Types.adi_adrv9010_DpdLut_e.ADI_ADRV9010_DPD_LUT19 lut[20] = Types.adi_adrv9010_DpdLut_e.ADI_ADRV9010_DPD_LUT20 lut[21] = Types.adi_adrv9010_DpdLut_e.ADI_ADRV9010_DPD_LUT21 lut[22] = Types.adi_adrv9010_DpdLut_e.ADI_ADRV9010_DPD_LUT22 lut[23] = Types.adi_adrv9010_DpdLut_e.ADI_ADRV9010_DPD_LUT23 lut[24] = Types.adi_adrv9010_DpdLut_e.ADI_ADRV9010_DPD_LUT24 lut[25] = Types.adi_adrv9010_DpdLut_e.ADI_ADRV9010_DPD_LUT25 lut[26] = Types.adi_adrv9010_DpdLut_e.ADI_ADRV9010_DPD_LUT26 lut[27] = Types.adi_adrv9010_DpdLut_e.ADI_ADRV9010_DPD_LUT27 lut[28] = Types.adi_adrv9010_DpdLut_e.ADI_ADRV9010_DPD_LUT28 lut[29] = Types.adi_adrv9010_DpdLut_e.ADI_ADRV9010_DPD_LUT29 lut[30] = Types.adi_adrv9010_DpdLut_e.ADI_ADRV9010_DPD_LUT30 def dpdModelRestoreFromFile(fileName = DPD_MODEL_FILE): dpdModelRestore = Types.adi_adrv9025_DpdModelConfig_t(); cnt = 0 modelFile = open(fileName,'r') for line in modelFile: var = line.split() dpdModelRestore.dpdFeatures[cnt].i = System.Byte(var[0]) dpdModelRestore.dpdFeatures[cnt].j = System.Byte(var[1]) dpdModelRestore.dpdFeatures[cnt].k = System.Byte(var[2]) dpdModelRestore.dpdFeatures[cnt].lut = lut[int(var[3])] dpdModelRestore.dpdFeatures[cnt].coeffReal = float(var[4]) dpdModelRestore.dpdFeatures[cnt].coeffImaginary = float(var[5]) cnt = cnt + 1 modelFile.close print "Num coeffs read from file = ",cnt dpdModelRestore.dpdNumFeatures = cnt dpdModelRestore.txChannelMask = 0x0F link.platform.board.Adrv9010Device.Dfe.DpdModelConfigSet(dpdModelRestore) link.platform.board.Adrv9010Device.Dfe.DpdReset(Types.adi_adrv9010_TxChannels_e.ADI_ADRV9010_TX1, Types.adi_adrv9010_DpdResetMode_e.ADI_ADRV9025_DPD_LUT_RESTORE) link.platform.board.Adrv9010Device.Dfe.DpdReset(Types.adi_adrv9010_TxChannels_e.ADI_ADRV9010_TX2, Types.adi_adrv9010_DpdResetMode_e.ADI_ADRV9025_DPD_LUT_RESTORE) link.platform.board.Adrv9010Device.Dfe.DpdReset(Types.adi_adrv9010_TxChannels_e.ADI_ADRV9010_TX3, Types.adi_adrv9010_DpdResetMode_e.ADI_ADRV9025_DPD_LUT_RESTORE) link.platform.board.Adrv9010Device.Dfe.DpdReset(Types.adi_adrv9010_TxChannels_e.ADI_ADRV9010_TX4, Types.adi_adrv9010_DpdResetMode_e.ADI_ADRV9025_DPD_LUT_RESTORE) def resetDpdFull(TxChannel = 1): if TxChannel == 1: link.platform.board.Adrv9010Device.Dfe.DpdReset(Types.adi_adrv9010_TxChannels_e.ADI_ADRV9010_TX1,Types.adi_adrv9010_DpdResetMode_e.ADI_ADRV9010_DPD_RESET_FULL) if TxChannel == 2: link.platform.board.Adrv9010Device.Dfe.DpdReset(Types.adi_adrv9010_TxChannels_e.ADI_ADRV9010_TX2,Types.adi_adrv9010_DpdResetMode_e.ADI_ADRV9010_DPD_RESET_FULL) if TxChannel == 3: link.platform.board.Adrv9010Device.Dfe.DpdReset(Types.adi_adrv9010_TxChannels_e.ADI_ADRV9010_TX3,Types.adi_adrv9010_DpdResetMode_e.ADI_ADRV9010_DPD_RESET_FULL) if TxChannel == 4: link.platform.board.Adrv9010Device.Dfe.DpdReset(Types.adi_adrv9010_TxChannels_e.ADI_ADRV9010_TX4,Types.adi_adrv9010_DpdResetMode_e.ADI_ADRV9010_DPD_RESET_FULL) def runExtPathDelayInitCal(chMask): initCal = Types.adi_adrv9010_InitCals_t() initCal.calMask = int(Types.adi_adrv9010_InitCalibrations_e.ADI_ADRV9010_EXTERNAL_PATH_DELAY) initCal.channelMask = chMask initCal.warmBoot = 0 print "calMask:", hex(initCal.calMask) link.platform.board.Adrv9010Device.Cals.InitCalsRun(initCal) print "Path delay cal blocking wait status:", link.platform.board.Adrv9010Device.Cals.InitCalsWait(3000, 0)[1] def getExtPathDelay(txCh): extPathDelay = Types.adi_adrv9010_ExternalPathDelay_t() retVal = link.platform.board.Adrv9010Device.Cals.ExternalPathDelayGet(txCh, extPathDelay) extPathDelay = retVal[1] print "fifoDelay:",extPathDelay.fifoDelay print "interpolationIndex:", extPathDelay.interpolationIndex def dpdTrackingCalEnable(enable = 1): print"***********************************" if(enable == 1): print"Enabling DPD Tracking Cal" link.platform.board.Adrv9010Device.Cals.TrackingCalsEnableSet(int(Types.adi_adrv9010_TrackingCalibrations_e.ADI_ADRV9010_TRACK_TX1_DPD), Types.adi_adrv9010_TrackingCalEnableDisable_e.ADI_ADRV9010_TRACKING_CAL_ENABLE) link.platform.board.Adrv9010Device.Cals.TrackingCalsEnableSet(int(Types.adi_adrv9010_TrackingCalibrations_e.ADI_ADRV9010_TRACK_TX2_DPD), Types.adi_adrv9010_TrackingCalEnableDisable_e.ADI_ADRV9010_TRACKING_CAL_ENABLE) link.platform.board.Adrv9010Device.Cals.TrackingCalsEnableSet(int(Types.adi_adrv9010_TrackingCalibrations_e.ADI_ADRV9010_TRACK_TX3_DPD), Types.adi_adrv9010_TrackingCalEnableDisable_e.ADI_ADRV9010_TRACKING_CAL_ENABLE) link.platform.board.Adrv9010Device.Cals.TrackingCalsEnableSet(int(Types.adi_adrv9010_TrackingCalibrations_e.ADI_ADRV9010_TRACK_TX4_DPD), Types.adi_adrv9010_TrackingCalEnableDisable_e.ADI_ADRV9010_TRACKING_CAL_ENABLE) else: print"Disabling DPD Tracking Cal" link.platform.board.Adrv9010Device.Cals.TrackingCalsEnableSet(int(Types.adi_adrv9010_TrackingCalibrations_e.ADI_ADRV9010_TRACK_TX1_DPD), Types.adi_adrv9010_TrackingCalEnableDisable_e.ADI_ADRV9010_TRACKING_CAL_DISABLE) link.platform.board.Adrv9010Device.Cals.TrackingCalsEnableSet(int(Types.adi_adrv9010_TrackingCalibrations_e.ADI_ADRV9010_TRACK_TX2_DPD), Types.adi_adrv9010_TrackingCalEnableDisable_e.ADI_ADRV9010_TRACKING_CAL_DISABLE) link.platform.board.Adrv9010Device.Cals.TrackingCalsEnableSet(int(Types.adi_adrv9010_TrackingCalibrations_e.ADI_ADRV9010_TRACK_TX3_DPD), Types.adi_adrv9010_TrackingCalEnableDisable_e.ADI_ADRV9010_TRACKING_CAL_DISABLE) link.platform.board.Adrv9010Device.Cals.TrackingCalsEnableSet(int(Types.adi_adrv9010_TrackingCalibrations_e.ADI_ADRV9010_TRACK_TX4_DPD), Types.adi_adrv9010_TrackingCalEnableDisable_e.ADI_ADRV9010_TRACKING_CAL_DISABLE) print"***********************************" def spiRead(address): data = adrv9010.Hal.SpiByteRead(address, 0) print "SPI Read Address " + hex(address) + ": " + hex(data[1]) def spiWrite(address, data): adrv9010.Hal.SpiByteWrite(address, data) print "SPI Write Address " + hex(address) + ": " + hex(data) #Create an Instance of the Class link = AdiEvaluationSystem.Instance connect = False if (link.IsConnected() == False): connect = True link.platform.board.Client.Connect("192.168.1.10", 55556) print "Connecting" if (link.IsConnected()): adrv9010 = link.Adrv9010Get(1) print "Connected" ##### YOUR CODE GOES HERE ##### dpdModelRestoreFromFile() resetDpdFull(1) dpdTrackingConfigSet() runExtPathDelayInitCal(0x1)# Should be 0XF for enabling path delay all four Tx channel #Run 1st after loading signal-> PA on -> Settign Tx atten and ORx gain index time.sleep(1) getExtPathDelay(Types.adi_adrv9010_TxChannels_e.ADI_ADRV9010_TX1) #Run 2nd to confirm extPathDelay ran fine dpdTrackingCalEnable(1) #Enable DPD tracking cal time.sleep(10) print "TX1" dpdStatusGet(Types.adi_adrv9010_TxChannels_e.ADI_ADRV9010_TX1) #Read back DPD Status ''' print "TX2" dpdStatusGet(Types.adi_adrv9010_TxChannels_e.ADI_ADRV9010_TX2) #Read back DPD Status print "TX3" dpdStatusGet(Types.adi_adrv9010_TxChannels_e.ADI_ADRV9010_TX3) #Read back DPD Status print "TX4" dpdStatusGet(Types.adi_adrv9010_TxChannels_e.ADI_ADRV9010_TX4) #Read back DPD Status ''' else: print "Not Connected" if (connect): link.platform.board.Client.Disconnect() print "Disconnected"