ST意法半导体
直播中

赵敏

8年用户 1157经验值
私信 关注
[问答]

BLE Audio CAP_UNICAST_SERVER_ASE_STATE_EVT状态变化异常的原因?

我在使用STM32WBA55G-DK1开发我的BLE Audio应用。我参考了ST提供的BLE_Audio_TMAP_Periopheral示例工程。

目前平板电脑连接我的应用正常,平板可以使能BLE Audio。但是当平板开始播放音乐的时候,BLE Audio协议栈上送的CAP_UNICAST_SERVER_ASE_STATE_EVT事件异常,其状态一开始是ASE_STATE_CODEC_CONFIGURED,然后是ASE_STATE_RELEASING。

作为对比,我使用BLE_Audio_TMAP_Periopheral进行测试,其CAP_UNICAST_SERVER_ASE_STATE_EVT状态是变化规律如下
ASE_STATE_CODEC_CONFIGURED->ASE_STATE_QOS_CONFIGURED->ASE_STATE_ENABLING->ASE_STATE_STREAMING。

是什么导致我的应用ASE状态没能从ASE_STATE_CODEC_CONFIGURED变迁到ASE_STATE_QOS_CONFIGURED?
下面是我的log

1204.392 CAP Event: 0x0d
1204.392 Preferred Server QoS Settings is requested for ASE ID 1 (Type ASE_SINK)
1204.392   Target Latency : TARGET_LATENCY_BALANCED_RELIABILITY
1204.392   Target Phy TARGET_LE_2M_PHY to achieve the Target Latency
1204.393   Codec ID
1204.393     Coding format : AUDIO_CODING_FORMAT_LC3
1204.393     Company id : 0x0000
1204.393     VS codec id : 0x0000
1204.393     Frequency : SAMPLE_FREQ_48000_HZ
1204.393     Frame Duration : FRAME_DURATION_10_MS
1204.393     Octets Per Codec Frame : 155
1204.393     Codec Frame Blocks Per SDU : 1
1204.393   Min Controller Delay in Source role 8336 us
1204.393   Max Controller Delay in Source role 110000 us
1204.393   Min Controller Delay in Sink role 4136 us
1204.393   Max Controller Delay in Sink role 50000 us
1204.393   Calculated SDU Interval : 10000 us
1204.393   num_snk_ases:2 num_src_ases:1
1204.393 ==>> CODEC_ReadLocalSupportedControllerDelay result 0x00
1204.394 ==>> CODEC_ReadLocalSupportedControllerDelay result 0x00
1204.394 Computed Min Controller Delay with 2 Snk ASEs and 1 Src ASEs : 14608 us
1204.394 WARNING : Controller Delay Min ( 14608 us) could be higher than the frame duration (10 ms)
1204.394 Submitted Min Presentation Delay 10010 us
1204.394 Submitted Max Presentation Delay 50010 us
1204.394 ==>> CODEC_ReadLocalSupportedControllerDelay result 0x00
1204.394 ==>> CODEC_ReadLocalSupportedControllerDelay result 0x00
1204.394 ==>> CODEC_ReadLocalSupportedControllerDelay result 0x00
1204.394 CAP Event: 0x0d
1204.395 Preferred Server QoS Settings is requested for ASE ID 2 (Type ASE_SINK)
1204.395   Target Latency : TARGET_LATENCY_BALANCED_RELIABILITY
1204.395   Target Phy TARGET_LE_2M_PHY to achieve the Target Latency
1204.395   Codec ID
1204.395     Coding format : AUDIO_CODING_FORMAT_LC3
1204.395     Company id : 0x0000
1204.396     VS codec id : 0x0000
1204.396     Frequency : SAMPLE_FREQ_48000_HZ
1204.396     Frame Duration : FRAME_DURATION_10_MS
1204.396     Octets Per Codec Frame : 155
1204.396     Codec Frame Blocks Per SDU : 1
1204.396   Min Controller Delay in Source role 8336 us
1204.396   Max Controller Delay in Source role 110000 us
1204.396   Min Controller Delay in Sink role 4136 us
1204.396   Max Controller Delay in Sink role 50000 us
1204.396   Calculated SDU Interval : 10000 us
1204.396   num_snk_ases:2 num_src_ases:1
1204.396 ==>> CODEC_ReadLocalSupportedControllerDelay result 0x00
1204.396 ==>> CODEC_ReadLocalSupportedControllerDelay result 0x00
1204.396 Computed Min Controller Delay with 2 Snk ASEs and 1 Src ASEs : 14608 us
1204.397 WARNING : Controller Delay Min ( 14608 us) could be higher than the frame duration (10 ms)
1204.397 Submitted Min Presentation Delay 10010 us
1204.397 Submitted Max Presentation Delay 50010 us
1204.397 CAP Event: 0x13
1204.397 Preferred Server Configuration for QoS Configuration:
1204.397   Framing:BAP_FRAMING_UNFRAMED
1204.397   Preferred PhyE_2M_PHY_PREFERRED
1204.397   PrefRetransmissionNumber:2
1204.397   MaxTransportLatency:5 ms
1204.397   PresentationDelayMin:10010 us
1204.397   PresentationDelayMax:50010 us
1204.398   PrefPresentationDelayMin:10010 us
1204.398   PrefPresentationDelayMax:50010 us
1204.398 Codec specific configuration for the ASE:
1204.398   CodingFormat:AUDIO_CODING_FORMAT_LC3
           CompanyID:0x00
           VsCodecID:0x00
1204.398 Audio Stream Endpoint State ASE_ID:1 Type:ASE_SINK State:ASE_STATE_CODEC_CONFIGURED
1204.399 CAP Event: 0x13
1204.399 Preferred Server Configuration for QoS Configuration:
1204.399   Framing:BAP_FRAMING_UNFRAMED
1204.399   Preferred PhyE_2M_PHY_PREFERRED
1204.399   PrefRetransmissionNumber:2
1204.399   MaxTransportLatency:5 ms
1204.399   PresentationDelayMin:10010 us
1204.399   PresentationDelayMax:50010 us
1204.399   PrefPresentationDelayMin:10010 us
1204.399   PrefPresentationDelayMax:50010 us
1204.399 Codec specific configuration for the ASE:
1204.399   CodingFormat:AUDIO_CODING_FORMAT_LC3
           CompanyID:0x00
           VsCodecID:0x00
1204.400 Audio Stream Endpoint State ASE_ID:2 Type:ASE_SINK State:ASE_STATE_CODEC_CONFIGURED
1204.630 CAP Event: 0x13
1204.631 Audio Stream Endpoint State ASE_ID:1 Type:ASE_SINK State:ASE_STATE_RELEASING
1204.631 CAP Event: 0x13
1204.631 Audio Stream Endpoint State ASE_ID:1 Type:ASE_SINK State:ASE_STATE_IDLE
1204.631 CAP Event: 0x13
1204.631 Audio Stream Endpoint State ASE_ID:2 Type:ASE_SINK State:ASE_STATE_RELEASING
1204.631 CAP Event: 0x13
1204.631 Audio Stream Endpoint State ASE_ID:2 Type:ASE_SINK State:ASE_STATE_IDLE

回帖(1)

李勇

2025-6-17 18:05:42

好的,我们来分析一下 CAP_UNICAST_SERVER_ASE_STATE_EVTASE_STATE_CODEC_CONFIGURED 直接跳到 ASE_STATE_RELEASING 的异常原因。这种现象表明远端设备(你的平板)尝试配置了 Codec,但紧接着发起了释放请求,说明某个关键步骤失败了,连接无法正常进入 QoS 配置和播放状态。这与官方示例的成功流程形成鲜明对比。


以下是最常见的原因和排查方向:




  1. 无效的 Codec 配置:



    • Codec 参数不支持: 你的设备 (hci_control_le.c 中的 CONTEXT) 在 APP_BLE_Init_User() 中声明的支持能力 (sdp_presentation_format)与平板请求的 Codec 具体参数(如采样率、位深、帧长、通道分配)不完全匹配。

    • 关键步骤缺失: ASE_STATE_CODEC_CONFIGURED 之后,协议栈会调用应用层注册的 aics_ctrl_cb.qos_configure 回调函数(在 hci_control_le.c 中通常名为 qos_configure_callback)。你需要在这个回调函数里做:

      • 确认 QoS 参数(如 Latency, PHY, SDU Interval, Framing)是否合理且在设备能力范围内。

      • 分配必要的资源(音频数据路径所需的内存池 - Memory Pool 及其缓冲区、DMA 通道、PCM 接口初始化、音频处理任务等)。这是最常见的问题点!

      • 调用 hci_le_set_cig_parameters API(通常在代码中是 hci_le_set_cig_parameters_test)来实际配置连接组 (CIG)。

      • 调用 hci_le_accept_iso_chronous_connection_request API(在代码中通常是 hci_le_accept_cis_request)来接受 CIS 连接请求。


    • 建议: 仔细检查 hci_control_le.cqos_configure_callback 函数的实现:

      • 是否确实调用了 hci_le_set_cig_parameters_testhci_le_accept_cis_request?

      • 是否根据 QoS 要求(qos_interval)正确计算并分配了足够大的音频 Buffer?使用 AUDIO_IN_Buffer 类型。

      • 是否确认了资源分配成功?检查分配操作(如 SYS_APP_MEM_ALLOC)的返回值。





  2. ISO 连接接收失败:



    • 即使 qos_configure 做了部分工作,如果 hci_le_accept_cis_request 没有被调用,或者调用了但参数不正确、时机不当,远端设备就无法成功建立 CIS 连接。

    • 建议: 确保 hci_le_accept_cis_request 在收到 QoS 配置事件后,在合理的时间内被调用。检查传递给 hci_le_accept_cis_request 的参数(如 cis_conn_handle, ac_latency, max_pdu)是否正确。这些通常需要从收到的参数中提取或根据本地能力确定。




  3. 资源不足:



    • 内存不足: 这是导致失败的另一大常见原因。尤其是为音频缓冲区分配大块内存时失败。BLE Audio 对内存要求较高(特别是多通道、低延迟设置)。

    • 硬件资源不足: 所需的 DMA 通道、定时器、音频外设资源冲突或被占用。

    • 中断/任务优先级: 处理音频流的任务优先级不够高或被阻塞,导致流数据无法及时处理。

    • 建议:

      • 仔细检查堆 (Heap) 大小(FreeRTOSConfig.h 中的 configTOTAL_HEAP_SIZE)。尝试增大 Heap Size。

      • 确认 SYS_APP_MEM_ALLOC 使用的内存池大小是否足够 (SYS_APP_MEM_BUFFER_SIZE)。尝试增大该值。

      • 检查内存分配(aics_ctrl_cb.buf_mem_pool 相关分配)是否成功。在调用分配后增加打印或断言检查返回值是否为 NULL

      • 排查硬件资源冲突。确保启动音频任务/定时器时需要的资源可用。





  4. Audio Clock 与 ISO Interval 不一致:



    • 确保你的音频硬件(如 I²S)配置的采样率、时钟设置与 Codec 参数和 CIS ISO Interval 匹配。

    • 建议:确认 qos_configured 事件中传递的 qos_interval (即每个 ISO PDU 的间隔) 是否与你音频系统的调度和硬件能力兼容。检查 map_specific.c 或类似文件中设置音频定时器的相关计算是否正确。




  5. 安全配置问题 (CIS Encryption):



    • 如果 CIS 需要加密,而两端未能成功完成加密过程,也会导致连接失败并被释放。

    • 建议: 检查 gap_manager.c 中的安全初始化、配对/绑定流程以及 CIS 加密密钥的分发是否正常。在 qos_configure_callback 中,检查 ase_info->cis_conn_handle 所代表的连接的安全状态是否满足加密要求。




  6. 日志与跟踪:



    • 启用协议栈 LOG: ST 的 Cube BLE 库通常支持 LOG。请确保启用较高级别的 LOG (如 DBG_LOG_FULLDBG_LOG_SUMMARY_HCI_CMD_EVT),将其定向到串口输出。

    • 添加应用层 LOG:hci_control_le.c 的关键流程点(如 ase_state_callback, qos_configure_callback, disconnected_callback, APP_BLE_UserEvtRx)添加详细打印。输出 ASE 状态变化、事件代码、参数值、函数执行流、API 调用结果(如 hci_le_set_cig_parameters_test, hci_le_accept_cis_request 的返回值)、内存分配结果。特别关注 ASE_STATE_RELEASING 事件发生前的最后一个事件和操作是什么。

    • 使用调试工具: 利用 J-Link/ST-Link 进行单步调试,重点看 qos_configure_callback 内的执行流和变量值。或者用逻辑分析仪、示波器监控关键信号(如 I²S WS/BCK、GPIO 翻转指示特定函数执行)。




诊断步骤建议 (优先级递减):



  1. 对比官方示例: 将你的 hci_control_le.c 中的 ase_state_callbackqos_configure_callback 函数与 BLE_Audio_TMAP_Peripheral 示例中对应的函数进行 逐行对比。尤其是 qos_configure_callback 函数中资源分配和关键 API (hci_le_set_cig_parameters_test, hci_le_accept_cis_request) 的调用位置、参数和返回值检查。

  2. 增强LOG: 在所有关键回调函数和资源分配点添加详细的 LOG,特别是:

    • 进入/退出 ase_state_callback 时打印 statease_info->ase_index

    • qos_configure_callback 函数:打印参数值;打印调用 SYS_APP_MEM_ALLOC 分配 Buffer 前后的地址(检查是否 NULL);打印调用 hci_le_set_cig_parameters_testhci_le_accept_cis_request 的位置及其返回值 (ret)。检查 LOG 是否显示确实调用了这两个 API?

    • 查找是否有 APP_BLE_Disconnect 或其他异常断开操作被调用。


  3. 检查资源分配:qos_configure_callback 中,添加对 SYS_APP_MEM_ALLOC 返回值是否为 NULL 的检查(增加 ASSERT 或 LOG),确认 Buffer 分配成功。计算实际需要的内存大小是否超过 SYS_APP_MEM_BUFFER_SIZE

  4. 检查堆大小: 暂时大幅增加 configTOTAL_HEAP_SIZESYS_APP_MEM_BUFFER_SIZE,排除内存不足的可能性。

  5. 简化配置: 尝试使用最基础的 LC3 配置(如 16KHz, 1 Channel, Frame=1)。看基础配置是否能工作。

  6. 抓取 HCI Log: 如果设备支持或有额外的工具(如 Ellisys、Frontline、nRF Sniffer),抓取空中传输的 HCI 或 BLE 数据包。这能清晰看到主机(平板)实际发送了什么请求,从机(你的设备)又回复了什么,更容易定位协商失败点。


总结:CODEC_CONFIGURED 直接跳到 RELEASING,核心问题几乎可以肯定发生在 qos_configure_callback 及其触发的后续流程(主要是配置 CIG/接受 CIS 请求)中。仔细检查 qos_configure_callback 函数是否正确完整地实现了资源分配(特别是大块 Audio Buffer)、调用 hci_le_set_cig_parameters_testhci_le_accept_cis_request,并成功配置了硬件/软件音频路径是重中之重。内存不足 (Heap/Buffer Pool 太小) 是另一个高发原因。打开详细的 LOG 是定位这类时序和状态机问题的关键手段。坚持对比官方示例的实现细节,几乎总能发现差异点。祝排查顺利!

举报

更多回帖

发帖
×
20
完善资料,
赚取积分