打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

LiSun

打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

发现的问题

一、使用官方例程进行配对,时间长达1分钟

  1. 项目场景 [simplelink_cc13x2_26x2_sdk_4_40_04_04] [peripheral] [multi_role]
  2. 问题描述: 官方例程直接编译并烧录,就能复现。
  3. 原因分析: 使用安卓和苹果,现象都一致,可能是连接参数导致。
  4. 解决方案:通过syscfg修改[参数更新延时]。修改官方默认值6000–>1/0
    在这里插入图片描述

二、低版本协议栈打开高版本协议栈(4.40.4 open 5.24.0)

  1. 替换内容: SCANNER_DUPLICATE_FILTER(5.24.0) --> SCAN_FLT_DISC_DISABLE(4.40.4)
  2. IAR重新配置tool路径,导入[4.40.4]配置文件

三、提示:Bond save failed: 21

  1. 最大连接数量设置过低,改大些,即可。
    在这里插入图片描述
  2. 设置自动清理
    在这里插入图片描述

四、蓝牙丢包问题

  1. 主机通过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

  1. 将连接间隔调小些
    注意,在实际情况下更高的连接间隔有着明显的缺点:由于射频干扰导致的连接事件将大大降低吞吐量。因此用户需要根据所需吞吐量进行权衡。当连接间隔大于100ms后,吞吐量将不会增加。
    在这里插入图片描述
    将原来的8001.25ms,修改成241.24ms
    将最小的连接间隔“修改成7.5ms

五、线程跑飞 ICall_searchTask 返回NULL

  1. 没有在线程启动后,执行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);
  }

  1. 栈空间没有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。

posted on 2022-09-07 10:39  xuejianqiang  阅读(50)  评论(0编辑  收藏  举报  来源
打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033