4. SCO/eSCO音频链路:同步面向连接(SCO)原理、增强型SCO(eSCO)重传机制、SCO参数(Tesco、Wesco、Sniff)配置

各位好,今天我们聊聊蓝牙音频里最核心的链路——SCO和eSCO。说实话,很多做蓝牙耳机的工程师,一听到SCO就觉得头疼。参数多、时序紧、调试起来还容易翻车。我当年刚入行时,就被SCO的Tesco参数坑过,耳机通话时断断续续,客户差点退货。

嗯,咱们今天就把这块彻底讲透。你想想看,搞懂了SCO/eSCO,蓝牙通话的底层逻辑你就掌握了八成。

4.1 同步面向连接(SCO)原理

SCO,全称是Synchronous Connection Oriented。说白了,就是蓝牙里专门为实时音频预留的通道。它是个对称的、点对点的同步链路。

核心特点:

  • 固定带宽预留:一旦建立,主从设备之间就固定占用时隙。不像ACL那样抢带宽。
  • 无重传机制:原始SCO不重传。丢了就丢了,因为音频是实时的,重传反而引入延迟。
  • 固定包类型:HV1、HV2、HV3,分别对应不同的编码和冗余度。

重要:SCO的包类型决定了你的音频质量和链路鲁棒性。HV1冗余最高,但带宽占用也最大。HV3带宽占用小,但抗干扰差。

我记得有个项目,客户要求超低功耗。我一开始选了HV3,结果在RF环境复杂的商场里,通话断断续续。后来换成HV2,虽然功耗高了一点,但用户体验好了很多。这就是取舍。

4.2 增强型SCO(eSCO)重传机制

eSCO是SCO的进化版。它解决了SCO最大的痛点——丢包后只能干瞪眼。

eSCO做了什么改进?

  • 引入了重传窗口:允许在预留时隙内重传丢失的包。
  • 更灵活的包类型:EV3、EV4、EV5,支持不同的编码和重传次数。
  • 更好的带宽利用率:通过协商参数,可以动态调整。

为什么会这样?因为蓝牙音频的应用场景变了。早期只是打电话,现在还要支持游戏、语音助手。这些场景对延迟和丢包率的要求完全不同。

我的经验:做游戏耳机时,我建议优先用eSCO的EV5包类型,配合2次重传。延迟能控制在15ms以内,丢包率低于1%。但要注意,重传次数越多,功耗越高。这是个平衡。

我曾经在一个项目中,为了追求极致音质,把重传次数设到了3次。结果耳机发热严重,通话半小时就烫耳朵。后来改成2次,效果就很好。嗯,这里要注意,重传不是越多越好。

4.3 SCO参数配置(Tesco、Wesco、Sniff)

这部分是实战中最容易出问题的。参数配不好,链路就不稳定。咱们一个一个说。

4.3.1 Tesco(传输时机)

Tesco,全称是Transmission Slot Configuration。它决定了SCO/eSCO链路的时隙分配。

关键点:

  • Tesco值:表示两个连续的SCO时隙之间的间隔。单位是时隙(1时隙=625μs)。
  • 典型值:对于SCO,Tesco通常是2、4、6。对于eSCO,范围更灵活。
  • 影响:Tesco越小,链路越密集,延迟越低,但功耗越高。
参数 典型值 延迟 功耗 适用场景
Tesco=2 1.25ms 游戏、低延迟通话
Tesco=4 2.5ms 普通通话
Tesco=6 3.75ms 省电模式

避坑指南:我曾经把Tesco设成2,以为延迟越低越好。结果发现耳机在弱信号下频繁断链。因为Tesco太小,留给重传的窗口不够。后来我改成Tesco=4,配合eSCO的2次重传,效果就稳定了。

4.3.2 Wesco(重传窗口)

Wesco,全称是Window Size Configuration。它定义了eSCO链路中允许重传的时隙数量。

关键点:

  • Wesco值:表示在Tesco间隔内,预留了多少个时隙用于重传。
  • 典型值:0(无重传)、1、2、3。
  • 影响:Wesco越大,抗干扰能力越强,但延迟和功耗也越高。

我个人习惯,在RF环境复杂的场景下,Wesco至少设2。如果环境干净,设1就够了。你想想看,Wesco设3的话,重传窗口占了大部分时间,新数据反而传得慢,得不偿失。

4.3.3 Sniff(呼吸模式)

Sniff模式,说白了就是让耳机在空闲时休眠,省电。但SCO/eSCO链路中,Sniff的配置要格外小心。

关键点:

  • Sniff Interval:耳机唤醒的间隔。单位是时隙。
  • Sniff Attempt:每次唤醒后,尝试接收数据的次数。
  • Sniff Timeout:如果没收到数据,多久后再次休眠。

重要:在SCO/eSCO链路中,Sniff Interval不能大于Tesco。否则耳机可能在SCO时隙到来时还在休眠,导致丢包。

我记得有个项目,为了省电,把Sniff Interval设得很大。结果通话时经常出现“咔咔”的杂音。排查了半天,发现是Sniff和Tesco冲突了。后来把Sniff Interval设成和Tesco一样,问题就解决了。

4.4 实战配置建议

说了这么多,给各位一个我常用的配置模板。你可以根据实际场景调整。

// 普通通话场景
Tesco = 4
Wesco = 2
Sniff Interval = 4
Sniff Attempt = 1
Sniff Timeout = 2
包类型 = EV3

// 游戏低延迟场景
Tesco = 2
Wesco = 1
Sniff Interval = 2
Sniff Attempt = 2
Sniff Timeout = 1
包类型 = EV5

// 省电场景
Tesco = 6
Wesco = 0
Sniff Interval = 6
Sniff Attempt = 1
Sniff Timeout = 3
包类型 = EV4

我的建议:不要直接套用别人的配置。每个项目的RF环境、天线设计、功耗要求都不一样。我一般会在实验室里用频谱仪抓一下底噪,再根据底噪水平调整Wesco。底噪高,Wesco就设大一点。

好了,关于SCO/eSCO的链路原理和参数配置,今天就讲到这里。下一章我们会聊蓝牙音频的编解码器选择,包括SBC、AAC、LDAC这些。到时候我会分享一些实际项目中的音质调优经验。

记住,SCO/eSCO是蓝牙音频的基石。搞懂了它,你就能理解为什么有些耳机通话清晰,有些却断断续续。嗯,今天就到这儿,有问题随时交流。