第二章:射频与基层——蓝牙物理层(PHY)、跳频技术、蓝牙基带层(Baseband)、ACL与SCO链路

各位同学,欢迎来到第二讲。上一章我们聊了蓝牙协议栈的整体架构,今天咱们把镜头拉近,看看最底层的那些“硬家伙”——物理层和基带层。

说实话,很多做上层应用开发的工程师,一辈子可能都不碰这些。但如果你要做Soundbar,尤其是要处理音频同步、抗干扰、多设备连接这些场景,不懂底层,你连Bug都定位不了。我自己就吃过这个亏,后面会跟大家细说。

2.1 蓝牙物理层(PHY)——信号是怎么飞出去的?

物理层,说白了就是决定“信号怎么发、怎么收”的那一层。它定义了频率、调制方式、发射功率这些最基础的东西。

2.1.1 工作频段与信道

蓝牙工作在2.4GHz ISM频段,也就是2.400GHz到2.4835GHz之间。这个频段是免费的,但也是拥挤的——Wi-Fi、Zigbee、微波炉都在这里凑热闹。

蓝牙把这个频段划分成79个信道,每个信道带宽1MHz。信道编号从0到78,中心频率计算公式很简单:

f = 2402 + k MHz,其中k = 0, 1, 2, ..., 78

嗯,这里要注意:信道0的中心频率是2402MHz,信道78是2480MHz。别记错了,我曾经在调试时把信道号算偏移了一位,结果设备死活连不上,折腾了两天才发现是频率算错了。

2.1.2 调制方式

经典蓝牙(BR/EDR)使用GFSK调制,也就是高斯频移键控。简单理解就是:用频率的变化来表示0和1。

蓝牙版本 调制方式 数据速率
BR(基本速率) GFSK 1 Mbps
EDR(增强速率) π/4-DQPSK 2 Mbps
EDR(增强速率) 8DPSK 3 Mbps

你可能会问:为什么不用更高的调制方式?因为速率越高,对信噪比的要求也越高,传输距离就会变短。Soundbar通常需要稳定连接,我个人习惯优先用BR模式,除非对带宽有硬性要求。

2.2 跳频技术——为什么蓝牙不怕干扰?

蓝牙能在2.4GHz这个“菜市场”里活下来,靠的就是跳频技术。

跳频,说白了就是:发完一个数据包,立刻换一个信道。蓝牙每秒跳频1600次,也就是说每625微秒换一次信道。你想想看,Wi-Fi占着某个信道不动,蓝牙在79个信道里来回跳,干扰的概率自然就低了。

核心要点:跳频序列是由蓝牙设备的时钟和蓝牙地址共同决定的。主设备决定跳频序列,从设备跟随。这就是为什么蓝牙连接必须先完成“同步”——双方得知道接下来往哪个信道跳。

2.2.1 自适应跳频(AFH)

经典蓝牙还有一个增强功能叫自适应跳频。它会检测哪些信道被Wi-Fi或其他设备占用了,然后把这些“坏信道”标记出来,跳频时自动避开。

我在做Soundbar项目时遇到过一个问题:客厅里同时开着Wi-Fi和蓝牙,音频经常断断续续。后来打开AFH功能,把Wi-Fi占用的信道屏蔽掉,问题就解决了。嗯,这个坑我替你们踩过了。

2.3 蓝牙基带层(Baseband)——数据怎么组织?

基带层是物理层和上层协议之间的桥梁。它负责把数据打包、拆包、定时发送、错误检测这些事情。

2.3.1 数据包格式

蓝牙基带层的数据包结构是这样的:

| 接入码(72/68位) | 包头(54位) | 负载(0-2745位) |
  • 接入码:用于识别和同步。每个蓝牙设备都有一个唯一的接入码,相当于它的“身份证”。
  • 包头:包含逻辑传输地址、包类型、流控标志、重传标志等信息。
  • 负载:真正的数据内容,可以是音频数据、控制命令等。

这里有个细节:接入码的长度取决于包类型。FHS包(频率跳频同步包)使用68位接入码,其他包使用72位。为什么?因为FHS包是用于建立连接的,需要更快的同步速度。

2.3.2 时隙与定时

蓝牙的时间被划分成625微秒的时隙。主设备在偶数时隙发送,从设备在奇数时隙发送。这就是所谓的“时分双工”。

你想想看,如果主设备在时隙0发送,从设备必须在时隙1回复。如果从设备没收到,主设备可以在时隙2重传。这种机制保证了通信的确定性。

避坑指南:我曾经在调试Soundbar时发现音频延迟忽大忽小。查了半天,原来是基带层的重传次数设置得太高。音频数据对实时性要求高,对丢包反而没那么敏感。建议把重传次数限制在2-3次,超过就直接丢包,保证音频流畅。

2.4 ACL与SCO链路——两种不同的连接方式

蓝牙基带层支持两种逻辑链路:ACL和SCO。它们服务于不同的场景。

2.4.1 ACL链路(异步无连接)

ACL链路用于传输数据包,比如文件传输、AT指令、A2DP音频流。它是面向连接的,但传输是异步的——也就是说,数据可以在任意时隙发送,不保证固定的时间间隔。

  • 特点:可靠传输,支持重传,带宽可变
  • 典型应用:A2DP音频流、AVRCP控制命令、HFP数据
  • 包类型:DMx(中等速率数据)、DHx(高速率数据)

ACL链路的带宽是可以动态调整的。比如在Soundbar中,播放音乐时用高带宽的DH5包,暂停时切换到低带宽模式省电。

2.4.2 SCO链路(同步面向连接)

SCO链路用于传输实时音频,比如通话。它保留固定的时隙,保证固定的传输间隔和带宽。

  • 特点:固定带宽,低延迟,不支持重传
  • 典型应用:HFP免提通话、eSCO增强型语音
  • 包类型:HV1、HV2、HV3(语音包)

这里有个关键区别:SCO链路不重传。为什么?因为语音数据对实时性要求极高,重传会导致延迟增加,反而影响通话质量。丢了就丢了,耳朵其实听不出来。

重要提醒:在Soundbar设计中,如果你同时使用A2DP(ACL链路)和HFP(SCO链路),要注意带宽分配。ACL链路可能会占用过多带宽,导致SCO链路丢包。我建议在代码中设置优先级,确保SCO链路始终有足够的带宽。

2.4.3 eSCO——增强型SCO

eSCO是SCO的增强版,它允许有限的重传,同时保持低延迟。eSCO的包类型有EV3、EV4、EV5等,支持不同的编码方式和重传策略。

我个人觉得,eSCO是蓝牙音频的一个里程碑。它既保证了实时性,又提高了可靠性。现在主流的蓝牙耳机和Soundbar都支持eSCO。

2.5 小结

这一章我们聊了蓝牙最底层的那些事:物理层怎么发信号、跳频怎么抗干扰、基带层怎么组织数据、ACL和SCO链路有什么区别。

说实话,这些内容看起来枯燥,但它们是整个蓝牙协议栈的基石。你理解了跳频,就知道为什么蓝牙在Wi-Fi环境下还能工作;你理解了SCO链路,就知道为什么通话音频延迟那么低。

下一章,我们会往上走一层,看看链路层和HCI接口。到时候我会分享一个实际项目中的调试案例,保证让你有收获。

好,今天就到这里。有问题随时找我。