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.

[参考译文] CC2640:"连接结束"事件似乎未与 BLE TX 同步

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

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/609053/cc2640-connection-end-event-seemingly-not-synchronized-with-ble-tx

器件型号:CC2640
Thread 中讨论的其他器件: CC2650

您好!

我正在开发一个电路板、其中 BLE 传输和一些测量电路之间似乎存在耦合。 因此、我将尝试在连接事件结束后立即同步测量值。  我将使用 CC2640 IC 和 BLE Stack 2.2.1。 (我已经使用1GHz 示波器探针探测了天线 TX 端口、并注意到连接间隔周期内的尖峰、这些尖峰也与我在模拟测量电路中看到的噪声保持一致)。

我尝试使用 HCI_EXT_ConnEventNoticeCmd ()命令来触发我的测量,但我没有看到正在进行任何同步。 我是否误解了该函数的运行? 或者、实际传输和连接事件结束通知之间是否存在一些看似随机的较大延迟(许多毫秒)? 或者我的代码中是否可能有错误?

我的代码基于 simple_peripheral 示例。 我所做的主要更改是始终启用连接事件(我删除了对启用/禁用连接事件的其他引用)、并在连接结束事件发生时调用自定义测量代码。

案例 GAPROLE_Connected:
{
linkDBInfo_t linkInfo;
uint8_t numActive = 0;

Util_startClock (周期时钟);
numActive = linkDB_NumActive();

//使用 numActive 确定最后一个的连接句柄
//连接
if ( linkDB_getinfo( numActive -1,&linkInfo )==成功)
{
uint16_t connHandle = 0;
Display_Print1 (dispHandle、2、0、"Num Conns:%d"、 (uint16_t) numActive);
Display_print0 (dispHandle、3、0、Util_convertBdAddr2Str (linkInfo.addr));
//启用连接事件,不应该使用太多的功率,应该是吗?
if (GAPRole_GetParameter (GAPROLE_CONNNANDLE、&connHandle)==成功)
HCI_EXT_ConnEventNoticeCmd (connHandle、self实体、SBP_CONN_EVT_END_EVT);
}

发生该事件时、我向我的自定义函数添加了一个调用、该调用会切换某些 I/O 引脚并启动传感器控制器任务:

//首先检查 BLE 堆栈事件
if (pEvt->signature == 0xFFFF)
{
if (pEvt->EVENT_FLAG & SBP_CONN_EVT_END_EVT)
{
//并在需要时启动 SC
SimpleBLEPeripheral_InitSCConnEvent();
//尝试重新传输待处理的 ATT 响应(如果有)
SimpleBLEPeripheral_sendAttRsp();
}
} 

谢谢、

Nathan

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

    由于应用程序处于最低优先级、较高优先级的进程可能会运行、并导致接收事件出现一些差异。 您是否有捕获这些事件的逻辑跟踪。

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

    我同意申请处理时间可能是一个问题。 为了应对这一情况、我已将连接间隔更改为50ms (以及更长的时间)(在此期间、我希望应用程序进程能够完成)。 我在测量周期中仍会发生 TX 脉冲。  明天、我可以尝试将连接间隔更改为250ms、看看它是如何响应的。

    我不熟悉如何执行逻辑跟踪。 我将 Code Composer Studio 7.2与 CC2650 Launchpad 电路板一起用作调试器。 我已经尝试遵循 软件跟踪指令 (包括添加 IOCPortConfigureSet (...) 在初始化 iCall 之前调用 main()函数)、但在开始统计函数分析时遇到错误("无法在 Cortex_M3_0上运行 alalyzer。 原因:无法打开 COM 端口")。 自定义 Core 跟踪会显示相同的错误消息。

    //启用 ICache 预取
    VIMSConfigure (VIMS_BASE,TRUE,TRUE);
    
    //启用高速缓存
    VIMSModeSet (VIMS_BASE,VIMS_MODE_ENABLED);
    
    //硬件跟踪支持
    //请参阅:<processors.wiki.ti.com/.../SWO_Trace>
    
    IOCPortConfigureSet (IOID_16,IOC_PORT_MCU_SWV,IOC_STD_OUTPUT)
    
    
    ;//初始化 iCall 模块;//初始化 

    另一方面、我能够查看"ROV Classic "和"Runtime Object View"、因此至少部分调试器正在工作。

    或者、您还在考虑其他硬件跟踪吗? 由于此任务具有多处理器特性、因此很难做到这一点。 我认为它确实需要无线电处理器上某种类型的调试器来报告 TX 事件、然后能够跟踪它如何通过 ICall 到达应用层。

    -弥敦

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    另一个调试帮助是、如果一个引脚(7x7器件)可配置为在 TX 期间输出脉冲。 这是可行的吗? 我想尝试在 Launchpad 板上重复我的问题、但我不确定如何探测其天线以检测射频脉冲。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    一个选项是映射和使用范围扩展器(RF 可观察) IO 来监控无线电何时处于 TX 或 RX'ing 状态。 请参阅 TI BLE Wiki 上的"CC2640范围扩展器控制"文章。 则无需探测天线。

    正如 Zahid 提到的、堆栈操作将优先于应用程序任务。 如果您在 BLE 空闲活动期间执行测量、即 i.e、当仅发送 BLE 空数据包时、堆栈操作将最小化。 您可以将测量值与 BLE 空气监听器相关联、以确认仅发送空数据包。

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

    感谢你的帮助。

    我解决了这个问题、结果发现这是一个非常不相关的问题。

    将 IOC_PORT_RFC_GP1 (PA 启用)映射到 IO 引脚很有帮助。

    根据器件是否已连接、我有条件地延迟了测量。 错误是我从 SWI (时钟超时处理程序)调用 linkDB_NumActivate()。 在这种情况下、它似乎总是返回0、因此我没有将测量延迟到连接结束脉冲。 我修改了代码以从主循环(通过事件处理程序)调用此函数。 现在、我的测量在 PA 关闭后大约开始350us。

    //从主循环调用
    //如果断开连接,立即开始测量。
    //如果已连接,则设置挂起标志,允许下一个连接事件触发测量,但在连接丢失时也会出现超时。
    静态空 SimpleBLEPeripheral_requestInitiateSCREQ_CB (){
    //如果未延迟或未连接
    uint8 numConnections = linkDB_NumActive ();
    if (SimpleBLEPeripheral_delayedAfterTX_msTimeout = 0 || numConnections = 0){
    //请求立即服务,因为不在 SWI 中。
    SimpleBLEPeripheral_handleTimeoutSCEvent();
    }否则{
    //需要等待超时或连接事件
    //启动超时时时时钟
    Clock_setTimeout (Clock_handle (&InitialateSCTimeoutClock)、(SimpleBLEPeripheral_delayedAfterTX_msTimeOut*1000)/Clock_tickPeriod (&InitializeSCTimeOutClock);
    StartPeripheral_OutTime_StartOutTime_Time_OutTiming
    );(SetTime_StartOutClock OutTime_OutTime_OutTime_OutTime_OutTime_OutTiming)
    
    

    -弥敦