01引言 I* k1 e, \0 N9 ]- t 某些客户在其 S2LP 的设计方案中,发送端设备常供电,可以不考虑低功耗;而接收端设备一般用电池功能,对低功耗的要求比较高。发送和接收端的通讯是异步的,也就是说发送端在满足某些检测条件的情况下,可以在任意时刻发送数据包;而要求接收端设备在满足其低功耗要求的情况下,及时接收到数据包,保证响应的实时性。针对以上的应用场景,一般推荐客户使用 S2LP 的 sniff 模式。 02预设应用场景8 {& i# B$ W: F! l$ O5 e 发送端设备(如烟感设备等)可能随时收到警报信息,在任意时刻收到警报信息后将连续发送数据包,连续发包时长 10 秒钟。 数据包结构如图 1。2-FSK 调制方式,Data rate=38.4Ksps, 中心频点=868MHz。 图1.数据包格式 3 b; @5 u2 I3 u; [# `6 ^ 根据图 1 数据包格式,可知前导码占 576 个 bit,同步字 4 字节,用户数据占 25 个字节,采用 1 字节 CRC 校验字段。8 q2 Y4 d. M# e% O+ R/ j+ i+ l6 A8 R8 N • 数据包中每个 bit 发送的时间= 1/38.4Ksps≈26us。 • 前导码时长=576/38.4Ksps=15ms。 • 前导码+同步字时长= (576+32)/38.4Ksps=15.83ms。 • 完整数据包发送时长=(576+32+200+8)/38.4Ksps = 21.25ms。 1 w9 p4 d5 E! E7 E A7 O 接收端设备要求每 8 秒钟唤醒一次,连续检测 100ms,并确保不会漏掉这 100ms 时间窗口中内的有效数据包。并在 100ms 以后进入低功耗模式。 ) e! V+ @+ F+ n$ { 03LDC/Sniff 模式简介5 {, R: K/ H# g) d y S2LP 支持 LDC (Low Duty Cycle) 和 Sniff 这两种模式,这两种模式都可以实现低功耗。区别在于 LDC 模式实现发送、接收端的同步通信;而 Sniff 模式是基于 LDC 模式,在兼顾低功耗的要求的同时支持异步通信。 如图 2,LDC 模式示意图。发送端和接收端设备按照约定的唤醒周期同步进入发送、接收状态和进入低功耗模式。接收端为了保证不丢包,会在约定的唤醒时间点之前唤醒并提前进入接收状态。! ]' v0 U" A0 Z 9 _, q7 R" q" v% L8 L* m 图2.LDC 模式 9 t- i" E/ ?7 V$ ? 如图 3 所示,Sniff 模式示意图。Sniff 模式下的 S2LP,按照唤醒定时器 (Wakeup Timer) 设定的唤醒时间有规律地从睡眠状态唤醒,并开启一个非常短的称为 FastRX 的接收窗口。在这个 FastRX 接收窗口中检测信号强度 (RSSI 值) 。如信号强度低于设定的阈值,则认为外部没有发送数据包,接收端在 FastRX 窗口结束后快速进入睡眠状态;如检测的信号强度值高于阈值,说明检测到有效数据包在发送,则启动接收超时定时器(RX Timeout),接收端继续保持接收状态,如在超时时间内检测到有效的同步字字段,则停止接收超时定时器,并继续保持接收状态直到接收到完整的数据包后进入低功耗模式;如在超时时间内没有检测到有效的同步字则在接收超时后立刻进入低功耗模式。' P. u0 ^ u) f( T9 R$ c 图3.Sniff 模式 04解决方案, E) [' j$ v4 f# N1 q( Q$ Q6 ~1 a 基于 ST 官方提供的 S2LP 的 SDK 软件包中的 SDK_Sniff_B 项目实现上述预设应用场景中接收端的功能。代码更改量不多,但基本可以实现预设应用场景中的要求。 : h( G& q! h$ h7 | @ " E/ ?9 @- h% m% J" ] 基于原始代码,更改函数 SysTickUserAction(图 4),借助于 lSystickCounter 计数变量,实现 8 秒钟和 8 秒窗口开始边界后 100ms 的计时。具体更改内容请参考附件“SDK_Sniff_B.c”; u7 I9 p* h+ \- d! h 8 s, o `6 p, A& [1 W0 X- `! w 图4.函数 SysTickUserAction 更改内容 在 8 秒窗口开始时间点通过调用函数“S2LPTimerLdcrMode(S_ENABLE);”使能 Sniff模式;在 100ms 时间窗口结束时通过调用函数“S2LPTimerLdcrMode(S_DISABLE);”关闭 Sniff 模式。并调用函数 “S2LPCmdStrobeSleep();”进入低功耗。 2 O% M8 n" _% r8 C c6 }; f% w4 k6 ~ 需要注意的关键点: • 为了不错过发送端的前导码,需要将接收端的唤醒定时器设定的时长设定为小于数据包格式中前导码的发送时长。 • 接收端的接收超时时间(RX Timeout)的时长≥前导码时间+同步字时间,但在满足条件的情况下尽量使用小的设定值,有助于降低功耗。) ?. ]4 a4 q/ G6 n4 W, F3 b • 初始化结束后通过函数“S2LPTimerLdcrMode”可以直接打开、关闭 sniff 模式。并结合函数“S2LPCmdStrobeSleep();”控制 S2LP 的低功耗模式。 ( ?" R; f" A$ P& ]1 { 4.1.验证方法和结果5 F( c2 O9 i. y; t, I" j' [; t7 c$ o 4.1.1. 接收端功能测试平台 使用一套“NUCLEO-L053R8+X-NUCLEO-S2868A1”测试平台运行更改后的SDK_Sniff_B 项目程序。使用 ST 官方提供的 X-NUCLEO-LPM01A 功耗测试板,通过 XNUCLEO-S2868A1 板上的 JP1 测试 S2LP 的工作状态, 通过抓取 S2LP 的实时功耗确认预设场景中 8 秒时间窗口和 100ms 接收窗口的定时是否正确?以及 S2LP 是否能正确进入低功耗模式?测试平台如图 5 所示 : q2 p) l# M) V$ u' h" `2 g( j 图5.测试平台 4 ^% ~+ P" ^' Q" W# ]* [/ a+ ]测试结果如图 6 所示,上电初始化后,由于已经使能了 sniff 模式,但第一个 8 秒窗口计时还没有溢出,所以一直保持sniff工作模式(客户也可以更改代码使其在初始化后立刻进入低功耗模式)。第二个 8 秒窗口开始后的 100ms 还处于 sniff 工作状态。当第二个 8 秒窗口中的 100ms 接收窗口结束后,S2LP 进入低功耗模式。后续的 8 秒窗口以此类推。从图6 中还可以看到每个 100ms 中有 7 个 FastRX 窗口,这是因为原始代码中把唤醒时间设定为差不多 12.9ms(必须小于前导码时间 15ms),那么在 100ms 的接收窗口里正好可以容纳7 个 FastRX 快速接收窗口。 / b0 q ~1 ]& `5 U# q8 e 图6.S2LP 功能测试结果 / F" c; H7 t+ e: l( J7 ?* h 根据图 6 测试结果,证明更改后的 SDK_Sniff_B 代码运行结果符合预设应用场景的要求。; `, h- c- e5 w0 A$ E* S2 G 4.1.2. 验证数据包发送接收( T' X k8 X* M! w$ g 发送接收测试平台如图 7, 使用两套 NUCLEO-L053R8+X-NUCLEO-S2868A1 测试平台:" i+ h5 Q' F/ b9 y Y* J6 e2 g • DevB 作为接收端,运行前面的 SDK_Sniff_B 程序。1 H+ Y: D3 C; e2 z2 ~ {$ S 9 q5 |% K6 Q% T 图7.发送接收测试平台说明 9 M$ I! ~+ }. c/ a0 o+ I* l! n5 h9 f! w4 _5 p • DevA 模拟应用场景中的发送端设备,烧录 SDK 中默认的 S2LP_CLI_Project 程序,通过 USB 线连接 PC 段的 GUI 工具(如图 8) 。按照预设场景分别设定调制方式为 2-FSK,前导码,用户数据(Payload)。保证连续发送的数据包数量和发送间隔的设置值使发送端的连续发送时间维持 10 秒钟。* K1 B/ r7 c7 E9 S Z6 O% G5 k , s$ O7 ~$ k% Q& Y/ g/ n) D1 E 图8.S2LP GUI 工具界面及参数设定 验证结果,S2LP GUI 工具每次点击“START”按键,在其连续过程中接收端设备必然可以收到一个数据包,则实验结果成功。# a% W9 G$ @8 @: F5 b1 u " O2 e+ e, F1 N. t0 m 图9.数据包接收状态 # _7 _( f4 z3 _, S05小结$ P* z3 |! u' u9 O& Z S2LP 支持的 LDC 模式和 sniff 模式都是低功耗模式,LDC 模式支持同步通讯的场景,Sniff 模式支持异步通讯模式。客户基于自己的应用场景,可以选择合适的模式。另外通过附加的定时控制 S2LP 在 sniff 模式下的工作时长可以进一步降低 S2LP 的功耗。- ]/ v9 {- L4 y) j2 f 转载自: STM32单片机5 P& h: z- @0 y. Q8 G% g- h: _ 如有侵权请联系删除 * n; B2 K! N& V* Y- p* |- I 3 n2 Q0 w! {: ^' h+ J! r |
好资料,学习起来