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.

[FAQ] [参考译文] [常见问题解答] SIMPLELINK-CC2640R2-SDK:RTLS 已知问题和修复

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/770218/faq-simplelink-cc2640r2-sdk-rtls-known-issues-and-fixes

器件型号:SIMPLELINK-CC2640R2-SDK

 

simplelink_cc2640r2_sdk_3_40_00_10

0.[RTLS_Monitor]我们不再发布 RTLS_Monitor。 相反、我们会在 tools\ble5stack\RTLS_agent\RTLS_ui 中提供存储在 SDK 中的新用户界面(UI)。 执行 RTLS_ui.exe、我们建议您将 Google Chrome 或 Firefox 作为默认 Web 浏览器。

1. [TOF]在使用新 UI 时检测到并重现了一些连接问题。 我们目前正在研究这些问题。 目前、如果您遇到此问题、我们建议您重新启动 GUI 并重置器件。

2.[RTLS_UI]当器件断开连接时(即未使用 GUI 中的"Disconnect (断开连接)"按钮关闭)、连接状态将变为不正确。 日志正确显示“断开连接成功”,但我们仍有“断开连接”和“启用…” 按钮可用。 但是、如果您单击其中一个按钮、则会遇到错误。 在这种情况下、我们建议您单击"Disconnect (断开连接)"、然后重新连接您的设备。

3.[AoA] AoA 多连接:当连接了>4个从站时,主节点可能会在发送 AoA_start 命令后断开连接。 Wa 要求在建立连接后将 AoA_START 命令延迟几秒钟。

4.[AoA] AoA 多连接:当连接了>4个从属设备时,无源节点有时无法跟踪某些连接。

5. [AoA]在某些情况下、测量的角度会停留在给定的值。 我们目前正在处理这个问题。 目前、如果您遇到此问题、我们建议您重新启动 GUI 并重置器件。 可能还需要对器件进行批量擦除和重新闪存。

 

simplelink_cc2640r2_sdk_3_30_00_20

 当 RSSI 低于-60时、ToF 主/从可能不同步

[权变措施]:此权变措施解决了问题 BLESTACK-5182 (当 RSSI 低于-60时、ToF 主/从可能不同步)。  

在 RTLS 项目中、将 TOF.c/.h 和 tof _security.c/.h 文件替换为以下文件:

e2e.ti.com/.../TOF.c

e2e.ti.com/.../TOF.h

e2e.ti.com/.../tof_5F00_security.c

e2e.ti.com/.../tof_5F00_security.h

2. 在大于1秒的连接间隔内,ToF 不稳定

3.使用天线阵列2时角度性能不稳定

4. [RTLS Passived] AoA 角度计算以低角度(0-10度)偏离

5.[AoA]仅使用两根天线时、需要修改以下代码:

  • 网址为 AOA.h
#define AOA_NUM_ANAINS 2//3 //!<天线阵列中的天线数 
  • 在 RTLS_CTRL_AoA.c 中::RTLSCTRL_estateAngle ()
const Int16_t AoA_A1 = antA1Result->pairAngle[0]+ antA1Result->channelOffset[antA1Result->ch];
const Int16_t signalStrH_A1 =(antA1Result->signalStrut[0]);

simplelink_cc2640r2_sdk_3_20_00_21

有时、RTLS_Monitor GUI 似乎无法检测到 RTLS_SLAVE。

其背后的原因是 GUI 始终会对器件进行复位、但是、如果 TCK 引脚上存在一些噪声、则在复位后、器件将保持在启动停止状态。 然后、器件将像连接到调试器一样运行、等待用户按运行按钮来执行软件。 这是由 LP 上的 XDS 工具包引起的。

要解决此问题、只需在运行 GUI 之前将 TCK 连接到 VDDS。

simplelink_cc2640r2_sdk_3_10_00_15

1。RTLS_MASTER 在预定义符号中启用了 cache_as RAM、但这不足以实际启用 cache_as RAM 功能。

要解决此问题、请修复以下文件:  

如下图所示、在 rtls_master_cc2640r2lp_app.projectspec 的 linkerBuildOptions 部分下添加"-define=cache_as _RAM=1

simplelink_cc2640r2_sdk_2_40_00_32

注意:使用 Ellisys 或 Saleae 等 USB 测量设备时、RTLS 提供的脚本可能无法正确接收数据。 记录时、命令可能通过导线接收、但不会转发到 UNPI 解析器 Python。 XDS110中的 USB CDC 驱动程序和诸如 saleae 之类的器件使用"批量"传输、这些测量器件偶尔会占用100%的 USB 带宽。 见 Saleae 的说明,网址 :https://support.saleae.com/troubleshooting/pc-performance-issues。 如果可能、我们建议在单独的 PC 上使用测量器件、并在可能的情况下始终直接插入 PC、避免使用集线器。

由于 stack_library.projectspec 指向错误版本的 XDCTools、RTLS_MASTER 和 RTLS_SLAVE 的开箱即用项目出现构建错误。 (CCS)

要解决此问题、请修复以下文件:  

InstallationFolder\ti\simplelink_cc2640r2_sdk_2_40_00_32\examples\rtos\CC2640R2_LAUNCHXL\blestack\rtls_master\tirtos\ccs\

rtls_master_cc2640r2lp_stack_library.projectspec

InstallationFolder\ti\simplelink_cc2640r2_sdk_2_40_00_32\examples\rtos\CC2640R2_LAUNCHXL\blestack\rtls_slave\tirtos\ccs\

rtls_slave_cc2640r2lp_stack_library.projectspec

更改:


至:

     


2.在没有 WebSocket (PYTHON)的情况下运行时,rtlsmanager.py 会在关闭时触发异常


将以下代码添加到 RTLS_manager.py::停止(~第74行)

如果 self.wss 不是无:self.wss.stop() 



3. 使用某些连接参数时,连接监视器不会启动

在 micro_ble_cm.c 中、更改 ubCM_startExt()函数:

删除以下内容:

ubCMConnInfo.ArrayOfConnInfo[I].scanDuration =(uint16_t)((((data[4]<8)+ data[5])* 4); 

添加以下~第789行

uint16_chant 跳过; 

//连接间隔为100ms,我们将在将来跳过3个通道
//这样做主要是为了确保即使是速度非常慢的总线也能及时发送连接信息
//及时:在主/从已经通过我们选择收听的频道之前
//如果主/从已经超过了这一点,我们必须等待 numChannels*connInterval 直到我们获得
//再次连接
chanSkip =(uint16_t)((640/ubCMConnInfo.ArrayOfConnInfo[I].connInterval)+ 1);
setNextDataChan (sessionId、chanSkip);//jump some [ms] channels into the future
ubCMConnInfo.ArrayOfConnInfo[I].currentChan = ubCMConnInfo.ArrayOfConnInfo[I].nextChan;

//将来获取锚点 n+2连接间隔
ubCMConnInfo.ArrayOfConnInfo[i]。scanDuration =(uint16_t)(ubCMConnInfo.ArrayOfConnInfo[i]。connInterval*(chanSkip + 1)); 

4. RAM 缓存不能与 RTLS 项目一起使用

由于 RTLS_MASTER 上的堆内存有限、建议在诸如的更密集结果模式下使用高速缓存作为 RAM 配置  

RAW 模式。 请参阅此处的将高速缓存启用为 RAM 指南。  首先应用以下更改、 然后应用 指南中的项目设置更改

http://dev.ti.com/tirex/content/simplelink_cc2640r2_sdk_2_40_00_32/docs/blestack/ble_user_guide/html/ble-stack-common/cache-as-ram.html

在 RTLS_Projects 的 main.c 中、用  以下内容替换对 VIMSConfigure()和 VIMSModeSet()的任何调用:

#ifdef cache_as RAM
//在待机期间保留高速缓存
Power_setConstraint (PowerCC26XX_SB_VIMS_cache_retain);
Power_setConstraint (PowerCC26XX_need_flash_in_idle);
#else
//启用 ICache 预取
VIMSConfigure (VIMS_BASE、TRUE、TRUE);
//
启用 VIMS_RACK_MODE_RACASE
;//启用 VIMSDK_MODE_RACK_RACK_EN/VIMSDRACK_ENSW1 (VIM_RACK_MODEF) 

将以下内容添加到#include 上方的 ccfg_app_ble.c 中

#ifdef cache_as RAM
#define SET_CCFG_SIZE_AND_DIS_FLAGS_DIS_GPRAM 0x0 //启用 GPRAM *
/#endif // cache_as RAM 


在 TOF.c 中、将以下内容添加到 pOverrides_2M 数组的末尾

#ifdef cache_as RAM
0x00018063、
#endif //cache_as RAM
0xFFFFFFFF、
}; 


5.无法正确关闭 TOF,请更新设置


在#includes 附近的 TOF.c 中添加以下内容  

#include 
#include 

#include "rtls/rtls_ctrl.h" 
#include

将 TOF_open()中的 params->freqChangePeriod 更改为  

params->freqChangePeriod = 2; //每2个数据包的开关频率 

将 TOF_CLOC()的内容替换为以下内容

void TOF_Close (TOF_Handle handle)
{
volatile uint32_t keyHwi;

//删除同步校准
handle ->synthCal[0].freq = 0;

//关闭射频句柄
RF_Close (handle ->rfHandle);

//关闭 TOF 安全
TOFSecurity_Close (&tofwi Handle);

//
关闭 TOF

(freef);//自由
) handle (1)

;//停止 HfHandle);//停止 Hf (rqf)

在 tof 安全性.c 中的任何位置创建 TOF_SECURITY 关闭 API

/*********
*@fn TOFSecurity_Close API
*
*@简介 此函数用于关闭 ToF 安全性并释放缓冲
器*
*输入参数
*
@param tofSecHandle -指向空 tof 安全句柄的指针。
*
*输出参数
*
*@return uint8_t -如果失败则为 NULL、否则成功
*/
int TOFSecurity_close (tofSecHandle_t *tofSecHandle)
{
volatile uint32_t keyHwi;

keyHwi = Hwi_disable ();

//释放第一个缓冲区
空闲(tofSecHandle->pSyncWordBuffer1);

//如果启用了另
一个缓冲区
、则为双精度模式(doftble= dToF)
FREE (tofSecHandle->pSyncWordBuffer2);
}

Hwi_restore (keyHwi);

返回 TOF_SEC_SUCCESS_E;
} 

将以下 include 添加到 tof _security.c

#include "rtls/rtls_ctrl.h"
#include 

将新的安全 API 定义添加到 tof_security.h 头文件中

int TOFSecurity_Close (tofSecHandle_t * tofSecHandle); 

6. RTLS_Ctrl 中存在各种内存泄漏,修复程序应用于较新的 SDK。 请移至 SimpleLink CC2640R2 SDK 3.10.00.15或更高版本

7.重复启动/停止时不能刷新连接监视器数据包


将 ull.c 中的 UL_FlushAllDataEntry 的内容替换为以下内容

void UL_FlushAllDataEntry( dataEntryQ_t *pDataEntryQ )
{
dataQ_t *pDataQueue;
port_key_t key;
port_key_t key_s;

key = port_enterCS_HW ();
key_s = port_enterCS_SW ();

//指向数据队列*/
pDataQueue =(dataQ_t *)pDataEntryQ;

while ( pDataQueue->pNextDataEntry != NULL &&
pDataQueue->pNextDataEntry->status!= data_entry_pending)
{
/*将下一个系统数据条目标记为待定*/
pDataQueue->pNextDataEntry -> status = data_entry_pending;

/*前进到数据条目队列中的下一个数据条目*/
pDataQueue->pNextDataEntry = pDataQueue->pNextDataEntry -> pNextEntry;
}

port_exitCS_SW (key_s);
port_exitCS_HW (key);
} 

将 ull.c 中的 UL_rxEntryDoneCback ()的内容替换为以下内容:

void UL_rxEntryDoneBack (void)
{
uint8 dataLen = 0;
port_key_t key;
port_key_t key_s;

key = port_enterCS_HW ();
key_s = port_enterCS_SW ();

DataEntry_t *pDataEntry = UL_getNextDataEntry ((dataEntryQ_t *) urfScanCmd.pParams->pRxQ);

//获取数据包指针*/
if ((pDataEntry == NULL)||(pDataEntry ->status!= data_entry_finished)
){)
PORT_exitCS_SW (key_s);
PORT_exitCS_HW (KEY);

/*在这里什么都不做*/
return;
}

/*只有
在 uGAP *处理前一个 Adv 数据包时才调用回调。
//
if (UL_advPktInuse =false)
{
UL_advPktInuse = true;

/*处理 RX FIFO 数据*/
UL_getAdvChanPDU (&dataLen,advPktt);

/*在所有情况下,将 RX 队列数据条目标记为空闲
*注意:即使没有任何堆要复制到、也会考虑此数据包
* 丢失、队列条目标记为空闲、供对讲机使用。
*
nextDataEntryDon((dataEntryQ_t *)urfiScanCmd.pParams->pRxQ );
}//

待定:句柄过滤和白名单*//
*待定:需要动态分配 advPPDU 并释放应用程序*//

//我们有一个通告数据包:
*
||访问地址| | CRC |
*| 1-2字节| 4字节 | 2-257个字节| 3个字节|
*
PDU 花费在:
*|标头|有效载荷 |
*| 2个字节| 1-255个字节|
*
*标题花费在:
*| PDU 类型... RxAdd |长度|
*| 1个字节 | 1字节|
*
*有效载荷用于:
*| AdvA | AdvData |
*| 6字节| 0-31字节|
*
*无线电将 CRC 删除并替换为后缀。
*
** Postfix 花费在:
*| RSSI |状态|时间戳|
*| 1字节| 1字节| 4字节|
*
*状态花费在:
*| bCrcErr | bIgnore | channel |
*| bit 7 | bit 6 | bit 5..0 |
*
*注意 advPktt 是 PDU 的开头;dataLen 包括
* postfix 长度。
*
//

port_exitCS_SW (key_s);
port_exitCS_HW (key);

if (dataLen!= 0)
{
UL_notifyIndScanation( sum, dataLen, advPkt);
}
return;
} 

将 ull.c 中的 UL_monitorStop()替换为以下内容:

void UL_monitorStop (void)
{
port_key_t key;
port_key_t key_h;

key_h = port_enterCS_HW ();
key = port_enterCS_SW ();

if (ulState = UL_State_monitoring)
{
ulState = UL_State_STANDBY;

/*取消或停止通用 Rx 命令*/
IF (urfiGenericRxHandle >0)
{
/* flush RF 命令*/
rf_flushCmd (urfiHandle、urfiGenericRxHandle、0);

/*刷新 RX 队列数据条目*/
ull_flushAllDataEntry ((dataEntryQ_t *) urfiGenericRxCmd.pParams->pRxQ);

urfiGenericRxHandle = URFI_CMD_Handle_INVALID;
}
}

port_exitCS_SW (key);
port_exitCS_HW (key_h);
} 

将 ull.c 中的 UL_rxEntryDoneCback ()替换为以下内容

void UL_rxEntryDoneBack (void)
{
uint8 dataLen;
port_key_t key;
port_key_t key_s;

key = port_enterCS_HW ();
key_s = port_enterCS_SW ();

DataEntry_t *pDataEntry = UL_getNextDataEntry ((dataEntryQ_t *) urfiGenericRxCmd.pParams->pRxQ);

//获取数据包指针*/
if ((pDataEntry == NULL)||(pDataEntry ->status!= DATA_Entry)

PORT_exitCS_HW (KEY);
PORT_exitCS_SW (key_s);

/*在这里什么都不做*/
return;
}/*

处理 RX FIFO 数据*/
UL_getPDU (&dataLen,monitorpktt);

//在所有情况下,将 RX 队列数据项标记为空闲
*注意:即使没有任何堆要复制到,此数据包也被视为
* 丢失、队列条目标记为空闲、供对讲机使用。
*/
ull_nextDataEntryDone ((dataEntryQ_t *) urfiGenericRxCmd.pParams->pRxQ);

port_exitCS_HW (key);
port_exitCS_SW (key_s);

// tBD 前导码:monitorpktt 可动态分配和应用程序*|

*访问***/

Adtdr:* | CRC |
*| 1-2字节| 4字节 | 2-257个字节| 3个字节|
*
PDU 花费在(在定义了 RTLS_locationing_AOA 的情况下)
*|标头|有效载荷 |
*| 2-3字节| 1-255字节|
*
如果(Header[0]& 0x20 == 0x20)为 true,则标头的大小为3
*
*标头花费在:
*| PDU Type...RxAdd | Length | Additional Info |
*| 1字节 | 1字节| 1个字节 |
*
* PDU 花费在(未定义 RTLS_locationing_AOA)
*|标头|有效载荷 |
*| 2个字节| 1-255个字节|
*
*标题花费在:
*| PDU 类型... RxAdd |长度|
*| 1个字节 | 1字节|
*
*无线电删除 CRC 并将其替换为后缀。
*
** Postfix 花费在:
*| RSSI |状态|时间戳|
*| 1字节| 1字节| 4字节|
*
*状态花费在:
*| bCrcErr | bIgnore | channel |
*| bit 7 | bit 6 | bit 5..0 |
*
*请注意 monitorPktt 是 PDU 的开头;dataLen 包括
* postfix 长度。
*
*/
if (dataLen!= 0)
{
UL_notifyMonitorIndication( sul_sessionId、dataLen、monitorPkt);
}
return;
} 

8. TOF 可能无法启用

删除 TOF.c 中的以下代码::TOF_RUN ()

if (rf_cmdTox.b 主站!= TOF_role_slave)
{
HWREG (TOF_correlator_PWR_ADDR)|= TOF_correlator_PWR_MASK;
HWREG (RFC_MCERAM_BASE + 30*4)= TOF_correlator_TRIM;
HWREG (TOF_correlator_PWR_ADDR)&=~TOF_correlator_PWR_MASK;
} 

将 RF_cmdfs.startTrigger.PastTrig = 1更改为0、 将 RF_cmdTo.startTrigg.PastTrig = 1更改为0。

9. RTLS BLE 库在 Windows 32位系统上不起作用

simplelink_cc2640r2_sdk_2_30_00_28

在 AoA 项目中 TX 输出功率未初始化、这会导致 AoA 的范围性能不佳。

修复方法是在 AoA.c 中添加以下行:static RF_RadioSetup aSetup =

common.txPower = 0x9330、 

2. AoA 接收器项目中的角度计算存在问题。 当 I/Q 信号较弱时,AoA.c: ::AngleComplexProductComp 内的下移>> 10 将导致计算关闭。

此修复程序将替换 AoA.c 中以下三个函数内的内容: static  inline int16_t  iat2、 int16_t  iatan2sc、 int16_t  AngleComplexProductComp

静态内联 Int16_t iat2 (int32_t y、int32_t x){
return (y*32+(x/2))/x)*2;// 3.39 mxdiff
}
int16_t iatan2sc (int32_t y、int32_t x){
//确定 octant
if (y>= 1、2、2、3)
如果(x >= 0){// oct 0、1
如果(x > y){
返回 iat2 (-y、-x)/2 + 0*32;
} 否则{
如果(y=0)返回0;//(x=0、y=0)
return -iat2 (-x、-y)/2 + 2*32;
}
}否则{// oct 2、3
// if (-x <= y){
如果(x >=-y){
返回 iat2 (x、-y)/2 + 2*32;
} 否则{
return -iat2 (-y、x)/2 + 4*32;
}
}
否则{// oct 4、5、6、7
如果(x < 0){// oct 4、5
// if (-x >-y){
如果(x < y){
返回 iat2 (y、x)/2 +-4*32;
} 否则{
return -iat2 (x、y)/2 +-2*32;
}
}否则{// oct 6、7
// if (x <=-y){
如果(-x >= y){
返回 iat2 (-x、y)/2 +-2*32;
} 否则{
return -iat2 (y、-x)/2 +-0*32;
}
}

}//
处理 IQ 数据
的示例代码 Int16_t AngleComplexProductComp (Int16_t XRE、Int16_t xim、Int16_t Yre、Int16_t Yim)
{
int32_t Zre、Zim;
int16_t 角度;

// X*conj (Y)
ZRE = XRE*YRE + Xim*Yim;
Zim = xim*Yre - Xre*Yim;

//角度。 角度以256/2*pi 格式[-128、127]值返回
角度= iatan2sc (Zim、Zre);

返回(角度* angleconst);
} 

3. 在发送 ADV_NONCONN_IND 数据包时修改 DEFAULT_advertising_interval 不会产生任何影响。 要解决此问题,请 在  AoA.c 中进行以下三项更改:void AOA_run (AoA_Handle handle、uint8_t channel、AoA_AntennaConfig *配置、uint8_t pktId)

更改:

RF_cmdBleAdvNc.startTrigg.PastTrig = 1;

RF_cmdNopTx.startTrigg.PastTrig = 1;


if (通道= 37)
{
RF_cmdNopTx.StartTime = RF_getCurrentTime ()+ RF_convertUsToRatTicks (5000);
} 

至:

rf_cmdAdvNc.startTrigger.PastTrig = 0;

rf_cmdNopTx.startTrigg.PastTrig = 0;


if (channel = 37)
{
rf_cmdNopTx.StartTime = handle->StartTime + rf_getCurrentTime()+ rf_rf_RattUsToTicks5000;
}
{rf_cmdletTrutTime

= rf_rf_rf_r&rgrf_rgtRtTrutTryTryTryTryTryTryTryTricks5000;}(rf_r

4.lib_search 不适用于 MacOS 上的射频多模式、因此无法在 Mac 上运行 AoA 和 tof 示例