从零实现BLE协议栈(7-2)实验:07_phy_slave_latency

7-2 动手实验:编译运行 07_phy_slave_latency

本篇是第 7 章的配套实验,实际验证 Slave Latency 的跳过/监听行为与省电效果。


一、概述

07_phy_slave_latency 在 Demo 06 的完整数据通道基础上,增加了 Slave Latency 机制:

  • Slave 在无待发数据时,可跳过最多 connSlaveLatency 个连续事件不开启接收机
  • 跳过事件期间 Radio 完全关闭,大幅降低功耗
  • 跳过期间 Window Widening 需按跳过事件数累计(WW = ww_periodic × 跳过数)
  • 收到数据 / 达到跳过上限时必须监听

通过本实验,你将直观看到 SKIP/LISTEN 的交替模式和省电比例。


二、编译与烧录

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

编译产物:

Memory region         Used Size  Region Size  %age Used
           FLASH:       99776 B       512 KB     19.03%
             RAM:       19648 B        64 KB     29.98%

与 Demo 06 几乎相同(仅增加了 latency 判断逻辑)。


三、运行测试

.\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 `
  --conn-latency 4 `
  --duration 15

关键参数:--conn-latency 4 告知 Master 允许 Slave 跳过最多 4 个事件。

Bumble 侧:连接稳定保持 15 秒。


四、串口日志

Latency 配置

[LATENCY] connSlaveLatency = 4 (may skip up to 4 events)

SKIP/LISTEN 模式

[CONN] #1 OK     | ww=5 lat_used=0/4 | rx=1 skip=0 listen=1
[CONN] #2 SKIP   | ww=5 lat_used=1/4 | rx=1 skip=1 listen=1
[CONN] #3 SKIP   | ww=5 lat_used=2/4 | rx=1 skip=2 listen=1
[CONN] #4 SKIP   | ww=5 lat_used=3/4 | rx=1 skip=3 listen=1
[CONN] #5 SKIP   | ww=5 lat_used=4/4 | rx=1 skip=4 listen=1
[CONN] #6 OK     | ww=25 lat_used=0/4 | rx=2 skip=4 listen=2
                    ↑ WW=5×5=25µs (跳过 4 个事件的累计)
[CONN] #7 SKIP   | ww=5 lat_used=1/4 | rx=2 skip=5 listen=2
[CONN] #8 SKIP   | ww=5 lat_used=2/4 | rx=2 skip=6 listen=2
...

连接总结

========== Connection Summary ==========
  Total events:        306
  Events listened:     62
  Events skipped:      244
  RX OK:               61
  RX timeout:          1
  RX CRC error:        0
  Anchor updates:      61
  Max consec miss:     1
  Slave Latency:       4 (configured)
  Skip ratio:          244/306 = 79%

日志解读

  • SKIP vs OK:每 5 个事件中只有 1 个真正打开接收机(latency=4 → 跳 4 听 1)
  • lat_used=4/4:达到跳过上限,下一事件必须监听
  • ww=25:监听事件的 WW = ww_periodic × (latency_used + 1) = 5 × 5 = 25µs
  • Skip ratio 79%:306 个事件中仅 62 个打开 Radio,功耗降至约 1/5

五、关键概念图

Slave Latency 时序

Event#:   1    2    3    4    5    6    7    8    9   10   11
         ┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐
Master:  │TX││TX││TX││TX││TX││TX││TX││TX││TX││TX││TX│
         └──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘
         ┌──┐                  ┌──┐                  ┌──┐
Slave:   │RX│  skip skip skip │RX│  skip skip skip  │RX│
         └──┘  skip   skip    └──┘  skip    skip    └──┘
         LISTEN ←── 4 SKIP ──→ LISTEN ←── 4 SKIP ──→ LISTEN

WW 与 Latency 的关系

不使用 Slave Latency (lat=0):
  每事件 WW = 5 µs,Radio 每 50ms 开一次

使用 Slave Latency (lat=4):
  每 5 个 connInterval 才开一次 Radio
  监听时 WW = 5 × 5 = 25 µs(补偿 5 个事件的漂移累计)
  
  省电比 = 4/5 = 80%(理想情况)
  实测 skip ratio = 79%(接近理论值)

跳过条件判断

should_skip =
    (latency_used < connSlaveLatency)   // 未超上限
  AND (tx_queue_empty)                   // 无待发数据
  AND (no_pending_procedure)             // 无 LL 过程待处理

如果任一条件不满足 → 必须监听

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

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