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.

[参考译文] CCS/AWR1642BOOST:通过 UART 代码传输的 ADC 数据不起作用。

Guru**** 2612355 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/669105/ccs-awr1642boost-adc-data-over-uart-code-not-working

器件型号:AWR1642BOOST

工具/软件:Code Composer Studio

您好!  

我编辑了从 tirex 获取的 MMW_DSS_16xx 毫米波演示代码中的 dss_main.c 中的'mwDemo_dsDataPathProcessEvents '函数。 我希望通过 UART 数据端口推送乒乓 ADC 缓冲器数据。 我在配置文件配置中提供了大量空闲时间、每帧仅传输1个线性调频脉冲。

问题:在"Data COM terminal (数据 COM 终端)"窗口中看不到任何内容。

此外、

1.我没有遇到任何编译错误。

2.我没有遇到任何运行时错误。

3.我没有遇到任何线性调频脉冲或帧截止中断。

4.我可以在统计数据中看到我的帧数在稳步增加。

因此、代码在任何时候都不会卡住。 因此、我怀疑'UART_writePolling'调用中存在一些错误。  

 DataPathProcessEvents 代码如下所示。 请帮助我找到上述观察的原因。

#define pingPongId (x)((x)和0x1U)
#define isPong (x)(pingPongId (x)

) static Int32_t MmwDemo_dsDataPathProcessEvents (UINT 事件)
{
MmwDemo_DSS_DataPathObj * dataPathObj;
volatile uint32_t StartTime;

dataPathObj =&gMmwDssMCB.dataPathObj[gMmwDssMCB.subFrameIndx];

/*处理 dataPath 事件*/
switch (事件)
{
案例 MMWDEMO_CHIRP_EVT:

/*递增事件统计数据*/
gMmwDssMCB.stats.chirpEvt++;
uint16_t 线性调频脉冲指数;
对于(线性调频脉冲指数= 0;线性调频脉冲指数< dataPathObj->numChirpsPerChirpEvent;线性调频脉冲指数++)
{
//MmwDemo_processChirp (dataPathObj、(uint16_t)线性调频脉冲索引);

volatile uint32_t startTime2;
startTime2 = Cycleprofiler_getTimeStamp();
gCycleLog.interChirpWaitTime += Cycleprofiler_getTimeStamp()- startTime2;
if (isPong (dataPathObj->chirpCount))//从 Pong 传输
{
UART_writePolling (gMmwDssMCB.loggingUartHandle、(uint8_t *)&dataPathObj->ADCdataBuf[0]、(uint32_t) sizeof (uint32_t)*(dataPathj->numAdcSamples)*(dataPath->NumRj);(dataPathNumRj)


其他 //从 Ping 传输
{
UART_writePolling (gMmwDssMCB.loggingUartHandle、(uint8_t *)&dataPathObj->ADCdataBuf[dataPathObj->numChirpsPercrampEvent* dataPathObj->numAdcSamples]、(uint32_t)(numPathObj->numPath-32_t))*

dataPathObj->chirpCount++;
dataPathObj->txAntennaCount++;
if (dataPathObj->txAntennaCount => dataPathObj->numTxAntennaCount)
{
dataPathObj->txAntennaCount = 0;
dataPathObj->dopplerBinCount++;
if (dataPathObj->dopplerBinCount => dataPathObj->numDopplerBins)
{
dataPathObj->dopplerBinCount = 0;
dataPathObj->chirpCount = 0;
}
}

gMmwDssMCB.dataPathContext.chirpProcToken--;
dataPathObj->timingInfo.chirpProcessingEndTime =循环分析器_getTimeStamp();


if (dataPathObj->chirpCount = 0)
{
//MmwDemo_waitEndOfChirps (dataPathObj);
load_update();
dataPathObj->timingInfo.activeFrameCPULoad = Load_getCPULoad();

dataPathObj->cycleLog.interChirpProcessingTime = gCycleLog.interChirpProcessingTime;
dataPathObj->cycleLog.interChirpWaitTime = gCycleLog.interChirpWaitTime;
gCycleLog.interChirpProcessingTime = 0;
gCycleLog.interChirpWaitTime = 0;

StartTime = Cycleprofiler_getTimeStamp();
// MmwDemo_interFrameProcessing (dataPathObj);

dataPathObj->timingInfo.interFrameProcCycles =(Cyclprofiler_getTimeStamp ()- StartTime);

dataPathObj->cycleLog.interFrameProcessingTime = gCycleLog.interFrameProcessingTime;
dataPathObj->cycleLog.interFrameWaitTime = gCycleLog.interFrameWaitTime;
gCycleLog.interFrameProcessingTime = 0;
gCycleLog.interFrameWaitTime = 0;
gMmwDssMCB.dataPathContext.interFrameProcToken=0;

if (dataPathObj->CommonclipCfg->measureRxChanCfg.enabled)
{
MmwDemo_measureResultOutput (dataPathObj);
}


//MmwDemo_dsDataPathOutputLogging (dataPathObj);//将检测到的对象发送到日志缓冲区
dataPathObj->timingInfo.interFrameProcessingEndTime = Cycleprofiler_getTimeStamp();
}
中断;

案例 MMWDEMO_FRAMESTART_EVT:
/*递增事件统计数据*/
gMmwDssMCB.stats.frameStartEvt++;
load_update();
dataPathObj->timingInfo.interFrameCPULoad = Load_getCPULoad();
MmwDemo_dsAssert (dataPathObj->chirpCount =0);
中断;

案例 MMWDEMO_BSS_FRAME_TRIGGER_READY_EVT:
/*递增事件统计数据*/
gMmwDssMCB.stats.frameTrigEvt++;
中断;

默认值:
中断;
}
返回0;
}


谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我建议您在 dss_main.c 中查看函数 MmwDemo_dsProcessSendOutputToMSS()。 此函数显示如何格式化要通过 UART 发送的数据。

    您可以将同一页眉与您的特定有效载荷一起使用。

    谢谢你
    Cesar
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Cesar、

    如果我理解正确、我将不得不设计一个 TLV 来发送数据。 此 TLV 将把指向 ADC 缓冲器的指针作为 tlv.address、然后它将在 MSS 接收、MSS 会调用 UART_writePolling 以从 tlv.address 传输数据(类似于现有的范围 Mag TLV 以传输范围 MAG 数据)。 我们是否在本质上与我在上述代码中所做的相同? 您还能解释以下代码如何将消息中的 ptrMatrix (指向 L3中的范围 MAG 数据的位置)传递给 MSS。

    if (pGuiMonSel->logMagRange = 1)
    {
    itemPayloadLen = sizeof (uint16_t)* obj->numRangeBins;
    totalHsmSize += itemPayloadLen;
    if (totalHsmSize > outputBufSize)
    {
    RetVal =-1;
    转至退出;
    }
    
    uint16_t * ptrMatrix =(uint16_t *) ptrCurrent Buffer;//将8位指针键入16位指针
    for (i = 0;i < obj->numRangeBins;i++)
    {
    ptrMatrix [i]= obj->detMatri[i*obj->numDopplerBins];
    }
    
    message.body.detObj.tlv[tlvIdx].length = itemPayloadLen;
    message.body.detObj.tlv[tlvIdx].type = MMWDEMO_OUTPUS_MSG_RANGE_PROFILE;
    message.body.detObj.tlv[tlvIdx].address =(uint32_t) ptrCurrent Buffer;
    tlvIdx++;
    
    /*递增指向 HSM 缓冲区的指针*/
    ptrCurrent Buffer =(uint8_t *)((uint32_t) ptrHsmBuffer + totalHsmSize);
    totalPacketLen += sizeof (MmwDemo_output_message_tl)+ itemPayloadLen;
    }
    

    此外、请检查我是否在代码行28中正确指向 UART_writePolling 调用中的 ADC 缓冲区。 这可能是导致问题的原因。

    谢谢、

    Shailesh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    L3存储器在 MSS 和 DSS 之间共享、因此 MSS 可以直接从 L3读取。

    谢谢你
    Cesar
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否意味着 UART 无法在毫米波演示中访问 ADC 缓冲器? 我可以使用 USART 通过使用 L3 RAM 的基址调用上述函数来访问 L3 RAM 吗?

    谢谢、
    Shailesh
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    MSS 无法访问 DSP 存储器 L1D 和 L2。 UART 将无法直接从 L1D 和 L2存储器传输缓冲器。

    正如您在函数 MmwDemo_dsSendProcessOutputToMSS()中看到的那样,如果缓冲区在 L1D 或 L2中,则必须首先将其复制到 HSM 内存中。

    例如,请查看为传输 MmwDemo_dssSendProcessOutputToMSS()中的距离系统配置缓冲区而实现的代码。 首先将缓冲区复制到 HSM 存储器。

    我们建议您按照此 ADC 缓冲器示例进行操作

    谢谢你
    Cesar
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Cesar、

    在讨论之后、我编辑了噪声曲线 tlv、而是指向 radarCube。 我将在串行端口上获得预期大小的数据。 我可以将1D FFT 数据与数据包的其余部分分离。 现在、我如何在 MATLAB 中将其转换为复数 FFT 形式。 我想知道1D FFT 信息是如何存储在雷达立方体空间中的。 我正在修改噪声曲线 tlv、如下所示:

    if (pGuiMonSel->noeProfile = 1)
    {
    uint32_t maxDopIdx = obj->numDopplerBins/2 -1;
    itemPayloadLen = sizeof (cmplx16Reim_t)* obj->numRangeBins;
    totalHsmSize += itemPayloadLen;
    if (totalHsmSize > outputBufSize)
    {
    RetVal =-1;
    转至退出;
    }
    
    cmplx16Reim_t * ptrMatrix =(cmplx16Reim_t *) ptrCurrent Buffer;
    for (i = 0;i < obj->numRangeBins;i++)
    {
    ptrMatrix [i]= obj->radarCube [i*obj->numDopplerBins + maxDopIdx];
    }
    
    message.body.detObj.tlv[tlvIdx].length = itemPayloadLen;
    message.body.detObj.tlv[tlvIdx].type = MMWDEMO_OUTPUS_MSG_Noise_profile;
    message.body.detObj.tlv[tlvIdx].address =(uint32_t) ptrCurrent Buffer;
    tlvIdx++;
    
    /*递增指向 HSM 缓冲区的指针*/
    ptrCurrent Buffer =(uint8_t *)((uint32_t) ptrHsmBuffer + totalHsmSize);
    totalPacketLen += sizeof (MmwDemo_output_message_tl)+ itemPayloadLen;
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1D FFT 信息以中所述的格式存储在数据立方体中

    C:\ti\mmwave_sdk_01_00_02\packages/ti\demo\xwr16xx\mmw\docs\doxygen\html

    单击"index.html"

    请参阅"数据路径-第一维度 FFT 处理"部分

    谢谢你
    Cesar
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我想知道每个 Range bin 的实部和虚部是如何存储的。 由于数据类型为 cmplx16Reim_t、因此我希望每个 bin 都是32位(前16位实数和后16位虚数)。 另外、雷达立方体中1D FFT 数据的 Q 系数是多少?

    谢谢、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    正确,格式为 Q15 (RE 16位,IM 16位)

    演示文档对此进行了介绍

    谢谢你
    Cesar