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.

[参考译文] RTOS/CC2650:与 OAD 模板集成时、通知基于 BLE 外设的简单项目上的连接间歇性和频繁中断

Guru**** 2582405 points
Other Parts Discussed in Thread: CC2650, CC2640, CC2640R2F

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/593243/rtos-cc2650-notifies-intermittent-and-frequent-loss-of-connection-on-a-simple-ble-peripheral-based-project-when-integrated-with-an-oad-template

器件型号:CC2650
主题中讨论的其他器件: CC2640CC2640R2F

工具/软件:TI-RTOS

主题:通知基于简单 BLE 外设的项目上的间歇性和频繁连接丢失。

我有一个基于 BLE_cc26xx_2_01_00_44423简单 BLE 外设的“Halo”项目(App+Stack)工作正常。 该应用程序通过调用 GATTServApp_ProcessCharCfg()来执行62.4 Hz (1000/16)通知。

我需要 OAD,因此我已将“Halo”应用程序集成到 BLE_SDK_2_02_01_18 OAD_TARGET 映像 B 的副本中。BIM + OAD 目标映像 A + HALO_SIMPLE_Peripheral 映像 B + OAD 堆栈。 OAD_TARGET 基于 simplelink\ble_sdk_2_02_01_18\examples\cc2650lp

除了通知正在停止和/或连接经常断开外、一切都正常。

  • 我可以在从图像 A 运行 BLE Device Monitor 和 BTool 的情况下执行 Halo 图像 B 的 OAD、没问题

但是,在图像 B 中运行 Halo 应用程序时,通知中经常会出现空白,可以通过数据包监听器看到。

我继承了初始开发包。 它位于 Subversion 资源库中、因此 TI 库位于非默认位置、但版本可见...

我使用 CC2650 Launch Pad 作为模板。 我尝试在新的 OAD 版本中维护 ble_cc26xx_2_01_00_44423结构、但复制了主目录、因此仍可以使用 Launch Pad 目标。











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

    在监听器跟踪的图片上、它看起来好像有重试、没有错过、看起来是正常的。 (查看 SN 和 NESN、它们应以灰度方式递增)如果有任何内容、嗅探器似乎错过了数据包。

    断开原因是什么? 这似乎更令人关切。

    是否可以附加监听器日志来记录发生的此问题?

    为什么无法使用2.2.1堆栈? 通常、您应该能够使用移植指南将项目从2.1.0移植到2.2.0。 迁移到最新版本的堆栈、错误修复、功能、工具等有许多原因

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

    感谢反叛分子的答复,

    报告 断开连接的是自定义 iPhone 应用程序。 另一个症状是在 iPhone 应用程序上绘制示波器样式的轨迹、每次更新时更新轨迹一次。  

    TI_SensorTag_EE04Notify170503.PSD 是运行增量数据模式(每次更新+1)的新 CC2640应用的轨迹、其中 TI 启动应用用于连接和打开通知。  TI_SensorTag_EE04Notify170504_WC56_C0dA.PSD 采用相同的旧 CC260应用程序模式。

    16ms 是预期的更新间隔。 在 p.NBR 752处有一个较长的 M->S 重试间隔。 ~90ms。  
    (请参阅  下面的 SimpleBLEPeripheral_taskFxn)
    新旧应用的数据更新速率 为62.5Hz。 这两个应用都使用修改的 SimpleBLEPeripheral_taskFxn()。  计时器是1000Hz A/D 时钟。 此函数调用 haloEMG(); 它每16个样本调用一次 SimpleProfile_SetParameter(),以获得预期的62.5Hz 通知速率。
    旧应用程序似乎可以正常工作。 在新应用程序中,我可以告诉  haloEMG() 以62.5Hz 的频率持续运行(调用) SimpleProfile_SetParameter()下面的内容必须停止通知。  
    注:我最初尝试将端口设置为2.2.1、但遇到了许多问题。 我可以从此基线重试它。 我认为旧应用程序使用2.0。
    静态空 SimpleBLEPeripheral_taskFxn (UARg a0、UARg A1)
      //初始化应用程序
      SimpleBLEPeripheral_init();
      uartProtocol_init();
      haptic_init();
     
      HAL_TIMER_setFrequency (HAL_TIMER_ADC_TRIGGER、Hz_TO_10LE_Hz (SENSOR_DEFAULT_SAMPLE_FREQ_Hz));
      HAL_TIMER_START (HAL_TIMER_ADC_TRIGGER);
     
     //应用程序主循环
     对于(;)
     {
      //等待与调用线程关联的信号量。
      //请注意、当发出信号时、与线程关联的信号量会发出信号
      //消息在线程的消息接收队列中排队,或在何时排队
      // iCall_signal ()函数被调用到信号量上。
      iCall_errno errno = iCall_Wait (0);
     
      haloEMG();
      if (errno =ICALL_errno_Success)
      {
       iCall_EntityID dest;
       iCall_ServiceEnum src;
       iCall_HciExtEvt *pMsg =空;
     
       if (iCall_fetchServiceMsg (&src、&dest、
                    (void **)&pMsg)=ICALL_errno_Success)
       {
        uint8 safeToDealloc = true;
     
        IF (((src =ICALL_SERVICE_CLASS_BLE)&&(dest =self Entity))
        {
         iCall_Stack_Event *pEvt =(iCall_Stack_Event *) pMsg;
     
         //首先检查 BLE 堆栈事件
         if (pEvt->signature == 0xFFFF)
         {
          if (pEvt->EVENT_FLAG & SBP_CONN_EVT_END_EVT)
          {
           //尝试重新发送待处理的 ATT 响应(如果有)
           SimpleBLEPeripheral_sendAttRsp();
          }
         }
         其他
         {
          //处理任务间消息
          safeToDealloc = SimpleBLEPeripheral_processStackMsg ((iCall_HDR *) pMsg);
         }
        }
     
        if (pMsg && safeToDealloc)
        {
         iCall_freeMsg (pMsg);
        }
       }
     
       //如果 RTOS 队列不为空,则处理应用程序消息。
       while (!Queue_empty (appMsgQueue))
       {
        sbpEvt_t *pMsg =(sbpEvt_t *) Util_dequeueMsg (appMsgQueue);
        if (pMsg)
        {
         //处理消息。
         SimpleBLEPeripheral_processAppMsg (pMsg);
     
         //从消息中释放空间。
         iCall_free (pMsg);
        }
       }
      }
     
    //  if (事件和 SBP_Periode_EVT)
    //  {
    //   事件&=~SBP_Periode_EVT;
    //
    //   Util_startClock (周期时钟);
    //
    //   //执行周期性应用任务
    //   SimpleBLEPeripheral_performPeriodicTask();
    //  }
     
    #ifdef Feature_OAD
      while (!Queue_empty (hOadQ))
      {
       oadTargetWrite_t * oadWriteEvt = Queue_get (hOadQ);
     
       //识别新图像。
       if (oadWriteEvt->event == OAD_WRITE_Identify_Req)
       {
        OAD_imgIdentifyWrite (oadWriteEvt->connHandle、oadWriteEvt->pData);
       }
       //写下一个块请求。
       否则(oadWriteEvt->event =OAD_WRITE_BLOCK_REQ)
       {
        OAD_imgBlockWrite (oadWriteEvt->connHandle、oadWriteEvt->pData);
       }
     
       //自由缓冲区。
       iCall_free (oadWriteEvt);
      }
    #endif //feature_OAD
     }


     
     
     
    (笑声)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    查看捕获结果、连接在两种情况下均处于活动状态-不过重试次数令人震惊、通常会导致长达30ms 的延迟。

    我倾向于相信 BLE 连接是正常的、它可能是射频环境。 应用程序不应报告断开连接-任何地方都没有终止请求。 当您是指断开连接时、您是指从器件还是主器件停止显示连接事件? 即使这样、主器件也应该已经指示。

    您遇到了哪些问题? (移植期间)

    除了随机重试之外、连接有什么问题尚不清楚-远超出我的预期。 您的通知看起来不错、只是因为返修会阻止发送通知(因为他们优先维护连接)

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

    你好,Rebel,

    回复:为什么无法使用2.2.1堆栈? 通常、您应该能够使用移植指南将项目从2.1.0移植到2.2.0。 迁移到最新版本的堆栈、错误修复、功能、工具等有许多原因  

    在哪里可以找到移植指南?

    该项目从2_02_01_18 相当干净地转到2_20_01_08。  2_20_01_08至2_21_00_06不是。

    谢谢!  

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

    processors.wiki.ti.com/.../CC2640_Porting_Projects

    较新的移植指南(适用于 CC2640R2F 和 BLE5堆栈的指南可在以下位置找到: software-dl.ti.com/.../blestack3.00.01-to-ble5stack1.00.00.html

    此致、
    反叛分子
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Rebel,
    当我说我遇到2.21问题时、它尝试使用 tirtos_cc13xx_cc26xx_2_21_00_06。

    当我更仔细地检查我的项目时、我相信我正在使用正确的堆栈/TI_RTOS。 我使用最新 BLE simplelink_ble_sdk_2_02_01_18中的 OAD_target 作为模板。 这使用了移植指南中显示的相同2.2.1:安装在 C:\ti_tirtos_cc13xx_cc26xx_2_20_01_08中的 tirtos_cc13xx_cc26xx_2_20_01_08\...

    我使用 BIM 并可以完成 OAD、而不会在运行 BIM + AppA + Stack 时出现问题。 如果安装了 ImageB、则运行 ImageB。

    ImageB 是问题所在。 我基本上在 OAD_TARGET 堆栈上运行一个基于 simple_peripheral 的应用程序。

    OAD_TARGET 堆栈上基于 simple_peripheral 的应用是否存在任何固有问题? 它在 OAD_TARGET 项目空间中进行编译和链接。 注意:我还必须将图像 B 移动到0x7000开始、以使其适合。 图像 A 在0x7000之前结束。

    唯一已知的问题是停止。 我的前台任务运行正常。 它将数据发送到 UART。
    示例"3539、1430、-0100\r\n"@在调用通知更新后的波特率为115200 (旧版本也是如此)。

    停止是我需要解决的问题。 我认为 iPhone 应用程序超时、因为没有更新、不确定它是否是实际的 BLE 断开连接。 可能"空 PDU"也处于停滞状态。

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

    那么、您可能会遇到一些已知问题:

    processors.wiki.ti.com/.../CC2640_OAD_User's_Guide

    请查看这些帖子以及相关的 E2E 论坛帖子、以获取补丁。

    此致、
    反叛分子