从零实现BLE协议栈(5-3)实验:05_phy_anchor

5-3 动手实验:编译运行 05_phy_anchor

本篇是第 5 章的配套实验,将 5-1 和 5-2 中讲解的锚点跟踪与 Window Widening 补偿完整跑通。


一、概述

05_phy_anchor 是第一个能够 长时间稳定保持连接 的 Demo。它在 Demo 04 的基础上增加了两项关键机制:

  1. 锚点更新 (Anchor Update):每次 RX 成功,用实际收包时刻修正下一个锚点,消除累积漂移
  2. Window Widening (WW):根据 Master/Slave 晶振精度 (SCA),动态扩大接收窗口以容纳漂移

这两项机制协同工作,使得连接可以稳定保持 30 秒以上(Demo 04 仅能维持 ~3 秒)。


二、编译与烧录

west build -b nrf52dk/nrf52832 .\write-BLE-stack-from-scratch\05_phy_anchor\ -p
west flash

编译产物:

Memory region         Used Size  Region Size  %age Used
           FLASH:      101348 B       512 KB     19.33%
             RAM:       19008 B        64 KB     29.00%

比 Demo 04 增长约 1.2 KB FLASH(锚点跟踪和 WW 计算代码)。


三、运行测试

.\write-BLE-stack-from-scratch\tools\venv\Scripts\python.exe `
  .\write-BLE-stack-from-scratch\tools\bumble_connect.py `
  --transport usb:2FE3:000B `
  --target 66:55:44:33:22:11 `
  --duration 30

Bumble 侧显示:连接稳定保持 30 秒,RSSI 在 -61 ~ -71 dBm 之间。


四、串口日志

连接事件循环(含 WW 和 drift)

[ANCHOR] #1 ch=11 OK | rtc=456053 ww=5 drift=+2 | rx=1/1 miss=0
[ANCHOR] #2 ch=22 OK | rtc=457692 ww=5 drift=-1 | rx=2/2 miss=0
[ANCHOR] #3 ch=33 OK | rtc=459330 ww=5 drift=+3 | rx=3/3 miss=0
...
[ANCHOR] #100 ch=25 OK | rtc=619844 ww=5 drift=-2 | rx=98/100 miss=2
...
[ANCHOR] #300 ch=14 OK | rtc=947630 ww=5 drift=+1 | rx=295/300 miss=5
...
[ANCHOR] #600 ch=7 OK | rtc=1439218 ww=5 drift=0 | rx=592/600 miss=8

偶发丢包与 WW 扩展

[ANCHOR] #150 ch=3 MISS | rtc=701780 ww=5 drift=N/A | rx=147/150 miss=3
[ANCHOR] #151 ch=14 MISS | rtc=703418 ww=10 drift=N/A | rx=147/151 miss=4
[ANCHOR] #152 ch=25 OK | rtc=705057 ww=15 drift=+8 | rx=148/152 miss=4
                         ↑ 恢复后 WW 回归最小值

连接总结

========== Connection Summary ==========
  Total events:        602
  RX OK:               592
  RX timeout:          10
  RX CRC error:        0
  Anchor updates:      592
  Max consecutive misses: 3

日志解读

  • ww=5:正常状态下 Window Widening = 5µs(= Combined SCA 100ppm × connInterval 50ms)
  • drift=+2:本次实际收包时刻比预期锚点晚 2µs(+为晚,-为早),锚点已据此修正
  • RX OK: 592/602 = 98.3%:与 Demo 04 的 16/56 = 28.6% 形成鲜明对比
  • 连续丢包最多 3 次:每次 MISS,WW 累加一个 ww_periodic(5µs),扩大接收窗口直到恢复

五、关键概念图

Window Widening 计算

ww_periodic = ceil( (SCA_master + SCA_slave) × connInterval_us / 1,000,000 )
            = ceil( (50 + 50) × 50000 / 1000000 )
            = ceil(5.0)
            = 5 µs / 事件

锚点跟踪状态机

         ┌───────────┐
         │  RX 成功   │──── 更新锚点 ← 实际收包时刻
         │  ww → min  │     drift = actual - expected
         └─────┬─────┘
               │ 下一事件
               ▼
         ┌───────────┐
         │  RX 超时   │──── 保持旧锚点
         │  ww += 5µs │     接收窗口扩大
         └─────┬─────┘
               │ 连续超时?
               ▼
         ┌───────────┐
         │ Supervision│──── 连续 2s 无 RX
         │  Timeout   │     ⇒ 断开连接
         └───────────┘

Demo 04 vs Demo 05 对比

           Demo 04 (无 WW)           Demo 05 (有 WW)
  RX OK    16/56 = 28.6%             592/602 = 98.3%
  持续时间  ~2.75 秒                   30+ 秒(直到主动断开)
  最长MISS  连续 40+ (直到 timeout)    连续 3 次(随后恢复)

截图位置:可用逻辑分析仪截取连续 10 个连接事件的 RADIO RX/TX 波形,观察 WW 窗口内收包的时间偏差分布。


本系列教程同款硬件:👇
芯片: nRF 52832 开发板
工具: nRF 52840 BLE Dongle 蓝牙嗅探器
工具: 逻辑分析仪
工具: BPA low energy 蓝牙分析仪

posted @ 2026-04-02 10:04  ixbwer  阅读(30)  评论(0)    收藏  举报