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.

[参考译文] CC2564:如何区分断开原因?

Guru**** 2589280 points
Other Parts Discussed in Thread: CC2564MODA, CC2564

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/701591/cc2564-how-to-differentiate-disconnection-reason

器件型号:CC2564

您好!

我目前正在使用一种耳机、它在手机和设备之间使用蓝牙连接。
该器件基于由 STM32L4微控制器控制的 CC2564MODA 芯片。
我在 ST 芯片上成功集成了 Bluetopia 堆栈、并成功通过 HCI 命令和 I2S 音频样本控制 CC2564。

我选择使用堆栈中给出的示例包括蓝牙 HFP 配置文件。 它也适用于我的用例。

我的问题是:

如果因距离或传输错误而断开连接、我的设备必须自动连接电话。
但是、如果用户决定在手机端停止与我的设备的连接、则不得尝试重新连接手机。
我当前使用事件  etHFRE_CLOSE_Port_Indication 来检测断开连接并启动重新连接过程、但此事件不允许我查看用户是否故意停止连接。

是否有办法区分断开原因?

我浏览了 TI 论坛、但未找到任何有关该主题的信息。

提前感谢、

Alain。

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Alain,您能否共享 HCI 测试仪和固件日志?

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

    尊敬的 Saurabh:

    我的器件不包含 UART 输出、因此我无法再访问固件日志。
    我只能从 TX_DBG 引脚共享 BT 日志。 这是否相关?

    此致、

    Alain。

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

    尊敬的 Alain:

    是的、请从 TX_DBG 引脚共享 BT 固件日志。

    BT Logger 用户指南:  

    BR、

    Vihang

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

    您好、Vihang、

    我将日志分为3个文件、每个文件代表不同的情形:

    第一个示例显示了与之前与我的设备配对的远程设备(Android 手机)的连接。 目前没有问题。
    2.建立连接后,第二个文件显示与用户断开连接。 为此、我进入 Android 蓝牙菜单并单击我的器件名称。
    最后一个示例显示 、在建立连接后、与距离断开。 为此、我将手机拿出来、远距离使用我的设备、直到 蓝牙菜单指示它们之间没有连接。

    我想区分器件侧的情形2和情形3;因此、在第3种情况下、我启动重新连接过程、在第2种情况下、我不执行任何操作。

    感谢你的帮助、

    Alain

    附加文件:

    e2e.ti.com/.../logs.zip

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

    您好、Vihang、

    有关此问题的一些更新:
    在我在这个论坛上的另一篇文章中、Saurabh 说我的日志不完整。 因此、我这次使用正确的参数记录了与远程侧用户的断开连接(请参阅附加的文件)并研究了日志。

    我可以看到 、主机向器件发送了一条 HCI_Disconnect 命令、原因为0x13 (远程用户终止连接)。 我想在微控制器上获取这些信息。 由于我的代码不会特意发送 HCI_Disconnect 命令、因此我怀疑 执行该命令的库是 SS1BTHFR。

    为了  检索  etDisconnection_Complete_Event、我注册并添加了 HCI_Event_Callback。 不幸的是,它永远不会来。
    在 HCI_Event_Callback 的一个片段下面:

    静态空 BTPSAPI HCI_Event_Callback (unsigned int BluetoothStackID、HCI_Event_Data_t * HCI_Event_Data、unsigned Long CallbackParameter)
    {
    HCI_Disconnection_Complete_Event_Data_t * HCI_Disconnection_Complete_Event_Data;
    
    //首先,检查所需参数是否显示 */
    /*半有效。 //
    if ((BluetoothStackID)&&(HCI_Event_Data)
    ){
    /*参数看起来是半有效的,现在检查*/
    /*键入传入事件。 *
    switch (HCI_Event_Data->Event_Data_Type)
    {
    案例 etDisconnection_Complete_Event:
    
    HCI_Disconnection_Complete_Event_Data = HCI_Event_Data->Event_Data.HCI_Disconnection_Complete_Event_Data;
    if (HCI_Disconnection_Complete_Event_Data->Reason == HCI_ERROR_CODE_OTHER _END_TERMINATED_CONNECT_USER_END)
    {
    while (1);
    }
    中断;
    }
    }
    

    因此、我的问题仍然是、是否有方法可以获取主机端的信息远程用户终止连接。

    此致、

    Alain。

    附加文件:

    e2e.ti.com/.../2335.logs.zip

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

    我在这些日志中看到一些异常行为。 虽然主机堆栈看起来是向 CC256xB 发送 HCI_Disconnect 命令、但芯片正在复位、然后才能为此 HCI_Disconnect 发送 Disconnection_Complete_Event。
    -#2453主机发送带有原因0x13的 HCI_Disconnect 命令。
    -#2454控制器为此命令发送 HCI_Command_Status_Event。
    -#2455主机向控制器发送 HCI_VS_SLEEP_Mode_Configurations 命令。 除非在应用中进行了专门编程、否则堆栈或配置文件本身不会发出此消息。 <-请检查您的应用程序是否正在执行此操作。
    -# 2468在 CC256x 控制器可以断开连接并将相应的 HCI_Disconnection_Complete_Event 发送到主机之前、通过切换 nSHUTD 引脚来复位控制器。 <-也请检查您的应用程序是否存在此错误行为。

    通常、由于远程设备超出范围、HCI_Disconnection_Complete_Event 将包含"链路丢失"情形中的两个原因代码之一。
    HCI_ERROR_CODE_CONNECT_TIMEOUT 0x08或
    HCI_ERROR_CODE_LMP_RESPONSE_TIMEOUT 0x22。

    类似地、当远程用户手动断开连接时、原因代码将为0x13 (如上面的实现)。

    因此、我认为您处于关于 HCI_Event_Callback 的正确路径。 通过在 etDisconnection_Complete_Event 案例中检查正确的原因代码、您可以成功区分因链路丢失而导致的断开和因用户终止而导致的断开。

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

    您好、 Vihang、

    我检查了您向我指出的异常行为。
    实际上、我在这个过程中过早地监控断开连接(类似于 HFP 关闭端口指示)、这在我的代码中触发了 BT 模块的关断。
    现在,我等待 HCI 断开事件,然后再关闭任何设备,它将按预期工作!

    非常感谢你的帮助。

    此致、

    Alain。