CC2642r1--问题笔记
发现的问题
一、使用官方例程进行配对,时间长达1分钟
- 项目场景 [simplelink_cc13x2_26x2_sdk_4_40_04_04] [peripheral] [multi_role]
- 问题描述: 官方例程直接编译并烧录,就能复现。
- 原因分析: 使用安卓和苹果,现象都一致,可能是连接参数导致。
- 解决方案:通过syscfg修改[参数更新延时]。修改官方默认值6000–>1/0
二、低版本协议栈打开高版本协议栈(4.40.4 open 5.24.0)
- 替换内容: SCANNER_DUPLICATE_FILTER(5.24.0) --> SCAN_FLT_DISC_DISABLE(4.40.4)
- IAR重新配置tool路径,导入[4.40.4]配置文件
三、提示:Bond save failed: 21
- 最大连接数量设置过低,改大些,即可。
- 设置自动清理
四、蓝牙丢包问题
- 主机通过GATT_WriteNoRsp向从机写入数据,当写速率过快时,就会出现blePending
原因:这是由于出现前面设置的缓存区小和连接间隔太大等参数导致的
解决:
1:在ti_ble_config.h中,将MAX_NUM_PDU 改6 和 MAX_PDU_SIZE改251,
定义6个Tx缓冲区,每个缓冲区251字节。用户应用程序应该根据自身堆栈情况进行分配。如果没有足够的堆栈,可以通过减少MAX_NUM_PDU,这样可能导致吞吐量的损失。实际使用中的最坏情况是MAX_NUM_PDU和MAX_PDU_SIZE的乘积。设计人员应该根据设备的可用内存来平衡这些参数。
#define MAX_NUM_PDU 6
#define MAX_PDU_SIZE 251
我们配置L2CAP MAX_PDU_SIZE 为255, ATT_MTU 最大 为251 读写特征值最大长度应该ATT_MTU-3=248;
//source\ti\blestack\profiles\simple_profile\simple_gatt_profile.h SIMPLEPROFILE_CHAR5_LEN Line 85
#define SIMPLEPROFILE_CHAR5_LEN 248
- 将连接间隔调小些
注意,在实际情况下更高的连接间隔有着明显的缺点:由于射频干扰导致的连接事件将大大降低吞吐量。因此用户需要根据所需吞吐量进行权衡。当连接间隔大于100ms后,吞吐量将不会增加。
将原来的8001.25ms,修改成241.24ms
将最小的连接间隔“修改成7.5ms
五、线程跑飞 ICall_searchTask 返回NULL
- 没有在线程启动后,执行ICall_registerApp()
static void edebug_task(UArg arg0, UArg arg1) {
// ******************************************************************
// N0 STACK API CALLS CAN OCCUR BEFORE THIS CALL TO ICall_registerApp
// ******************************************************************
// Register the current thread as an ICall dispatcher application
// so that the application can send and receive messages.
ICall_registerApp(&ranger4AppSelfEntity, &ranger4AppSyncEvent);
for(;;) {
uint32_t events;
events = Event_pend(ranger4AppSyncEvent, Event_Id_NONE, ET_ALL_EVENTS, ICALL_TIMEOUT_FOREVER);
}
- 栈空间没有8字节对齐
`/task variables/
Task_Struct g_task_t;
#if defined TI_COMPILER_VERSION
#pragma DATA_ALIGN(g_task_stack_heap, 8)
#else
#pragma data_alignment=8
#endif
uint8_t g_task_stack_heap[1024];
六、放置广播被连问题
场景:初始化时开启看门狗功能,并在RF IO口触发的中断函数内喂狗,一旦RF口停止工作, 则喂狗会停止,程序便会复位。
实际测试发现RF停止工作之后看门狗并未复位,原因是RF停止工作后,程序进入了standby 模式,在standby模式下,看门狗计数器会停止工作,看门狗计数器只在程序处于active 和idle模式下才运行。
从上表可以看出在standby模式下RTC是正常运行的,所以这周采用RTC去监测RF的运行状态。通过设置一个标志位,在RF触发的中断内使能该标志位,在RTC的时钟中断内监测该标志位,若该标志位为true,则说明RF运行正常,之后重置该标志位;若该标志位为false,则说明RF停止工作,此时重启程序。测试验证有效,设备可以成功复位。
功耗测试发现:RTC若设置时钟周期为5s, 则增加功耗1uA; 若设置1s, 则增加功耗5uA;
RTC的相应代码:
/*********************************************************************
* @fn UTC_timeUpdateHandler
* @brief Expiration callback for UTC clock instance.
* Each time this is called the internal counter is updated
*/
void UTC_timeUpdateHandler(void) {
if(mrRfStatus)
mrRfStatus = false;
else
SysCtrlSystemReset();
}
/*********************************************************************
* @fn UTC_init
* @brief Initialize the UTC clock module. Sets up and starts the
* clock instance.
*/
static void UTC_init(void) {
ClockP_Params clockParams;
// Convert UTC_UPDATE_PERIOD in milliseconds to ticks.
uint32_t clockTicks = UTC_UPDATE_PERIOD * (1000 / ClockP_getSystemTickPeriod());
// Setup parameters.
ClockP_Params_init(&clockParams);
// Setup argument.
clockParams.arg = 0;
// If period is 0, this is a one-shot timer.
clockParams.period = clockTicks;
// Starts immediately after construction if true, otherwise wait for a call
// to start.
clockParams.startFlag = true;
// Initialize clock instance.
ClockP_construct(&UTC_clock, (ClockP_Fxn)&UTC_timeUpdateHandler, clockTicks, &clockParams);
}
七、 IAR8.40开启ROV
步骤1:IAR8.40 自带的ROV插件无法正常工作,TI的协议栈内提供的该ROV插件,路径在C:\ti\simplelink_cc13x2_26x2_sdk_4_40_04_04\tools\iar\tirtosplugin.dll。复制该文件并替换IAR8.40安装路径(C:\IAR8.30\arm\plugins\rtos\TI-RTOS)下的同名文件。
步骤2:调试时需要勾选下图的选项,否则RTOS无法开启。
步骤3:
点击debug, 在主菜单栏上会出现TI-RTOS的菜单,点击可选择想要开启的窗口。
(一)system_printf 使能
步骤1:
修改project.cfg 中system.SupportProxy 的内容为:
var System = xdc.useModule(“xdc.runtime.System”);
var SysMin = xdc.useModule(‘xdc.runtime.SysMin’);
SysMin.bufSize = 1024;
SysMin.flushAtExit = false;
System.SupportProxy = SysMin;
关于sysmin 在TI的官方文档内有详细说明:https://dev.ti.com/tirex/explore/node?node=ANqagjxZxWnBRB7bx0EnOw__pTTHBmu__LATEST
步骤2:
按照下图所示设置library configuration:
步骤3:
在程序中加入打印信息,例如System_printf(“Printf Test\n”);
步骤4:
进入debug模式,开启ROV中的sysmin 中的outputbuffer 窗口
点击debug暂停按钮,在该窗口中即可看见打印信息
现在只能在debug暂停的时候才可以看见打印信息,因为IAR中的ROV估计是还没做完善,无法实时刷新,所以只能暂停debug时才可以输出打印信息。
CCS 中加入system_printf 与IAR相同,打印信息可在console窗口实时显示。
八、GPIO 和 PIN 两种driver不能同时使用。
(一)、两个文件互斥(PIN.h/GPIOCC26XX.c)
参考:CC2640R2 SDK - GPIO 和 PIN 两种driver的区别
gpio vs pin驱动?
九、PTM模式
文档链接:file:///C:/ti/simplelink_cc13x2_26x2_sdk_4_40_04_04/docs/ble5stack/ble_user_guide/html/ble-stack-5.x/creating-a-custom-bluetooth-low-energy-application-cc13x2_26x2.html#production-test-mode-ptm
PTM的示例工程为CC2642的simple_peripherial 工程,除了勾选PTM选项外,还需要注释掉设备初始化后广播使能的相关命令,否则在开启广播的情况下无法进入PTM模式,发送PTM相关命令会返回ROLE_CHANG_NOT_ALLOW的状态。
GAP_DeviceInit()注释即可
九、监听工程rtls_passive问题
simplePeriferal 工程作为从节点,通过手机连接该从机,连接建立之后该从机通过LIN总线发送监听参数给rtls_passive工程,rtls_passive工程收到数据后启动监听功能,当手机和从机只是单纯连接无数据交互时一切正常。但手机有应用层数据发送给从机时,我通过查看rtls_passvie的日志发现,一旦有超过130个字节的数据从手机发送出来,rtls_passive工程中监听上报rssi的回调就会停止且无法恢复。我只能手动重启。
请查看以下BU的反馈:
他们需要在urfc.c中覆盖(最大数据包长度为255)。需要添加的覆盖是0x00FF8A53,详情如下:
regOverride_t pOverridesCommon[] = {
0x00158000, // S2RCFG: Capture S2R from FrontEnd, on event (CM0 will arm)
0x000E51D0, // After FRAC
((CTECONFIG << 16) | 0x8BB3), // Enable CTE capture
((CTEOFFSET << 24) | ((CTE_SAMPLING_CONFIG | (CTE_SAMPLING_CONFIG << 4)) << 16) | 0x0BC3), // Sampling rate, offset
0x00FF8A53, // Set max packet length to 255, 0xFF
0xC0040341, // Pointer to antenna switching table in next entry
(uint32_t) antSwitching, // Pointer to antenna switching table
END_OVERRIDE };
绑定配对
一、参考文档
该文档对绑定流程有详细说明:
TI 官方说明文档:
file:///C:/ti/simplelink_cc13x2_26x2_sdk_4_40_04_04/docs/ble5stack/ble_user_guide/html/ble-stack-5.x/gapbondmngr-cc13x2_26x2.html
file:///C:/ti/simplelink_cc13x2_26x2_sdk_4_40_04_04/docs/ble5stack/ble_user_guide/html/ble-stack-5.x/privacy.html#using-privacy-in-stack
这里详细说明了如何使用GAPBondMgr_FindAddr()
GAPBondMgr API: file:///C:/ti/simplelink_cc13x2_26x2_sdk_4_40_04_04/docs/ble5stack/ble_user_guide/doxygen/ble/html/group___g_a_p_bond_mgr.html
二、配置项
System.cfg中提供了两个配置较为方便,如下图所示:
①Sync Whitelist with bonded device: 自动将绑定过的设备加入到白名单列表中
②LRU bond Replacement: 勾选后则当绑定设备数达到所设置的上限时,程序会自动从列表删除使用次数最少的设备,为新的绑定设备提供存储空间;若未勾选,则无法加入新的绑定设备。
三、 EnergyTrace 功能
TI 文档:
file:///C:/ti/simplelink_cc13x2_26x2_sdk_4_40_04_04/docs/ble5stack/ble_user_guide/html/energy-trace/energy-trace.html
该功能软件集成在CCS中
结合TI的lanuchPad 开发板可直接进行功耗测量,自动得出功耗参数以及使用寿命
经过测试,功耗测量误差较大,上图的平均电流为1.0022mA,N6705B 测出的功耗为560uA,可能是开发板上的功耗测量电路测量精度不高,TI官方提供了一款专门用于该功能的XDS110:地址 ,精度1uA。