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:有关如何将 A2DP 源设备与另一个 A2DP 同步永久配对(绑定)的固件示例

Guru**** 2563960 points
Other Parts Discussed in Thread: CC2564

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/574437/cc2564-firmware-example-of-how-to-permanently-pair-bond-an-a2dp-source-device-with-another-a2dp-sync

器件型号:CC2564
主题中讨论的其他器件:BT-MSPAUDSOURCE

我们使用 A3DP 参考设计 来实现与汽车信息娱乐系统配对的音频源应用。 我们需要实施一次性配对过程、以便在断电后、BT 连接将在电源恢复后自动重新建立。  我们已尝试保存和恢复链接密钥、但仅此操作不会自动恢复连接。  是否有一个现有示例说明如何执行此操作?

我看到一个类似的问题过去没有得到解答: https://e2e.ti.com/support/wireless_connectivity/bluetooth_cc256x/f/660/t/267220

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

    尊敬的 Ruben:

    此实现方案的两个部分来自 BT 堆栈侧、用于将配对器件的链路密钥存储在 NVM 中。

    -当新设备配对时,将在 GAP_Event_Callback 中发生 atLinkKeyCreation 事件。 发生此事件时、您可以看到应用程序正在将链接密钥存储在以下结构中。

    静态 LinkKeyInfo_t   LinkKeyInfo[MAX_SUPPORTED_LINK_KEYS];

    该结构存储在 RAM 中、因此在下电上电后不会保留。 此时、您可以在 MCU 的 NVM 中备份 LinkKeyInfo。

    -设备通电后,读取存储在 NVM 中的备份。 然后、在 OpenStack 调用成功后、您可以将此数据传递到 InitializeApplication()函数中的 LinkKeyInfo 结构。 这样、先前存储的 LinkKeyInfo 将在下电上电后恢复、当远程设备尝试重新连接时、A3DP 应用程序将能够使用之前存储的链接密钥。 这在 GAP_Event_Callback 的 atLinkKeyRequest 事件中发生。

    对于 MSP430,您可以将链接键写入信息页内存:

    此致、

    Vihang

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

    Vihang、

    感谢您的快速回复。  正如您所描述的、我已经实现了链接密钥的保存和恢复、但似乎还有更多的缺失。  当我对 CC256x 目标重新加电时、另一个器件(BT SYNC)会启动身份验证、并且 A3DP 代码使用存储的链接密钥正确响应。  但是、A3DP 流连接无法根据需要重新建立。  我希望 Bluetopia 栈有一个现有的示例、因为它是如此常见的用例。  我在随附的堆栈和配置文件文档中没有找到任何相关信息。

    下面是当我恢复基于 CC256x 的单元的电源时的调试终端输出。 我用不同的字体颜色突出显示了以下内容:在查询过程中、堆栈会查找并跳过 BT 器件0xA48D3B99C4C、因为它不是音频同步。  之后、先前配对的 BT 器件 0xE0750A5F0317发出链路密钥请求、CC256x 器件以之前存储的链路密钥进行响应。 此时、先前配对的器件0xE0750A5F0317表示连接已重新建立、但 CC256x 器件不会重新连接、也不会流式传输音频。  BT 器件 0xE0750A5F0317发出一系列远程控制命令、这些命令在调试终端输出中显示为 TransactionID 1至8。

    引导

    Openstack()。

    蓝牙堆栈 ID:1.

    A3DP 拉电流功能已启用。

    器件芯片组:4.1

    BD_ADDR:0x84DD20F0CD15

    EIR 数据配置成功(器件名称 SXM-DEMO-F0CD15)。

    A3DP 端点已成功打开。

    器件类:0x100428。

    支持的格式:

     频率:44100、通道:2、标志:0

     频率:48000、通道:2、标志:0

     频率:48000、通道:1、标志:0

     频率:44100、通道:1、标志:0

    (二

    *命令选项:查询、DisplayInquiryList、GetLocalAddress、*

    *          OpenSink、CloseSink、Play、Pause、Help    *

    (二

    A3DP+SRC>

    跳过0xA48D3B99C4C

    A3DP+SRC>

    无法执行自动连接。

    A3DP+SRC>

    atLinkKeyRequest:0xE0750A5F0317

    GAP_Authentication_Response 成功。

    A3DP+SRC>

    etAUD_Signaling_Channel_Open_Indication

    BD_ADDR: 0xE0750A5F0317

    A3DP+SRC>

    etAUD_Remote_Control_Command_Indication

    BD_ADDR:         0xE0750A5F0317

    TransactionID:   1.

    遥控响应:0

     

    A3DP+SRC>

    etAUD_Remote_Control_Command_Indication

    BD_ADDR:         0xE0750A5F0317

    TransactionID:   2.

     

    AUD_Change_Stream_State 成功。

    遥控响应:0

    A3DP+SRC>

    etAUD_Remote_Control_Command_Indication

    BD_ADDR:         0xE0750A5F0317

    TransactionID:   3.

    遥控响应:0

     

    A3DP+SRC>

    etAUD_Remote_Control_Command_Indication

    BD_ADDR:         0xE0750A5F0317

    TransactionID:   4.

     

    AUD_Change_Stream_State 成功。

    遥控响应:0

     

    A3DP+SRC>

    etAUD_Remote_Control_Command_Indication

    BD_ADDR:         0xE0750A5F0317

    TransactionID:   5.

    遥控响应:0

     

    A3DP+SRC>

    etAUD_Remote_Control_Command_Indication

    BD_ADDR:         0xE0750A5F0317

    TransactionID:   6.

     

    AUD_Change_Stream_State 成功。

    遥控响应:0

     

    A3DP+SRC>

    etAUD_Remote_Control_Command_Indication

    BD_ADDR:         0xE0750A5F0317

    TransactionID:   7.

    遥控响应:0

     

    A3DP+SRC>

    etAUD_Remote_Control_Command_Indication

    BD_ADDR:         0xE0750A5F0317

    TransactionID:   8.

     

    AUD_Change_Stream_State 成功。

    遥控响应:0

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

    您可以将源代码与这些添加内容共享吗? 我将在 A3DP 参考设计上试用、并尝试对此进行调试。

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

    谢谢 Vihang。  我将通过电子邮件单独发送代码。

    -Ruben

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Vihang、我注意到、当 A3DP 演示代码在 AUD 事件回调中接收到(etAUD_Stream_Open_Indication)时、它不会采取任何操作。 switch 语句只是在这种情况下有一个中断。 在收到此指示时、代码应该发出一些响应、还是在发生这种情况时更改一些状态变量? 我确认、当远程设备在之前配对后尝试重新建立流时、程序将收到该指示。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、我现在已经取得了一些进展。  为了响应 etAUD_Stream_Open_Indication、我在 AUD_Event_Callback 中添加了以下代码。  现在、我能够在初始配对后重新建立音频流、但采样率关闭、我在调试 UART 中收到有关此问题的警告。  因此我认为我需要更改 OpenA3DPStream()的参数。 可能是 AUD_Stream_Format_t 成员????  请告诉我您对此有何看法。  我几乎就在那里。

    -------- 启动代码片段---

    案例 etAUD_Stream_Open_Indication:
    每当主设备连接到我们时,便会发生/*。 *

    显示("RDP etAUD_Stream_Open_Inding\r\n");

    /*跟踪此连接的 BD_ADDR。 *
    RemoteSinkBD_ADDR = AUD_Event_Data->Event_Data.AUD_Stream_Open_Inding_Data->BD_ADDR;
    OpenA3DPStream (((AUD_Stream_Open_Confirmation_Data_t *) AUD_Event_Data->Event_Data.AUD_Stream_Open_Inding_Data);

          中断;

    --------  结束代码片段---

    我在调试 UART 上获得以下附加输出:

    A3DP+SRC>
    RDP etAUD_Stream_Open_Indication
    A3DP 打开:0
    重新配置编解码器...?完成。
    流格式:
    频率:131072
    通道:0
    标志:1106771968
    警告:给出了不兼容的采样率、默认为44.1kHz

    音频播放和遥控器工作正常、但您可以通过声音失真和播放时偶尔暂停来判断采样率错误。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、我解决了最后一个问题。 我没有注意到 OpenA3DPStream()所需的 AUD_Stream_Open_Confirmation_Data_t 结构有一个额外的成员,而 AUD_Stream_Open_Inding_Data_t 结构则不能只是转换。 解决此问题后、即使在循环通电后、CC256x 板也能够使用汽车音频系统重新建立音频流。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Ruben:

    因此、如果我正确遵循该主题、所有问题都得到了解决、是这样吗?

    到目前为止的步骤:
    1) 1)按上述方式保存并恢复链接密钥。
    2) 2)在 AUD_Event_Callback 的 etAUD_Stream_Open_Indication 事件下添加 OpenA3DPStream () API 调用、以便在配对器件连接时自主将 VS_A3DP_Open_Stream 发送到控制器。

    如有任何缺失、请告知我们。 谢谢。

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

    Vihang、

    是的、这基本上就是它、但现在我想知道该代码示例中缺少的其他内容。  设备已成功连接至某些音频同步、但未连接至其它音频同步。  我没有时间调试与其他器件的连接。

    Ruben

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Vihang、
    请参阅下面的调试输出示例、当我尝试将 A3DP 源代码演示与另一个同步器件配对时、我会获得该示例。 您能不能从这一点看出另一台设备拒绝连接的原因? 这是因为 A3DP 源代码演示不支持中间安全性中的 MAN 吗? 我注意到该器件的 atIOCapabilityResponse 列出了 MIPTM、但我不确定这是否意味着它将仅与启用了 MIPTM 支持的其他器件配对。 如果是这种情况、您能否在 A3DP 源代码示例中分享一个有关如何启用 MIPTM 支持的示例?

    您对如何进行调试有什么建议吗? 我是否需要 BT 协议分析器?

    A3DP+SRC>引导
    Openstack()。
    蓝牙堆栈 ID:1.
    A3DP 拉电流功能已启用。
    器件芯片组:4.1
    BD_ADDR:0x84DD20F0CD15
    EIR 数据配置成功(器件名称 SXM-DEMO-F0CD15)。
    A3DP 端点已成功打开。
    器件类:0x100428。
    支持的格式:
    频率:44100、通道:2、标志:0
    频率:48000、通道:2、标志:0
    频率:48000、通道:1、标志:0
    频率:44100、通道:1、标志:0

    (二
    *命令选项:查询、DisplayInquiryList、GetLocalAddress、*
    * OpenSink、CloseSink、Play、Pause、Help *
    (二

    A3DP+SRC>
    将0x48A9D2AFE086添加到自动连接列表。

    A3DP+SRC>
    通过 AUD 自动连接到0x48A9D2AFE086 ...

    A3DP+SRC>
    atLinkKeyRequest:0x48A9D2AAF086

    GAP_Authentication_Response 成功。

    A3DP+SRC>
    atIOCapabilityRequest:0x48A9D2AAF086

    验证成功。

    A3DP+SRC>
    atIOCapabilityResponse:0x48A9D2AAF086
    功能:显示是/否、MIPTM

    A3DP+SRC>
    atUserConfirmationRequest:0x48A9D2AAF086

    自动接受:712567

    GAP_Authentication_Response 成功。

    A3DP+SRC>未处理的授权。 事件。
    GAP_Authentication_Event_Type = 757792779

    A3DP+SRC>
    etAUD_Stream_Open_Confirmation
    状态: 2.
    BD_ADDR: 0x48A9D2AFE086
    连接到0x48A9D2AFE086失败。
    结束自动连接过程。

    A3DP+SRC>
    ATAuthenticationStatus:5 for 0x48A9D2AAF086

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

    对拖延表示歉意。

    "atAuthenticationStatus:5"表示由于错误的 pincode 或错误的链接密钥而导致身份验证失败。 考虑到您正在使用先前存储的链接密钥、此错误很可能是由于链接密钥不正确造成的。

    我建议为整个操作捕获 CC256x FW 日志(从保存第一个链接密钥到在重启后身份验证失败)。 此外、请确保 MAX_SUPPORD_LINK_KEYs 定义为大于1。 默认情况下、此宏设置为1。 这将导致示例应用程序保存的远程设备的链接密钥不超过1个。

    此致、
    Vihang
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好,Vihang 已修改代码以替换存储的链接密钥(配对模式)或使用存储的链接密钥(配对模式)。 我们使用外部按钮进行连线、以在这两种模式之间进行选择。 因此、我们只需要将 MAX_SUPPORTED 链接键设置为1。 正如我提到过的、这种方法在某些 A2DP 接收器件上完全适用、但在其他器件上不适用。 请告诉我如何捕获 CC256x FW 日志。 这是通过相同的调试 UART 引脚还是通过其他方式实现的?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Ruben:

    感谢您的更新。 我知道 MAX_SUPPORTED 链接密钥宏不是这个问题的原因。

    您可以从 CC2564的 TX_DBG 行捕获 CC256x FW 日志。 可从 BT-MSPAUDSOURCE 板的 J18访问该信号。 为此、您需要一根1.8V UART 转 USB 电缆、才能使用 TX_DBG 和 GND 捕获 CC256x FW 日志。
    processors.wiki.ti.com/.../CC256x_Logger_User_Guide

    我将在日志中查找 HCI 命令和 CC256x FW 跟踪、以帮助我们了解发生故障的 A2DP 接收器件未配对的原因。 请随时向我发布。 谢谢。

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

    Vihang、

    我能够让 BT 记录器与 CC256x 配合使用。 是否可以同时保存主日志“BT Logger”和 HCI 日志?  如果我同时选择这两个、似乎只能看到主记录器。 或者,我是否需要在选择了“BT Logger”的情况下运行一次,然后在选择了“HCI/LMP Viewer 1”的情况下重复此操作(请参阅相关设置的屏幕截图)?


     

    您能否确认所附文件的格式是否正确? 这些不是我在上一个帖子中询问的实际故障情况、只是我对记录器的初始测试。

     

    谢谢、

    Ruben

    e2e.ti.com/.../cc256x_5F00_test_5F00_logs.zip

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

    尊敬的 Ruben:

    看起来第一个日志(BT_logger_test_april11_rdp.lgr)是在仅选择"BT Logger 1"选项的情况下捕获的。 而第二个(HCI_LOG_TEST_april11_RDP.lgr)仅使用"HCI/LMP 查看器1"选项进行捕获。

    最好在捕获时启用(复选框)这两个选项、使它们处于时间同步状态。 然后、如果需要、我们只能从捕获的日志中筛选特定部件。 请确保两个选项都已设置 COM 端口。

    此致、
    Vihang

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

    Vihang、

    我已为通过示例和失败示例附加了 BT Logger 日志。  

    1. 文件"gain_pair_n_play_Jeep_April11.lgr"捕获配对模式下的 CC256x 系统、 然后成功配对、A2DP 回放至 2015年 Jeep Wrangler 的信息娱乐系统。  
    2. 之后、系统断电、文件"gain_prev_paired_n_play_Jeep_April11.lgr" 捕获处于非配对模式的 CC256x 系统(保留先前配对的链接密钥)、然后进行身份验证、并从1开始对吉普车信息娱乐系统进行 A2DP 回放。
    3. 接下来、文件"failed_Pair_Dodge_April11.lg"捕获处于配对模式的 CC256x 系统、然后尝试与2015 Dodge Durango 的信息娱乐系统配对失败。

    如前所述、  IO 功能请求/响应序列在通过系统和失败系统之间似乎不同。

    请告诉我日志显示了什么内容。

    谢谢、

    Rubene2e.ti.com/.../cc256x_5F00_logs.zip