2、蓝牙协议基础:BR/EDR与BLE的区别、HCI接口、ACL与SCO链路

做TWS耳机同步,蓝牙协议是绕不开的坎。说实话,我刚入行那会儿,也被BR/EDR和BLE搞得晕头转向。后来踩了几个坑,才慢慢理清楚。今天咱们就聊聊这几个核心概念。

2.1 BR/EDR vs BLE:两个“蓝牙”的恩怨

蓝牙其实分两套体系。一套是经典蓝牙,也就是BR/EDR。另一套是低功耗蓝牙,BLE。它们俩虽然都叫蓝牙,但底层差异很大。

BR/EDR,全称Basic Rate / Enhanced Data Rate。说白了,就是传统蓝牙。它追求的是高吞吐量,适合传音频流。你想想看,TWS耳机要听歌,数据量不小,BR/EDR正好干这个。

BLE,全称Bluetooth Low Energy。它追求的是低功耗,适合传小数据包。比如心率监测、温度传感器这些。我有个项目,客户非要用BLE传音频,结果延迟高得离谱,最后乖乖换回BR/EDR。

它们俩最大的区别在哪?我列个表,你一看就明白。

特性 BR/EDR BLE
设计目标 高吞吐量、低延迟 超低功耗、小数据包
典型速率 1-3 Mbps 125 Kbps - 2 Mbps
连接建立时间 约100ms 约3ms
功耗 较高 极低
音频传输 原生支持(A2DP、HFP) 需额外协议(如LC3)

核心结论:TWS耳机同步,音频流走BR/EDR,控制信令走BLE。这是目前最成熟的方案。我见过有人想用BLE一统天下,结果音频卡顿到怀疑人生。

2.2 HCI接口:主机和蓝牙模块的“翻译官”

HCI,全称Host Controller Interface。它是个接口标准,定义了主机(比如手机SoC)和蓝牙控制器(蓝牙芯片)之间怎么通信。

为什么需要HCI?因为蓝牙协议栈分两层。上层是主机协议栈(L2CAP、SDP、GATT等),下层是控制器(链路层、物理层)。这两层通常跑在不同的芯片上。HCI就是它们之间的桥梁。

我个人习惯把HCI比作“翻译官”。主机说“我要连那个耳机”,HCI就翻译成控制器能懂的指令。控制器说“连接成功了”,HCI再翻译回主机能理解的事件。

HCI支持三种传输方式:

  • UART:最常见,三线或四线串口。我早期做的一个项目,UART波特率设错了,导致HCI命令一直超时。排查了两天才发现,唉,都是泪。
  • USB:PC蓝牙适配器常用。吞吐量高,但功耗也高。
  • SDIO:手机内部常用。速度快,但实现复杂。

避坑指南:我曾经在调试HCI时,发现主机发出去的指令控制器没响应。后来用逻辑分析仪抓UART波形,才发现是流控没配好。记住,HCI调试第一步,先确认物理层通不通。

2.3 ACL与SCO链路:两种不同的“管道”

蓝牙连接建立后,数据怎么传?靠链路。主要有两种:ACL和SCO。

ACL,全称Asynchronous Connection-Less。异步无连接链路。它是个“尽力而为”的管道。数据包丢了可以重传。适合传非实时数据,比如文件、控制指令。

SCO,全称Synchronous Connection-Oriented。同步面向连接链路。它是个“准时准点”的管道。数据包丢了不重传,因为重传就晚了。适合传实时音频,比如通话。

嗯,这里要注意。TWS耳机同步,左右耳之间交换同步信息,走的是ACL链路。因为同步信息可以容忍少量丢包,但不能容忍延迟。而耳机和手机之间的音频流,走的是SCO或eSCO(增强型SCO)。

我举个例子你就懂了。假设左耳是主耳,右耳是从耳。左耳收到手机的音频包后,需要告诉右耳“我收到了,时间戳是XXX”。这个信息走ACL。而左耳播放音频,走的是和手机之间的SCO链路。

重要提醒:ACL和SCO是时分复用的。同一时刻,蓝牙芯片要么在传ACL数据,要么在传SCO数据。如果SCO占用了太多时间片,ACL的吞吐量就会下降。我遇到过一个问题,通话时左右耳同步延迟突然变大,就是因为SCO占用了太多带宽,ACL的同步包被挤掉了。

最后总结一下。BR/EDR负责音频传输,BLE负责低功耗控制。HCI是主机和控制器之间的桥梁。ACL传同步数据,SCO传音频流。这四个概念,是TWS耳机同步的基石。搞懂了它们,后面的实战才能游刃有余。