蓝牙SCO连接过程有几点疑问,大佬们有空闲时间帮忙看看

  1. AG 连接 上HF以后 ,SCO连接成功携带的参数 明明是 60一个包 ,但是实际上接收到又是120一个 其中air mode = 2 应该是CVSD?有些不确定这些参数值对应的含义 不知道是否有文档介绍? 日志下图

 2.SF32LB52X下的音频LCPU_HCPU_AUDIO_RAM是下图这个地址吗? 为什么注释上的地址和实际计算的地址不同?因为第三点的问题 希望确定一下 是0x2040E000还是0x2040FFFF

3.使用L2CAP+SCO的方式 8k CVSD 编码前提下 没有出现第一点的问题,但连接上接收到一段时间0数据以后数据会发生变化,固定的值,远端设备是成熟的产品,应该不是数据源的问题

HFP_AG - SiFli SDK编程指南 文档

在蓝牙 eSCO(extended Synchronous Connection-Oriented)链路建立过程中,LMP 会协商一组“complete 参数”。
它们决定了链路的时间位置、包型、重传策略和语音编码格式,具体字段含义如下(按 Spec 常见顺序):

  1. eSCO Handle
    1 字节,主设备分配给这条 eSCO 逻辑传输的本地标识,后续 LMP 命令与基带调度都通过它引用该链路。

  2. eSCO Packet Type
    1 字节,同时给出“主→从”和“从→主”两个方向的包型,常见值:
    0x00 = HV1 64 kb/s 1/3 FEC
    0x01 = HV2 64 kb/s 2/3 FEC
    0x02 = HV3 64 kb/s 无 FEC
    0x03 = EV3 96 kb/s 可重传
    0x04 = EV4 192 kb/s 可重传
    0x05 = EV5 288 kb/s 可重传
    高于 0x05 的为 2-EV3、3-EV3、2-EV5、3-EV5 等增强速率包型。
    选定的包型直接决定码率、FEC 强度以及是否具备重传能力。

  3. eSCO Interval (Tesco)
    2 字节,单位“时隙”(0.625 ms),表示相邻两条 eSCO 保留时隙之间的固定间隔。
    必须为偶数,常用 6、8、12 等。间隔越小、时隙占用越多,延迟越低、抗抖动能力越强。

  4. eSCO Offset (Desco)
    1 字节,表示第一条 eSCO 保留时隙相对于“当前主时钟”的偏移量,用于把链路放到主设备希望的绝对时隙号上,避免与现有 ACL/SCO 冲突。

  5. eSCO Retransmission Window (Wesco)
    1 字节,给出“重传窗口”长度(单位仍为时隙)。
    如果 Wesco>0,eSCO 包在保留时隙发送失败后,可以在后续 Wesco 个时隙内补发,提高鲁棒性;SCO 则无此字段。

  6. eSCO Air Mode
    1 字节,规定 64 kb/s 同步载荷的编码方式:
    0x00 = 线性 PCM,A-law
    0x01 = 线性 PCM,μ-law
    0x02 = CVSD(蓝牙耳机/免提最常用)
    0x03 = 透明数据(Transparent Data,用于厂商自定义编码)
    主从双方必须支持同一模式,否则链路建立失败。

  7. Negotiation State / Flags(部分实现可见)
    用 1 bit 表示当前是“请求”还是“确认”阶段,以及是否接受对端参数。
    主设备先发出请求携带上述字段,从设备可在相同字段里回显并微调,主设备再次确认后即完成协商。

当 LMP 收到一条携带以上完整字段的“LMP_eSCO_Link_Request”或“LMP_eSCO_Complete” 消息时,即认为 eSCO complete 参数已确定,基带层随即在 (Tesco, Desco, Wesco) 定义的周期内预留时隙,并按指定包型与 Air Mode 开始收发 64 kb/s 同步数据流

这些参数了解了 ,我使用52D并在SCO连接成功下(8K cvsd), 做了一个回环测试,将52D收到的SCO数据包原封不动,不进行编解码重新丢到远端耳机,发现有一股很大的底噪声掩盖,人声还算比较连贯,清晰。远端耳机是一个成熟的设备和其他耳机互连也没这个问题,唯独和52D有(未使用audio_server音频框架,是自己重新写的)也统计了1s当中包的个数 134个 应该算正常, 查看远端耳机的连接参数 和52D上也是一致的 是52D有什么特殊地方需要处理吗? 583上 没有这个问题 代码如下

可以改成这样子试试看吗?

没有什么效果 ,我将CONFIG_AUDIO = y 这些宏都关闭了 这些文件应该都没有使用才对,初始化IPC通知 再去ringbuffer当中取数据

远端耳机收过来的数据 在52D上是没有经过编解码直接重丢回去的