01引言
某些客户在其 S2LP 的设计方案中,发送端设备常供电,可以不考虑低功耗;而接收端设备一般用电池功能,对低功耗的要求比较高。发送和接收端的通讯是异步的,也就是说发送端在满足某些检测条件的情况下,可以在任意时刻发送数据包;而要求接收端设备在满足其低功耗要求的情况下,及时接收到数据包,保证响应的实时性。针对以上的应用场景,一般推荐客户使用 S2LP 的 sniff 模式。
02预设应用场景
发送端设备(如烟感设备等)可能随时收到警报信息,在任意时刻收到警报信息后将连续发送数据包,连续发包时长 10 秒钟。
数据包结构如图 1。2-FSK 调制方式,Data rate=38.4Ksps, 中心频点=868MHz。
图1.数据包格式
根据图 1 数据包格式,可知前导码占 576 个 bit,同步字 4 字节,用户数据占 25 个字节,采用 1 字节 CRC 校验字段。
• 数据包中每个 bit 发送的时间= 1/38.4Ksps≈26us。
• 前导码时长=576/38.4Ksps=15ms。
• 前导码+同步字时长= (576+32)/38.4Ksps=15.83ms。
• 完整数据包发送时长=(576+32+200+8)/38.4Ksps = 21.25ms。
接收端设备要求每 8 秒钟唤醒一次,连续检测 100ms,并确保不会漏掉这 100ms 时间窗口中内的有效数据包。并在 100ms 以后进入低功耗模式。
03LDC/Sniff 模式简介
S2LP 支持 LDC (Low Duty Cycle) 和 Sniff 这两种模式,这两种模式都可以实现低功耗。区别在于 LDC 模式实现发送、接收端的同步通信;而 Sniff 模式是基于 LDC 模式,在兼顾低功耗的要求的同时支持异步通信。
如图 2,LDC 模式示意图。发送端和接收端设备按照约定的唤醒周期同步进入发送、接收状态和进入低功耗模式。接收端为了保证不丢包,会在约定的唤醒时间点之前唤醒并提前进入接收状态。
图2.LDC 模式
如图 3 所示,Sniff 模式示意图。Sniff 模式下的 S2LP,按照唤醒定时器 (Wakeup Timer) 设定的唤醒时间有规律地从睡眠状态唤醒,并开启一个非常短的称为 FastRX 的接收窗口。在这个 FastRX 接收窗口中检测信号强度 (RSSI 值) 。如信号强度低于设定的阈值,则认为外部没有发送数据包,接收端在 FastRX 窗口结束后快速进入睡眠状态;如检测的信号强度值高于阈值,说明检测到有效数据包在发送,则启动接收超时定时器(RX Timeout),接收端继续保持接收状态,如在超时时间内检测到有效的同步字字段,则停止接收超时定时器,并继续保持接收状态直到接收到完整的数据包后进入低功耗模式;如在超时时间内没有检测到有效的同步字则在接收超时后立刻进入低功耗模式。
图3.Sniff 模式
04解决方案
基于 ST 官方提供的 S2LP 的 SDK 软件包中的 SDK_Sniff_B 项目实现上述预设应用场景中接收端的功能。代码更改量不多,但基本可以实现预设应用场景中的要求。
基于原始代码,更改函数 SysTickUserAction(图 4),借助于 lSystickCounter 计数变量,实现 8 秒钟和 8 秒窗口开始边界后 100ms 的计时。具体更改内容请参考附件“SDK_Sniff_B.c”
图4.函数 SysTickUserAction 更改内容
在 8 秒窗口开始时间点通过调用函数“S2LPTimerLdcrMode(S_ENABLE);”使能 Sniff模式;在 100ms 时间窗口结束时通过调用函数“S2LPTimerLdcrMode(S_DISABLE);”关闭 Sniff 模式。并调用函数 “S2LPCmdStrobeSleep();”进入低功耗。
需要注意的关键点:
• 为了不错过发送端的前导码,需要将接收端的唤醒定时器设定的时长设定为小于数据包格式中前导码的发送时长。
• 接收端的接收超时时间(RX Timeout)的时长≥前导码时间+同步字时间,但在满足条件的情况下尽量使用小的设定值,有助于降低功耗。
• 初始化结束后通过函数“S2LPTimerLdcrMode”可以直接打开、关闭 sniff 模式。并结合函数“S2LPCmdStrobeSleep();”控制 S2LP 的低功耗模式。 |
|