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/AWR1642:有关 Adv-Frame 配置的问题

Guru**** 2540720 points


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

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/608681/ccs-awr1642-question-about-adv-frame-configuration

器件型号:AWR1642

工具/软件:Code Composer Studio

你好!  

我不知道如何配置 Awr's Ad-frame。TI 可以提供一些代码,或者在哪里可以找到有关该过程的一些信息?

现在, 我想将两个子帧组合为一个帧。 每个子帧有32个唯一的线性调频脉冲(32个线性调频脉冲仅用于测试)、因此最终的总帧有64个线性调频脉冲。我尝试修改 TI 提供的 mmWave_sdk_01_00_00_05版本的 mmwave-demo。  请帮助我检查该流程是否正确。

1)、调用名为 MmwDemo_notifySensorStop()的函数;停止传感器

2),按 如下方式填充 gMmwMssMCB 结构(我只粘贴部件代码段):

/ /
/ /rlFrameCfg_t

frameCfg1;
rlFrameCfg_t frameCfg2;
uint16_t ChirpCnt = 0;


frameCfg->chirpStartIdx = 0;
frameCfg->chirpEndIdx = 31;
frameCfg->numLoops = 1;
frameCfg->numFrames = 0;
frameCfg->framePeriodicity = 100 * 1000000 / 5;
frameCfg->triggerSelect = 1;//基于软件 API 的触发
frameCfg->frameTriggerDelay = 0 * 1000000/5;


profileCfg1.profileId = 0;
profileCfg1.startFreqConst =(uint32_t)(77 *(1U << 26)/ 3.6);
profileCfg1.idleTimeConst =(uint32_t)((float) 7 * 1000 / 10);
profileCfg1.adcStartTimeConst =(uint32_t)((float) 7 * 1000 / 10);
profileCfg1.rampEndTime =(uint32_t)((float) 58 * 1000 / 10);
profileCfg1.txOutPowerBackoffCode = 0;
profileCfg1.txPhaseShifter = 0;
profileCfg1.freqSlopeConst =(uint32_t)(0.1 *(1U << 26)/(3.6*1e3*900));//(uint32_t)(68 *(1U << 26)/(3.6 1e3*900));/2^26 * 1e6/((3.6 tx1e9) g900) profileStartTime*1*1
=(uint32_t)((float) 1 * 1000 / 10);
profileCfg1.numAdcSamples = 256;
profileCfg1.digOutSampleRate = 5500;
profileCfg1.hpfCornerFreq1 = 0;
profileCfg1.hpfCornerFreq2 = 0;
profileCfg1.rxGain = 30;


profileCfg2.profileId = 1;
profileCfg2.startFreqConst =(uint32_t)(78 *(1U << 26)/ 3.6);
profileCfg2.idleTimeConst =(uint32_t)((float) 7 * 1000 / 10);
profileCfg2.adcStartTimeConst =(uint32_t)((float) 7 * 1000 / 10);
profileCfg2.rampEndTime =(uint32_t)((float) 58 * 1000 / 10);
profileCfg2.txOutPowerBackoffCode = 0;
profileCfg2.txPhaseShifter = 0;
profileCfg2.freqSlopeConst =(uint32_t)(0.1 *(1U << 26)/(3.6*1e3*900));//(uint32_t)(68 *(1U << 26)/(3.6 1e3*900));/2^26 * 1e6/((3.6 tx1e9) g900) profileStartTime*2*2
=(uint32_t)((float) 1 * 1000 / 10);
profileCfg2.numAdcSamples = 256;
profileCfg2.digOutSampleRate = 5500;
profileCfg2.hpfCornerFreq1 = 0;
profileCfg2.hpfCornerFreq2 = 0;
profileCfg2.rxGain = 30;


/*第一个轮廓卷积*/
for (ChirpCnt = 0;ChirpCnt < 32;ChirpCnt ++){
/*填充线性调频脉冲配置:*/
chirpCfg.chirpStartIdx = ChirpCnt;
chirpCfg.chirpEndIdx = ChirpCnt;
chirpCfg.profileId = 0;
啁啾 Cfg.startFreqVar =(uint32_t)((((ChirpCnt)*10e6)*((uint64_t)(1<<26)))/(3.6*1e9));
chirpCfg.freqSlopeVar =(int16_t)(0 *((uint64_t)(1<<26))/((uint64_t)(3.6*1e9*900));
线性调频脉冲 Cfg.idleTimeVar =(uint32_t)((float) 0 * 1000 / 10);
啁啾 Cfg.adcStartTimeVar =(uint32_t)((float) 0 * 1000 / 10);
啁啾 Cfg.txEnable = 1;
/*获取要添加线性调频脉冲的配置文件句柄:*/
IF (MMWAVE_getProfileHandle (gMmwMssMCB.ctrlHandle、chirpCfg.profileId、
profileHandle、&errCode)< 0)
{
/*错误:无法获取配置文件句柄。 返回错误代码*/
返回错误代码
;}

/*将线性调频脉冲添加到配置文件中*/
if (mmwave_addChirp (profileHandle、&chirpCfg、&errCode)=NULL)
{
/*错误:无法添加线性调频脉冲。 返回错误代码。 *
返回错误代码
;}
}/*secend

profile polution*/
for (ChirpCnt = 0;ChirpCnt < 32;ChirpCnt ++){
/*填充线性调频脉冲配置:*/
chirpCfg.chirpStartIdx = ChirpCnt;
chirpCfg.chirpEndIdx = ChirpCnt;
chirpCfg.profileId = 1;
啁啾 Cfg.startFreqVar =(uint32_t)((((ChirpCnt)*10e6)*((uint64_t)(1<<26)))/(3.6*1e9));
chirpCfg.freqSlopeVar =(int16_t)(0 *((uint64_t)(1<<26))/((uint64_t)(3.6*1e9*900));
线性调频脉冲 Cfg.idleTimeVar =(uint32_t)((float) 0 * 1000 / 10);
啁啾 Cfg.adcStartTimeVar =(uint32_t)((float) 0 * 1000 / 10);
啁啾 Cfg.txEnable = 1;
/*获取要添加线性调频脉冲的配置文件句柄:*/
IF (MMWAVE_getProfileHandle (gMmwMssMCB.ctrlHandle、chirpCfg.profileId、
profileHandle、&errCode)< 0)
{
/*错误:无法获取配置文件句柄。 返回错误代码*/
返回错误代码
;}

/*将线性调频脉冲添加到配置文件中*/
if (mmwave_addChirp (profileHandle、&chirpCfg、&errCode)=NULL)
{
/*错误:无法添加线性调频脉冲。 返回错误代码。 *
返回错误代码
;}
}


/********* /
/ / 


3) 3)配置广播帧结构
// //
//********* //
//此部分代码由:“\mmwave_sdk_01_00_05\mmwave_sdk_01_00_00_05\packages/ti\control\mmwavelink\test\common\testlink.c”

rlAdvFrameCfg_t advFrCfg;

memset (FrameCfg,= 0

,advFrameCfg.frameSeq.numOfSubFrames)引用; //我希望将两个副架组合为一个帧
advFrameCfg.frameSeq.forceProfile = xxQ1、 //我有两个配置文件,profile0和 profile1,但我不知道应该在这里设置哪些值
advFrameCfg.frameSeq.reserved1 = 0,
advFrameCfg.frameSeq.subFrameCfg[0].forceProfileIdx = 0、//我的第一个 profile0
advFrameCfg.frameSeq.subFrameCfg[0].chirpStartIdx = 0,//起始 idx 为0,mine chirp 为0 - 31;
advFrameCfg.frameSeq.subFrameCfg[0].numOfChirps = 32、//
advFrameCfg.frameSeq.subFrameCfg[0].numLoops = 0、 //
advFrameCfg.frameSeq.subFrameCfg[0].burstPeriodicity = 0,//可以是0,毕竟我没有突发 
advFrameCfg.frameSeq.subFrameCfg[0].chirpStartIdxOffset = xxQ2、//我不关注这个? 
advFrameCfg.frameSeq.subFrameCfg[0].numOfBurst = 1、
advFrameCfg.frameSeq.subFrameCfg[0].numOfBurstLoops = 1、
advFrameCfg.frameSeq.subFrameCfg[0].reserved1 = 0、
advFrameCfg.frameSeq.subFrameCfg[0].subFramePeriodicity = 0、//可以为零
advFrameCfg.frameSeq.subFrameCfg[0].reserved2 = 0、
advFrameCfg.frameSeq.subFrameCfg[0].reserved3 = 0、

advFrameCfg.frameSeq.subFrameCfg[1].forceProfileIdx = 1、
advFrameCfg.frameSeq.subFrameCfg[1].chirpStartIdx = 0、
advFrameCfg.frameSeq.subFrameCfg[1].numOfChirps = 32、
advFrameCfg.frameSeq.subFrameCfg[1].numLoops = 0、
advFrameCfg.frameSeq.subFrameCfg[1].burstPeriodicity = 0、
advFrameCfg.frameSeq.subFrameCfg[1].chirpStartIdxOffset = 0、
advFrameCfg.frameSeq.subFrameCfg[1].numOfBurst = 1、
advFrameCfg.frameSeq.subFrameCfg[1].numOfBurstLoops = 1、
advFrameCfg.frameSeq.subFrameCfg[1].reserved1 = 0、
advFrameCfg.frameSeq.subFrameCfg[1].subFramePeriodicity = 0、
advFrameCfg.frameSeq.subFrameCfg[1].reserved2 = 0、
advFrameCfg.frameSeq.subFrameCfg[1].reserved3 = 0、

advFrameCfg.frameSeq.numFrames = 0、 //发送无限帧
advFrameCfg.frameSeq.triggerSelect = 1,
advFrameCfg.frameSeq.frameTrigDelay = 0、//可以为零
advFrameCfg.frameSeq.reserved2 = 0、

advFrameCfg.frameData.numSubFrames = 2、 //两个子帧
advFrameCfg.frameData.reserved1 = 0、
advFrameCfg.frameData.reserved2 = 0、
advFrameCfg.frameData.subframeDataCfg[0].totalChirps = 32、//numOfChirps * numLoops * numOfBurst = 32*1*1 = 32
advFrameCfg.frameData.subframeDataCfg[0].numAdcSamples = 128、//64point * 2 = 128
advFrameCfg.frameData.subframeDataCfg[0].numChirpsInDataPacket = 1、
advFrameCfg.frameData.subframeDataCfg[0].reserved1 = 0、
advFrameCfg.frameData.subframeDataCfg[1].totalChirps = 32、
advFrameCfg.frameData.subframeDataCfg[1].numAdcSamples = 128、
advFrameCfg.frameData.subframeDataCfg[1].numChirpsInDataPacket = 1、
advFrameCfg.frameData.subframeDataCfg[1].reserved1 = 0、

// //
//********* //

我对代码有一些问题, 

问题1:advFrameCfg.frameSeq.forceProfile;

应该设置什么值?这意味着什么?
advFrameCfg.frameSeq.forceProfile 和 advFrameCfg.frameSeq.subFrameCfg[1].forceProfileIdx?之间的区别是什么

Q2:advFrameCfg.frameSeq.subFrameCfg[0].burstPeriodicity 可以是零吗?

问题3:有关 advFrameCfg 的配置有一些问题?



4)调用函数 MmwDemo_mssDataPathConfig()将所有参数配置为 BSS

5)调用名为 mmWave_fullConfig()的函数;

// //
// //

static Int32_t mmWave_fullConfig (MMWAVE_MCB* ptrMMWaveMCB、MMWAVE_CtrlCfg* ptrControlCfg、int32_t* errCode)
{
内部32_t RetVal =-1;
MMWAVE_InitRFCfg initRFCfg;

/*初始化射频配置:*/
memset ((void*)&initRFCfg、0、sizeof (mmWave_InitRFCfg));

/*填充配置*/
initRFCfg.ptrChannelCfg =&ptrControlCfg->u.fullControlCfg.chCfg;
initRFCfg.ptrADCOutCfg =&ptrControlCfg->U.fullControlCfg.adcOutCfg;
initRFCfg.ptrLowPowerModeCfg =&ptrControlCfg->U.fullControlCfg.lowPowerMode;
initRFCfg.freqLimitLow = ptrControlCfg->freqLimitLow;
initRFCfg.freqLimitHigh = ptrControlCfg->freqLimitHigh;

/*初始化射频:*/
RetVal = MMWAVE_initRF (ptrMMWaveMCB、&initRFCfg、errCode);
如果(RetVal < 0)
{
/*错误:射频初始化失败;错误代码已设置*/
转至 EXIT;
}

/*使用应用程序提供的配置配置来配置链接:*/
RetVal = MMWAVE_CONFIGLink (ptrMMWaveMCB、ptrControlCfg、errCode);
如果(RetVal < 0)
{
/*错误:链接配置失败;错误代码已设置*/
转至 EXIT;
}

/*已验证链路配置:我们现在可以将其传递给 SOC 处理程序。 *
RetVal = gMMWaveHwAttributes.cfgFxn (ptrMMWaveMCB、ptrControlCfg、errCode);
如果(RetVal < 0)
{
/*错误:mmWave Link 配置失败。 错误代码已配置
*掉下来吧! *
转至 EXIT;
}


已配置/*毫米波链路。 *
ptrMMWaveMCB->isConfigured = true;


/*设置返回值:*/
RetVal = 0;

退出:
退货值;
}

//优惠 //
// // 

问题5:我认为我应该添加以下函数: 

rlSetAdvFrameConfig (rl_device_map_internal_bss、(rlAdvFrameCfg_t*)&advFrameCfg);

函数 MMWAVE_CONFIGLink (ptrMMWaveMCB、ptrControlCfg、errCode)中、但我不确定要添加到何处。 我尝试对其进行编码,请帮助我检查:

6) 6)将函数 rlSetAdvFrameConfig (RL_DEVICE_MAP_INTERNAL_BSS、(rlAdvFrameCfg_t*)&advFrameCfg)添加到 MMWAVE_CONFIGLink ()中。

 

// ////
********* //
int32_t mmWave_configLink
(
MMWAVE_MCB* ptrMMWaveMCB、
MMWAVE_CtrlCfg* ptrControlCfg、
int32_t* 错误代码
)
{
内部32_t 返回值;
内部32_t 索引;
rlContModeEn t contModeEnable;
rlProfileCfg_t profileCfg;
MMWAVE_ChirpHandle 线性调频脉冲处理;
rlChirpCfg_t 线性调频脉冲配置;
uint32_t numChirps;
uint32_t 线性调频脉冲指数;

/*确定 DFE 输出模式? *
if (ptrControlCfg->U.fullControlCfg.dfeDataOutputMode = mmWave_DFEDataOutputMode_CHIRP)
{
/
*线性调频脉冲模式:
*毫米波链路指定的操作顺序是
*-配置文件配置
*-线性调频脉冲配置
*-帧配置
(二 /
对于(INDEX = 0;INDEX < MMWAVE_MAX_PROFILE;index++)
{
/*我们是否有有效的配置文件? *
if (ptrControlCfg->u.fullControlCfg.u.chirpModeCfg.profileHandle[index]==空)
{
/*否:跳至下一个配置文件*/
继续;
}

/*是:获取配置文件配置*/
if (MMWAVE_getProfileCfg (ptrControlCfg->u.fullControlCfg.u.chirpModeCfg.profileHandle[index]、
profileCfg、errCode)< 0)
{
/*错误:无法获取配置文件配置。 设置返回值*/
RetVal =-1;
转至结束;
}

/*使用 mmWave Link API 配置配置文件*/
RetVal = rlSetProfileConfig (RL_DEVICE_MAP_INTERNAL_BSS、1U、&profileCfg);
if (RetVal!= RL_RET_CODE_OK)
{
/*错误:设置配置文件配置失败*/
*errCode = MMWAVE_EPROFILECFG;
MMWAVE_TRANSITEErrorCode (RetVal);
转至结束;
}

/*获取配置并连接到配置文件的线性调频脉冲数:*/
if (MMWAVE_getNumChirps (ptrControlCfg->u.fullControlCfg.u.chirpModeCfg.profileHandle[index]、
numChirps、errCode)< 0)
{
/*错误:无法获取线性调频脉冲数。 错误代码已设置*/
RetVal =-1;
转至结束;
}

对于配置文件为/*;循环所有线性调频脉冲并对其进行配置。 *
对于(线性调频脉冲指数= 1U;线性调频脉冲指数<= numChirps;线性调频脉冲指数++)
{
/*获取与指定索引关联的线性调频脉冲句柄*/
if (MMWave_getChirpHandle (ptrControlCfg->u.fullControlCfg.u.chirpModeCfg.profileHandle[index]、
线性调频脉冲索引、线性调频脉冲处理、错误代码)< 0)
{
/*错误:无法获取线性调频脉冲句柄。 错误代码已设置*/
RetVal =-1;
转至结束;
}

/*获取线性调频脉冲配置:*/
if (MMWAVE_getChirpCfg (线性调频脉冲处理、&chirpCfg、错误代码)< 0)
{
/*错误:无法获取线性调频脉冲配置。 错误代码已设置*/
RetVal =-1;
转至结束;
}

/*在毫米波链路中设置线性调频脉冲配置*/
RetVal = rlSetChirpConfig (RL_DEVICE_MAP_INTERNAL_BSS、1U、啁啾 Cfg);
if (RetVal!= RL_RET_CODE_OK)
{
/*错误:设置线性调频脉冲配置失败*/
*errCode = MMWAVE_ECHIRPCFG;
MMWAVE_translateErrorCode (RetVal);
转至结束;
}
}


/*设置帧配置:*/
//RetVal = rlSetFrameConfig (RL_DEVICE_MAP_INTERNAL_BSS、&ptrControlCfg->u.fullControlCfg.u.chirpModeCfg.frameCfg);
RetVal = rlSetAdvFrameConfig (RL_DEVICE_MAP_INTERNAL_BSS、(rlAdvFrameCfg_t*)&advFrameCfg);IF (RetVal!= RL_RET_CODE_OK)
{
/*错误:设置帧配置失败*/
*errCode = MMWAVE_EFRAMECFG;
MMWAVE_translateErrorCode (RetVal);
转至结束;
}
}
其他
{
/
*连续模式:
*毫米波链路指定的操作顺序是
*-连续模式配置
*-设备启用流
(二 /
RetVal = rlSetContModeConfig (RL_DEVICE_MAP_INTERNAL_BSS、&ptrControlCfg->U.fullControlCfg.U.ContinuousModeCfg.contModeCfg);
if (RetVal!= RL_RET_CODE_OK)
{
*errCode = MMWAVE_ECONTMODECFG;
MMWAVE_translateErrorCode (RetVal);
转至结束;
}

/*初始化连续模式配置:*/
memset ((void*) contModeEnable、0、sizeof (rlContModeEn _t));

/*填充连续模式配置:*/
contModeEnable.contModeEn = 1U;
RetVal = rlEnableContMode (RL_DEVICE_MAP_INTERNAL_BSS、contModeEnable);
if (RetVal!= RL_RET_CODE_OK)
{
*errCode = MMWAVE_ECONTMODE;
MMWAVE_translateErrorCode (RetVal);
转至结束;
}
}

/*将返回值设置为成功。 *
RetVal = 0;

结束:
返回值
;}

//返回值 ////
********* //

我刚刚使用了函数 

RetVal = rlSetAdvFrameConfig (RL_DEVICE_MAP_INTERNAL_BSS、(rlAdvFrameCfg_t*)&advFrameCfg); 

而不是函数
RetVal = rlSetFrameConfig (RL_DEVICE_MAP_INTERNAL_BSS、&ptrControlCfg->u.fullControlCfg.u.chirpModeCfg.frameCfg);

它可以正常工作吗?否则我该怎么做?


BR

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

    Havi、您好!

    毫米波链接 API 调用在 Doxygen html 文件中进行了说明、该文件是 SDK 安装的一部分。 请确保您已经查看了这些有用的 html 文件。

     以下是 mmWaveSDK 安装目录下的典型路径:

    mmWaveLink 框架:文件:///C:/ti/mmwave_sdk_01_00_00_05/packages/ti/control/mmwavelink/docs/doxygen/html/index.html

    上面的 html 提供了 mmWaveLInk 的概述。  您需要检查上一页中的以下 hierachy

    mmWaveLink 框架

    |--Modules

    |--传感器

    此操作将带您进入以下页面(通常): file:///C:/ti/mmwave_sdk_01_00_00_05/packages/ti/control/mmwavelink/docs/doxygen/html/group___sensor.html

    上一页应显示各种(RF)传感器相关的 API 调用, 高级帧配置的调用为: "rlSetAdvFrameConfig"

    单击该函数将显示容器"rlAdvFrameCfg_t "的说明和结构、 单击此处将转到该容器中的两个数据结构。

    rlAdvFrameSeqCfg_t  frameSeq:file:///C:/ti/mmwave_sdk_01_00_00_05/packages/ti/control/mmwavelink/docs/doxygen/html/structrl_adv_frame_seq_cfg__t.html
     
    rlAdvFrameDataCfg_t  frameData:文件:///C:/ti/mmwave_sdk_01_00_00_05/packages/ti/control/mmwavelink/docs/doxygen/html/structrl_adv_frame_data_cfg__t.html

    每个数据结构下会解释这些字段的各种字段。

    希望这对您有所帮助。

    谢谢、

    Vaibhav

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

    谢谢你。

    我正在尝试,但当我填充寄存器时:advframecfg->frameSeq.subFrameCfg[0].forceProfileIdx;

    该文档显示:

    "rlUInt16_t rlSubFrameCfg_t::forceProfileIdx

    强制系统配置索引。 这仅适用于 FORCE_SINGLE_PROFILE 设置为1"

    我找不到 FORCE_SINGLE_PROFILE 定义的位置。

    此"force_single_profile "是否意味着名为 advframecfg->frameSeq.forceProfile 的寄存器= 0x01?

    谢谢,

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

    Havi、您好!

    只有 当 forceProfile 设置为"1"时、forceProfileIdx 才适用。  

     rlSubFrameCfg_t::forceProfile

    定义
    0x0 线性调频脉冲配置 API 消息中设置的配置文件索引控制传输该线性调频脉冲时使用的配置文件
    0x1. 啁啾配置消息中指示的配置文件索引将被忽略,每  个子帧中的所有啁啾都使用单个配置文件,这由该子帧在此消息中设置的配置文件索引所指示。



    有关 rlSetAdvFrameConfig API 的 rlAdvFrameCfg_t 参数的详细信息  、请参阅 采用 MMWAVE-DFP 封装的雷达接口控制文档。

    在这里 、您可以找到高级帧配置的文献。

    希望这两份文档能澄清您的疑问。

    此致、

    Jitendra Gupta