从零实现BLE协议栈(5-3)实验:05_phy_anchor
5-3 动手实验:编译运行 05_phy_anchor
本篇是第 5 章的配套实验,将 5-1 和 5-2 中讲解的锚点跟踪与 Window Widening 补偿完整跑通。
一、概述
05_phy_anchor 是第一个能够 长时间稳定保持连接 的 Demo。它在 Demo 04 的基础上增加了两项关键机制:
- 锚点更新 (Anchor Update):每次 RX 成功,用实际收包时刻修正下一个锚点,消除累积漂移
- 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 蓝牙分析仪
本文版权归作者:ixbwer所有,转载请注明原文链接:https://www.cnblogs.com/ixbwer/p/19810037,否则保留追究法律责任的权利。

浙公网安备 33010602011771号