Post Go back to editing

RX NCO Shifter API fails with CPU exception

Category: Software
Product Number: ADRV9026


I set my LO1 to 1.0GHz, and hoping to tune to a carrier at, say 1030MHz by programming the RX band A NCO1 with a shifter setting of 30MHz. Here is what my config and api call look like

adi_adrv9025_RxNcoShifterCfg_t rxShiftConfig = {

.bandAInputBandWidth_kHz = 100000, // 100MHz RX input BW

.bandAInputCenterFreq_kHz = 1000000, // 1.0GHz OSC1

.bandANco1Freq_kHz = 30000,

.bandANco2Freq_kHz = 0,

.bandBInputBandWidth_kHz = 0,

.bandBInputCenterFreq_kHz = 0,

.bandBNco1Freq_kHz = 0,

.bandBNco2Freq_kHz = 0,

.bandAbCombinedEnable = 0


adi_adrv9025_RxNcoShifterSet(adrv9025Device, channel, rxShiftConfig, ADI_ADRV9025_RXDDC_BYPASS, ADI_ADRV9025_BAND_A_NCO_1);

When I run this program, I always get a timeout:

adi_adrv9025_CpuCmdWrite.1308: cpuCommandBusy = 0
adi_adrv9025_CpuCmdStatusWait.1115: CPU event checks exceeded max 1000
adi_adrv9025_CpuCmdStatusWait.1137: CPU exception ffffffff

Previously I tried to tune the LO1 to my desired frequency, and it had the similar issue. The guide suggests I cannot move my LO1 frequency rapidly on the fly, unless I go through calibration. So I figured, digital down conversion with NCO1/NCO2 must be the way to do yet. But I am still having issues calling the API. I run Madura Initialization from the example driver, which works fine, along with initialization. I am also able to receive correct IQ data over jesd to the FPGA. So all other setup for 9026 are correct, as loaded from ActiveUserProfile.

Please let me know if I am doing something wrong here, or the best way to tune to a center frequency for baseband data.


  • .bandAInputCenterFreq_kHz = 1000000, // 1.0GHz OSC1

    The NCO configuration is incorrect.

    This is how the NCO shifting works:

    If the LO is at 3.5GHz and incoming RF is at 3.51GHz, the mixer output would be at +10MHz offset and to bring back this signal at DC, you would need -10MHz shift that is done by NCO. See below for example configuration.

    Bandwidth is the incoming signal BW. 

    rxNcoShifterCfg.bandAInputBandWidth_kHz   = 10000;  # Input signal BW  

    rxNcoShifterCfg.bandAInputCenterFreq_kHz  = 10000;  # after down conversion 
    rxNcoShifterCfg.bandANco1Freq_kHz         = -10000; # To shift the signal at DC
    In your case, it has to be like this:

    rxNcoShifterCfg.bandAInputBandWidth_kHz   = 10000;  # Please have your signal BW (Not profile BW) configured in kHz here

    rxNcoShifterCfg.bandAInputCenterFreq_kHz  = 30000;  # after down conversion 
    rxNcoShifterCfg.bandANco1Freq_kHz         = -30000; # To shift the signal at DC
  • Thanks so much for the clarification. I am still getting CPU exception. I think that's a different problem. After initialization is done, I cannot issue any API command that involves a CPU instruction. They always fail with an exception (as shown in my main post). For example if I call something as simple as adi_adrv9025_pllFrequencyGet, it has the same exception. A second attempt reports CPU busy. I will post this issue as a new question, unless you are aware of it and point me to the solution. But I am sure your suggestion on NCO shift would work once that other problem is resolved. Thanks again.
    - Regards