工具/软件: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
六