This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AWR2944EVM: Adv chirp config TX4 does not transmit signal

Part Number: AWR2944EVM
Hi experts,
In ccs, I want to achieve adv chirp config(only one sub-frame),adv chirp config refer to MMWL_advChirpConfigAll()(C:\ti\mmwave_dfp_02_02_03_01\ti\example\mmWaveLink_SingleChip_Example  mmw_example.c) Collect ADC data through DCA1000, found a problem with a TX。Discovered by testing,there is no problem with the LUT value setting. We enable TX1 TX2 TX3  separately,the transmitted waveform is captured by the instrument . Only enable TX4,the instrument  can not capture the transmitted waveform. How should I solve this problem?
I use the SDK Version(mmwave_mcuplus_sdk_04_02_00_02-Windows)
In rI_device.c ,I  modify the function of rlDevSetFillLUTBuff(). I add the TX4 and gmake ,no error 
                         Figure 1
/** @fn rlReturnVal_t rlDevSetFillLUTBuff(rlFillLUTParams_t *fillLUTParams, rlInt8_t *inData, 
                                          rlInt8_t *outData, rlUInt16_t *LUTAddrOffset)
*
*   @brief Filling chirp LUT parameter buffer for Advanced chirp configuration
*   @param[in] fillLUTParams - Pointer to structure used for filling chirp LUT parameter buffer
*   @param[in] inData - Pointer to Input chirp parameter buffer
*   @param[in] outData - Pointer to chirp LUT parameter buffer filled with input chirp param data
*   @param[in] LUTAddrOffset - Pointer to offset within the chirp LUT parameter buffer for which 
*                              input chirp param data is filled.
*
*   @return rlReturnVal_t Success - 0, Failure - Error Code
*
*   This API is used to fill chirp LUT parameter buffer for Advanced chirp configuration.
*
*   @note 1: This API is supported only in AWR2243. \n
*   @note 2: This API doesn't send any command to device over SPI. Application needs to invoke 
*            this API to fill up the LUT buffer for each type of chirpParamIndex. Finally, use 
*            this filled buffer to pass it to \ref rlSetAdvChirpLUTConfig API \n
*/
/* DesignId : MMWL_DesignId_132 */
/* Requirements : AUTORADAR_REQ-1050 */
/*AR_CODE_REVIEW MR:R.2.2 <INSPECTED> "addrOffset is assigned based on different conditions"*/
/*LDRA_INSPECTED 8 D */
rlReturnVal_t rlDevSetFillLUTBuff(rlFillLUTParams_t *fillLUTParams, rlInt8_t *inData, 
                                  rlInt8_t *outData, rlUInt16_t *LUTAddrOffset)
{
    rlReturnVal_t retVal = RL_RET_CODE_OK;
    rlUInt16_t addrOffset = 0U;
    rlUInt16_t idx, alignIdx;

    RL_LOGV_ARG0("rlDevSetFillLUTBuff starts...\n");

    /* check if input parameters are valid */
    if ((RL_NULL_PTR == fillLUTParams) || (RL_NULL_PTR == outData) || \
        (RL_NULL_PTR == inData) || (RL_NULL_PTR == LUTAddrOffset))
    {
        /* set return error code */
        retVal = RL_RET_CODE_INVALID_INPUT;
        RL_LOGE_ARG0("rlDevSetFillLUTBuff, Invalid input parameters\n");
    }
    else
    {
        /* Profile ID */
        if (fillLUTParams->chirpParamIndex == RL_LUT_CHIRP_PROFILE_VAR)
        {
            for (idx = 0U; idx < fillLUTParams->inputSize; idx++)
            {
                if ((idx % 2U) == 0U)
                {
                    /*AR_CODE_REVIEW MR:R.18.1 <INSPECTED> "Accessing pointer as array"*/
                    /*LDRA_INSPECTED 436 S */ /*LDRA_INSPECTED 436 S */ /*LDRA_INSPECTED 444 S */
                    outData[idx/2] = (rlInt8_t)(((rlUInt8_t)inData[idx]) & 0xFU);
                }
                else
                {
                    /*AR_CODE_REVIEW MR:R.18.1 <INSPECTED> "Accessing pointer as array"*/
                    /*LDRA_INSPECTED 436 S */ /*LDRA_INSPECTED 436 S */ /*LDRA_INSPECTED 444 S */
                    /*AR_CODE_REVIEW MR:R.10.1, 10.2 <INSPECTED> "outData cannot be -ve"*/
                    /*LDRA_INSPECTED 329 S */
                    outData[idx/2] |= (rlInt8_t)((((rlUInt8_t)inData[idx]) & 0xFU) << 4U);
                }
            }
            addrOffset = ((rlUInt16_t)(fillLUTParams->inputSize - 4U) % 4U) + \
                                                                     fillLUTParams->inputSize;
            alignIdx = fillLUTParams->inputSize;
            /* fill up the remaining bytes to make it 4 bytes aligned */
            for (idx = alignIdx; idx < addrOffset; idx++)
            {
                /*AR_CODE_REVIEW MR:R.18.1 <INSPECTED> "Accessing pointer as array"*/
                /*LDRA_INSPECTED 436 S */
                outData[idx] = 0;
            }
        }
        /* Start Frequency */
        else if (fillLUTParams->chirpParamIndex == RL_LUT_CHIRP_FREQ_START_VAR)
        {
            /* 4 Bytes of size */
            if (fillLUTParams->chirpParamSize == 0U)
            {
                (void)memcpy(outData, inData, fillLUTParams->inputSize * 4U);
                addrOffset = fillLUTParams->inputSize * 4U;
                alignIdx = fillLUTParams->inputSize * 4U;
            }
            /* 2 Bytes of size */
            else if (fillLUTParams->chirpParamSize == 1U)
            {
                (void)memcpy(outData, inData, fillLUTParams->inputSize * 2U);
                addrOffset = ((rlUInt16_t)((fillLUTParams->inputSize * 2U) - 4U) % 4U) + \
                                                                (fillLUTParams->inputSize * 2U);
                alignIdx = fillLUTParams->inputSize * 2U;
            }
            /* 1 Bytes of size */
            else if (fillLUTParams->chirpParamSize == 2U)
            {
#ifndef MMWL_BIG_ENDIAN
                (void)memcpy(outData, inData, fillLUTParams->inputSize);
#else
                /* For the big-endian host, we need to swap each of the 2 bytes */
                for (idx = 0U; idx < fillLUTParams->inputSize; idx += 2U)
                {
                    outData[idx + 1U] = inData[idx];
                    outData[idx] = inData[idx + 1U];
                }
#endif
                addrOffset = ((rlUInt16_t)(fillLUTParams->inputSize - 4U) % 4U) + \
                                                                   fillLUTParams->inputSize;
                alignIdx = fillLUTParams->inputSize;
            }
            /* Invalid chirp param size */
            else
            {
                /* set return error code */
                retVal = (rlReturnVal_t)RL_RET_CODE_LUT_CHIRP_PAR_SCALE_SIZE_INVALID;
                RL_LOGE_ARG0("rlDevSetFillLUTBuff, Invalid chirp parameter size\n");
                addrOffset = 0U;
                alignIdx = 0U;
            }
            /* fill up the remaining bytes to make 4 bytes aligned */
            for (idx = alignIdx; idx < addrOffset; idx++)
            {
                /*AR_CODE_REVIEW MR:R.18.1 <INSPECTED> "Accessing pointer as array"*/
                /*LDRA_INSPECTED 436 S */
                outData[idx] = 0;
            }
        }
        /* Frequency Slope */
        else if (fillLUTParams->chirpParamIndex == RL_LUT_CHIRP_FREQ_SLOPE_VAR)
        {
            (void)memcpy(outData, inData, fillLUTParams->inputSize);
            addrOffset = ((rlUInt16_t)(fillLUTParams->inputSize - 4U) % 4U) + \
                                                                  fillLUTParams->inputSize;
            alignIdx = fillLUTParams->inputSize;
            /* fill up the remaining bytes to make 4 bytes aligned */
            for (idx = alignIdx; idx < addrOffset; idx++)
            {
                /*AR_CODE_REVIEW MR:R.18.1 <INSPECTED> "Accessing pointer as array"*/
                /*LDRA_INSPECTED 436 S */
                outData[idx] = 0;
            }
        }
        /* Idle Time / ADC Start Time */
        else if ((fillLUTParams->chirpParamIndex == RL_LUT_CHIRP_IDLE_TIME_VAR) || \
                 (fillLUTParams->chirpParamIndex == RL_LUT_CHIRP_ADC_START_TIME_VAR))
        {
            /* 2 Bytes of size */
            if (fillLUTParams->chirpParamSize == 0U)
            {
                (void)memcpy(outData, inData, fillLUTParams->inputSize * 2U);
                addrOffset = ((rlUInt16_t)((fillLUTParams->inputSize * 2U) - 4U) % 4U) + \
                                                                (fillLUTParams->inputSize * 2U);
                alignIdx = fillLUTParams->inputSize * 2U;
            }
            /* 1 Bytes of size */
            /*AR_CODE_REVIEW <INSPECTED> "If condition is necessary" */
            /*LDRA_INSPECTED 370 S */
            else if (fillLUTParams->chirpParamSize == 1U)
            {
#ifndef MMWL_BIG_ENDIAN
                (void)memcpy(outData, inData, fillLUTParams->inputSize);
#else
                /* For the big-endian host, we need to swap each of the 2 bytes */
                for (idx = 0U; idx < fillLUTParams->inputSize; idx += 2U)
                {
                    outData[idx + 1U] = inData[idx];
                    outData[idx] = inData[idx + 1U];
                }
#endif
                addrOffset = ((rlUInt16_t)(fillLUTParams->inputSize - 4U) % 4U) + \
                                                                      fillLUTParams->inputSize;
                alignIdx = fillLUTParams->inputSize;
            }
            /* Invalid chirp param size */
            else
            {
                /* set return error code */
                retVal = (rlReturnVal_t)RL_RET_CODE_LUT_CHIRP_PAR_SCALE_SIZE_INVALID;
                RL_LOGE_ARG0("rlDevSetFillLUTBuff, Invalid chirp parameter size\n");
                addrOffset = 0U;
                alignIdx = 0U;
            }
            /* fill up the remaining bytes to make 4 bytes aligned */
            for (idx = alignIdx; idx < addrOffset; idx++)
            {
                /*AR_CODE_REVIEW MR:R.18.1 <INSPECTED> "Accessing pointer as array"*/
                /*LDRA_INSPECTED 436 S */
                outData[idx] = 0;
            }
        }
        /* Tx Enable / BPM Enable */
        else if ((fillLUTParams->chirpParamIndex == RL_LUT_CHIRP_TX_EN_VAR) || \
                 (fillLUTParams->chirpParamIndex == RL_LUT_CHIRP_BPM_VAL_VAR))
        {
            for (idx = 0U; idx < fillLUTParams->inputSize; idx++)
            {
                /*AR_CODE_REVIEW <INSPECTED> "If condition is necessary" */
                /*LDRA_INSPECTED 370 S */
                if ((idx % 2U) == 0U)
                {
                    /*AR_CODE_REVIEW MR:R.18.1 <INSPECTED> "Accessing pointer as array"*/
                    /*LDRA_INSPECTED 436 S */ /*LDRA_INSPECTED 436 S */ /*LDRA_INSPECTED 444 S */
                    outData[idx/2] = (rlInt8_t)(((rlUInt8_t)inData[idx]) & 0x7U);
                }
                else
                {
                    /*AR_CODE_REVIEW MR:R.18.1 <INSPECTED> "Accessing pointer as array"*/
                    /*LDRA_INSPECTED 436 S */ /*LDRA_INSPECTED 436 S */ /*LDRA_INSPECTED 444 S */
                    /*AR_CODE_REVIEW MR:R.10.1, 10.2 <INSPECTED> "outData cannot be -ve"*/
                    /*LDRA_INSPECTED 329 S */
                    outData[idx/2] |= (rlInt8_t)((((rlUInt8_t)inData[idx]) & 0x7U) << 4U);
                }
            }
            addrOffset = ((rlUInt16_t)(fillLUTParams->inputSize - 4U) % 4U) + \
                                                                  fillLUTParams->inputSize;
            alignIdx = fillLUTParams->inputSize;
            /* fill up the remaining bytes to make 4 bytes aligned */
            for (idx = alignIdx; idx < addrOffset; idx++)
            {
                /*AR_CODE_REVIEW MR:R.18.1 <INSPECTED> "Accessing pointer as array"*/
                /*LDRA_INSPECTED 436 S */
                outData[idx] = 0;
            }
        }
        /* TX0/TX1/TX2 Phase shifter */
        /*AR_CODE_REVIEW <INSPECTED> "If condition is necessary" */
        /*LDRA_INSPECTED 370 S */
        else if ((fillLUTParams->chirpParamIndex == RL_LUT_TX0_PHASE_SHIFT_VAR) || \
                 (fillLUTParams->chirpParamIndex == RL_LUT_TX1_PHASE_SHIFT_VAR) || \
                 (fillLUTParams->chirpParamIndex == RL_LUT_TX2_PHASE_SHIFT_VAR) || \
                 (fillLUTParams->chirpParamIndex == RL_LUT_TX3_PHASE_SHIFT_VAR))
        {
            for (idx = 0U; idx < fillLUTParams->inputSize; idx++)
            {
                /*AR_CODE_REVIEW MR:R.18.1 <INSPECTED> "Accessing pointer as array"*/
                /*LDRA_INSPECTED 436 S */ /*LDRA_INSPECTED 436 S */ /*LDRA_INSPECTED 444 S */
                outData[idx] = (rlInt8_t)(((rlUInt8_t)inData[idx]) << 2U);
            }

            addrOffset = ((rlUInt16_t)(fillLUTParams->inputSize - 4U) % 4U) + \
                                                                  fillLUTParams->inputSize;
            alignIdx = fillLUTParams->inputSize;
            /* fill up the remaining bytes to make 4 bytes aligned */
            for (idx = alignIdx; idx < addrOffset; idx++)
            {
                /*AR_CODE_REVIEW MR:R.18.1 <INSPECTED> "Accessing pointer as array"*/
                /*LDRA_INSPECTED 436 S */
                outData[idx] = 0;
            }
        }
        /* Invalid chirp parameter index */
        else
        {
            /* set return error code */
            retVal = (rlReturnVal_t)RL_RET_CODE_CHIRP_PARAM_IND_INVALID;
            RL_LOGE_ARG0("rlDevSetFillLUTBuff, Invalid chirp parameter index\n");
        }
    }

    if (retVal == RL_RET_CODE_OK)
    {
        /* Update the chirp LUT address offset */
        /*AR_CODE_REVIEW MR:R.18.1 <INSPECTED> "addrOffset is always greater than zero"*/
        /*LDRA_INSPECTED 124 D */
        *LUTAddrOffset = addrOffset + fillLUTParams->lutGlobalOffset;
    }

    RL_LOGV_ARG0("rlDevSetFillLUTBuff ends...\n");

    return retVal;
}