连接机制

BLE 连接后的睡眠时钟精度(SCA)与窗口扩展

发布于 2026-07-22 · 来自「嵌入式江湖」技术专栏

BLE 连接建立之后,主从双方并不是时刻开着射频,而是按连接间隔(connInterval)周期性地"醒来"通信。两次连接事件之间,设备会进入低功耗睡眠,只靠一个廉价的睡眠时钟 定时唤醒。这个时钟精度有限,于是规范引入 SCA(Sleep Clock Accuracy,睡眠时钟精度)来描述它,并靠"窗口扩展(Window Widening)"来容错。本文把这套机制讲透。

一、为什么需要 SCA

BLE 设备为了省电,在两次连接事件之间深度睡眠,只依赖一个低精度的睡眠时钟 来定时下一次醒来。常见的睡眠时钟是:

  • 外部 32.768 kHz 晶振(LFXO):精度通常 20~100 ppm;
  • RC 振荡器:更省成本,但精度可能差到 500 ppm 甚至更高;
  • 高端方案会用 TCXO 级时钟,做到 10 ppm 以内(BLE 里罕用)。

注意,睡眠时钟 ≠ 射频高速时钟。射频用的 16/24/32 MHz 晶振精度极高,但太费电,不可能一直开着。真正用来"排程下一次连接事件"的,是那个低精度的睡眠时钟。

ppm(百万分之一)的含义:

  • 500 ppm = 每 1 秒漂移 500 µs,每 1 ms 漂移 0.5 µs;
  • 20 ppm = 每 1 秒只漂移 20 µs。

由于睡眠时钟会漂移,从机从睡眠中醒来时,并不知道主机精确的锚点(anchor point)时刻——它只能"大致"知道。因此必须提前打开接收窗口,并撑得足够宽,才能确保不错过主机的包。这就是 SCA 存在的根本意义。

二、SCA 等级表

主机在建立连接时,通过 CONNECT_IND 告诉从机自己的睡眠时钟精度(字段名为 Master SCA)。规范(Bluetooth Core Specification,Vol 6 Part B §4.5.7 及相关)用 3 个 bit 表示,共 7 个等级(取值 0~7):

Master_SCA 睡眠时钟精度
0x00 500 ppm
0x01 250 ppm
0x02 150 ppm
0x03 100 ppm
0x04 75 ppm
0x05 50 ppm
0x06 30 ppm
0x07 20 ppm

500 ppm 是最坏情况("我不保证比这更好"),20 ppm 是最佳。大多数用 32.768 kHz 晶振的设备落在 20~100 ppm 之间,按实际精度向上取最接近的等级 来声明。

三、在协议帧里的位置

CONNECT_IND 的 LLData 末尾有一个字节,同时装了跳频增量和 Master SCA:

  • 低 5 位(bit[4:0]) = Hop increment(跳频增量,取值 1~16);
  • 高 3 位(bit[7:5]) = Master SCA。

主机必须把"自己能达到的最差 精度"填进这个字段——宁大勿小。一旦虚报精度(填了过小的等级),从机据此开的接收窗口就会不够宽,结果在时钟漂移下偶发漏包,严重时触发监督超时(supervision timeout)断连。

四、窗口扩展(Window Widening)

从机在每个连接事件,需要在预期锚点两侧各保留一段"宽容窗口"才能可靠收到主机的包:

接收窗口 = [ anchorPoint − Window_Widening , anchorPoint + Window_Widening ]

窗口宽度按 Core Spec Vol 6 Part B §4.5.7 计算(原理性表达):

Window_Widening ≈ ( connInterval × (masterSCA_ppm + slaveSCA_ppm) / 1,000,000 ) + 2 µs

其中:

  • connInterval:连接间隔(微秒);
  • masterSCA_ppm / slaveSCA_ppm:主、从各自的睡眠时钟精度(ppm);
  • 2 µs:固定的定时不确定度。

关键点:窗口是相对"上一次成功同步的锚点"累积的。连接间隔越大,两次事件之间的漂移累积越多,窗口越宽;而从机一旦在某个连接事件成功收到包,就以该事件为新的参考锚点,窗口随之"重新归零"。

举例:connInterval = 1 s(1,000,000 µs),主机 500 ppm,从机 500 ppm:

Window_Widening = 1,000,000 × (500 + 500) / 1,000,000 + 2 µs
               = 1000 µs + 2 µs
               ≈ 1.002 ms

即从机每次都要提前约 1 ms 打开接收、并持续约 1 ms 多。看似很小,但在长连接、大间隔、双差精度下,这部分"空开窗"会显著推高从机功耗。

五、SCA 与功耗的关系

  • SCA 越差(ppm 越大)→ 窗口越宽 → 从机每次多开 RX 的时间越长 → 功耗越高。
  • 反过来,用高精度晶振(如 20 ppm)并把 Master SCA 声明为 0x07,在 1 s 间隔下窗口可缩小到约 40 µs 量级,省电明显。
  • 这也解释了为什么低成本 RC 振荡器方案虽然省了晶振成本,却以更高的 RX 功耗 为代价——从机(以及本设备作为从机时)要为宽窗口买单。

六、实战要点

  1. 晶振选型:能用 32.768 kHz 外部晶振就别用 RC 振荡器;精度高(小 ppm)往往同时更省电。
  2. 诚实声明:Master SCA 宁可填大的等级,别虚报精度。虚报会导致从机窗口不够宽、偶发掉包,甚至监督超时断连。
  3. 连接间隔权衡:大间隔省电,但窗口扩展随间隔线性增大(漂移累积),要权衡。若 SCA 差又用大间隔,从机 RX 开销占比反而上升。
  4. 双方都要看:公式里既有 masterSCA 也有 slaveSCA——从机自身精度差同样会扩大窗口,不只是主机的事。
  5. 抓包验证:用 nRF Sniffer 或 WCH BLE Analyzer 抓 CONNECT_IND,看 Hop 字节的高 3 位即可读出 Master SCA 等级,核对是否与宣称一致。

七、小结

SCA 是 BLE 连接层"用低精度睡眠时钟定时、靠窗口扩展容错"的核心机制。它用 3 bit 声明精度等级(20~500 ppm),直接决定从机的 RX 窗口宽度与功耗。理解它,才能在晶振选型、连接参数调优、以及"明明连上了却偶发掉包"的排查中做出正确判断。

更多 BLE / 鸿蒙星闪 / 芯片选型 / MCU 实战,持续更新