Post Go back to editing

MYKONOS_getObsRxDecPower returns 0 (Part 2)

Category: Hardware
Product Number: AD9375

Over two years ago I posted this thread:  MYKONOS_getObsRxDecPower returns 0 - Q&A - Design Support AD9371/AD9375 - EngineerZone (analog.com)

However, now that our cards have entered production, this problem seems to have come back and seems to vary from card to card, so I really need to get some better understanding of what is going on when MYKONOS_getObsRxDecPower() function is called and why it might sometimes return a 0 value.

Some basics.  FDD, Pin Control Mode, Stable Input to ORX1, MGC on RX and ORX, TX and RX always enabled.

My thread that reads the ORX value is this.

while (1)

{

Set to ORX1_MODE(1) via pin control

Sleep 20 msec

Read via MYKONOS_getObsRxDecPower(&mykDevice, &obsRxDecPower_mdBFS);

while ((obsRxDecPower_mdBFS == 0) && (counter < 100))
{

counter++;
sleep 2 msec

// Re-Read the ORX value

MYKONOS_getObsRxDecPower(&mykDevice, &obsRxDecPower_mdBFS);

}

Print calculated power, raw obsRxDecPower_mdBFS value and counter value

Sleep 200 msec

}

So, as you can see, if MYKONOS_getObsRxDecPower returns a value of 0, I increment the counter, wait 2 msec and read it again, hoping to get a non-zero value.  If I do that 100 times without getting a good value, I timeout and return an Invalid Power reading.

As you can see in the log that follows, the number of attempts required to get a non-zero value varies wildly and often exceeds 100.  If someone could please examine the ARM code implementation for MYKONOS_getObsRxDecPower and tell me the reasons why a 0 might be returned, it might help me figure out why this is not working consistently.  

The mykonos.c does say "If the receiver is disabled during the power measurement, this function returns a 0 value for rx2DecPower_mdBFS" but since I am FDD and the RX is always enabled, I don't believe that is the only possible cause of a 0 being returned.

You can also see in the log that when a non-zero value is returned it is very stable, so 0 being returned is not indicative of too high an input signal. I've also monitored the signal on a spec A and it is stable.

I've also seen that the value for pmdMeasDuration in the mykonosPowerMeasAgcCfg_t affects this.  Lower the number the less stable the reading but the counter value is noticeably lower (less 0's being returned), however, as the card warms up, the counter values increase (more 0's returned).

Thank you for any help on this matter.

returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 0
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 3
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 5
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 0
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 1
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 3
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 2
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 8
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 6
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 1
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 6
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 6
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 6
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 5
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 8
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 6
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 28
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 8
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 6
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 24
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 3
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 8
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 11
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 3
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 7
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 1
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 9
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 12
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 6
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 23
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 18
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 20
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 11
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 20
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 6
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 6
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 5
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 20
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 2
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 3
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 5
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 22
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 50
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 14
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 34
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 27
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 11
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 1
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 5
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 63
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 43
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 0
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 46
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 16
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 55
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 38
returnPower = -10000 dBx100 obsRxDecPower_mdBFS = 0 counter = 100
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 13
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 4
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 54
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 31
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 21
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 10
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 10
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 11
returnPower = -3214 dBx100 obsRxDecPower_mdBFS = 22750 counter = 72
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 17
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 37
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 7
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 39
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 27
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 81
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 34
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 59
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 74
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 9
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 33
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 69
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 1
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 18
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 19
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 74
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 2
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 33
returnPower = -10000 dBx100 obsRxDecPower_mdBFS = 0 counter = 100
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 13
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 62
returnPower = -10000 dBx100 obsRxDecPower_mdBFS = 0 counter = 100
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 6
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 17
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 97
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 29
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 16
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 18
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 9
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 46
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 23
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 46
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 6
returnPower = -10000 dBx100 obsRxDecPower_mdBFS = 0 counter = 100
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 96
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 57
returnPower = -10000 dBx100 obsRxDecPower_mdBFS = 0 counter = 100
returnPower = -10000 dBx100 obsRxDecPower_mdBFS = 0 counter = 100
returnPower = -10000 dBx100 obsRxDecPower_mdBFS = 0 counter = 100
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 62
returnPower = -10000 dBx100 obsRxDecPower_mdBFS = 0 counter = 100
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 49
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 78
returnPower = -10000 dBx100 obsRxDecPower_mdBFS = 0 counter = 100
returnPower = -10000 dBx100 obsRxDecPower_mdBFS = 0 counter = 100
returnPower = -10000 dBx100 obsRxDecPower_mdBFS = 0 counter = 100
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 28
returnPower = -10000 dBx100 obsRxDecPower_mdBFS = 0 counter = 100
returnPower = -10000 dBx100 obsRxDecPower_mdBFS = 0 counter = 100
returnPower = -10000 dBx100 obsRxDecPower_mdBFS = 0 counter = 100
returnPower = -10000 dBx100 obsRxDecPower_mdBFS = 0 counter = 100
returnPower = -10000 dBx100 obsRxDecPower_mdBFS = 0 counter = 100
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 55
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 35
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 13
returnPower = -10000 dBx100 obsRxDecPower_mdBFS = 0 counter = 100
returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 57
returnPower = -10000 dBx100 obsRxDecPower_mdBFS = 0 counter = 100

  • The dec power measurement configuration is part of AGC configuration and as you mentioned the time taken for measurement depends on the Measurement config , mykonosPowerMeasAgcCfg_t: and the sampling rate. 

    What is the measurement duration configured ? 

    Can you increase the power measurement wait time from 2 msec to 200 msec and try with counter value =100  

    Performs a power measurement in the ObsRx digital data path.
    *
    * Due to interdependencies between the AGC and power measurement the power measurement duration and
    * where the measurement is taken is variable.
    * The location of the power measurement is given by device->obsRx->obsRxAgcCtrl->obsRxPwrAgc->pmdMeasConfig
    * The number of samples the power measurement uses is given by 8*2^(device->obsRx->obsRxAgcCtrl->obsRxPwrAgc->pmdMeasConfig) at the IQ rate,
    * if measured at RFIR output. This number of samples must be less than the agcGainUpdateCounter.
    * If the receiver is disabled during the power measurement, this function returns a 0 value for rx2DecPower_mdBFS
    *
    * The resolution of this function is 0.25dB.
    * The dynamic range of this function is 40dB. Signals lower than 40dBFS may not be measured accurately.

  • For the test above, the pmdMeasDuration was set to 11d. 8*2^11 = 16384 / 64M IQ Rate = 256 usec. So the wait time of 2 msec is 8x the required measurement time. I can try your suggested test.

    If I set pmdMeasDuration to 6d things get better but still a 0 is frequently returned especially as the card warms up. I've read the code comment you posted above dozens of times hoping to see a different clue, but as I stated this is FDD mode so the receiver is never disabled, at least by my code. I've read in the TRM that when using PIN Control mode, the ARM can not "steal" the ORX for INTERNAL CALS, I've run my test never toggling out of ORX mode and it did not help.

    I was really hoping someone at ADI could examine the ARM code implementation for the MYKONOS_getObsRxDecPower function and document for us the conditions under which a 0 is returned. For example, I could see a case where the sum of the IQ data samples were to overflow the accumulator then you'd want to return a 0 to indicate an invalid reading.

  • I increased the wait time from 2msec to 200msec and the behavior did not appear to change other than the increased wait times.  Here is a log showing almost 2 second waits in some cases.  Also, I should note that this problem is definitely temperature dependent, as the card warms up from ambient, the number of retries steadily increases.

    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 0
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 0
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 2
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 2
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 0
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 1
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 2
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 0
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 1
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 0
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 1
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 0
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 1
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 1
    returnPower = -3214 dBx100 obsRxDecPower_mdBFS = 22750 counter = 5
    returnPower = -3214 dBx100 obsRxDecPower_mdBFS = 22750 counter = 5
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 4
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 2
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 0
    returnPower = -3214 dBx100 obsRxDecPower_mdBFS = 22750 counter = 2
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 0
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 0
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 0
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 1
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 8
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 0
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 0
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 5
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 0
    returnPower = -3214 dBx100 obsRxDecPower_mdBFS = 22750 counter = 0
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 1
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 9
    returnPower = -3214 dBx100 obsRxDecPower_mdBFS = 22750 counter = 6
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 0
    returnPower = -3214 dBx100 obsRxDecPower_mdBFS = 22750 counter = 0

  • From the log looks like you are able to read the ORX Dec power correctly after increasing the wait time to 200msec.

    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 0
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 0
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 2
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 2
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 0
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 1
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 2
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 0
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 1
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 0
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 1
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 0
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 1
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 1
    returnPower = -3214 dBx100 obsRxDecPower_mdBFS = 22750 counter = 5
    returnPower = -3214 dBx100 obsRxDecPower_mdBFS = 22750 counter = 5
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 4
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 2
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 0
    returnPower = -3214 dBx100 obsRxDecPower_mdBFS = 22750 counter = 2
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 0
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 0
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 0
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 1
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 8
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 0
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 0
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 5
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 0
    returnPower = -3214 dBx100 obsRxDecPower_mdBFS = 22750 counter = 0
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 1
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 9
    returnPower = -3214 dBx100 obsRxDecPower_mdBFS = 22750 counter = 6
    returnPower = -3189 dBx100 obsRxDecPower_mdBFS = 22500 counter = 0
    returnPower = -3214 dBx100 obsRxDecPower_mdBFS = 22750 counter = 0

    Is it a CW or modulated signal that you are testing with to measure the Dec power?

  • We may have found the root cause of the issue.  Over time we had changed the clocking scheme for this waveform and along the way the config structure orxAdcCustom was not correctly updated.  It was from an older config with a slower clock rate.  Apparently that can result in the MYKONOS_getObsRxDecPower() call returning a 0 and being temperature sensitive.