本章使用两块CC1310 Evaluation Board作为实验平台下载运行例程rfWakeOnRadioRx和对应的例程rfWakeOnRadioTx。演示如何通过前导码来唤醒设备,从而实现功耗的降低。其中TI还提供了使用RTOS和不使用RTOS两种版本的例程,本章我们使用无RTOS的例程进行演示。
rfWakeOnRadioTx可在: C:\ti\simplelink_cc13x0_sdk_1_40_00_10\examples\nortos\CC1310_LAUNCHXL\drivers\rfWakeOnRadioTx路径下获得。
rfWakeOnRadioRx可在: C:\ti\simplelink_cc13x0_sdk_1_40_00_10\examples\nortos\CC1310_LAUNCHXL\drivers\rfWakeOnRadioRx路径下获得。
使用USB连接CC1310 Evaluation Board。确保跳线帽正确连接,如下图所示。
成功连接开发板之后,打开电脑的设备管理器。可以看见XDS110的两个端口,我们打印使用的串口是XDS110 Class Application/User UART(COM18)
注意:XDS110驱动程序在安装CCS时会默认安装,如果你没有安装CCS,可以手动更新驱动程序软件,XDS驱动可以在CC2640R2开发工具集介绍里获得。
参考编译运行第一个例程。
该示例演示了CC1310的Wake-on-Radio(WoR)功能,显着的降低了RF链路的功耗。该例程演示了如何使用RF驱动程序来安排自动唤醒时间,并发送具有长的前导码的消息。
该例程要配合rfWakeOnRadioTx和rfWakeOnRadioRx一起使用。
可以使用SmartRF Studio的代码导出功能,分别选择“TX/RX”选项卡导出示例的设置。这个例子主要用50kbit/s进行测试。
唤醒间隔使用rfWakeOnRadioRx.c文件和rfWakeOnRadioTx.c顶部的WOR_WAKEUPS_PER_SECOND定义设置。请确保在RX和TX部分中将其设置为相同。
rfWakeOnRadioTx:
该TX示例非常类似于rfPacketTX示例,除了它使用CMD_PROP_TX_ADV能够发送长前导码。
基于rfWakeOnRadioTx.c文件顶部的WOR_WAKEUPS_PER_SECOND定义来动态计算前导码的长度。
通过按键进行数据发送。
rfWakeOnRadioRx:
Wake-on-Radio示例基于无线电的占空比原理,并根据是否具有有效的数据包再进入RX。
应用程序有一个任务,除了初始化应用程序,还重新提交CMD_PROP_RX_SNIFF命令更新无线接收时间间隔,如下所示。
RF_cmdPropRxSniff.startTime += WOR_WAKE_UP_INTERVAL_RAT_TICKS(WOR_WAKEUPS_PER_SECOND);
无论何时运行RX Sniff命令,它也会记录命令的状态。一些状况可以在“worStatistics”结构中找到。这里可以获得命令当前返回状态,这可能是以下四种情况:
因为没有发现RSSI而返回idle状态
发现RSSI但没有PQT而返回idle状态
发现RSSI和PQT,但没有有效的同步字返回的超时状态
收到一个Packet
在应用中,内部LNA控制信号已经路由到Board_PIN_LED0。这意味着当收音机处于活动RX时,Board_PIN_LED0将被打开。如果没有发现RSSI超过配置的阈值,则它将处于比发现超过阈值的时间更短的时间。原因是因为如果超过阈值,那么它还将检查有效的前导码。
如果发现RSSI和有效的前同步码,那么它也将继续并寻找同步字。如果找到同步字,并且数据包的CRC也正确,则Board_PIN_LED1将切换。
以下是典型的无线电物理层数据包格式。
| Preamble | Sync Word | Length Byte | Payload | CRC |
--------------------------------------------------------------------
| 4 byte | 4 byte | 1 byte | X bytes | 2 bytes |
前导码通常设置为重复的10101010模式,因为数据包的开始在现代无线电中用于多种目的。这通常涉及建立自动增益控制,估计频率误差等。除此之外,它还可以用于检测信号的存在。
如果我们使用前导码来检测信号的存在,则接收机必须经常地醒来,不要错过前导码。这意味着前导码的长度直接影响接收机唤醒的频率。
在50kbit / s的2-GFSK中,4字节前导码只有650 us长。这意味着,为了不丢失数据包,接收机每秒必须唤醒1500次以上。这通常不是一个可行的解决方案,不会节省大量的电力。
如果我们改为配置发送器发送100毫秒长的前导码,这意味着接收机只需要每秒唤醒10次以保证接收数据包。这增加了系统的延迟,但显着降低了平均功耗。
在这个唤醒无线电示例中,默认设置是发送500 ms的前导码,因此每秒唤醒约两次以检查它。
通常有两种方法可以使用接收器检查空中信号的存在。一个是检查接收信号强度指示器(RSSI),它仅仅表示接收到的能量。另一个是检查有效前导码的存在并检查前导码质量(PQT)。
RSSI通常更快地检查,但也提供较少的信息。RSSI阈值大小主要取决于配置的接收器带宽。从RSSI中获得的信息只是表示存在信号,不会给出有用信息。
PQT比RSSI需要更长的时间来检查。主要原因是接收机必须接收一定数量的符号,才能看到接收的数据,并检查其确实是一个有效的前导码。这多长时间主要取决于符号率。
也可以RSSI和PQT都检测。在这种情况下,通常首先首先检查RSSI,如果RSSI达到阈值之上,则检查PQT。
CC13xx具有用于进行接收(RX)和进行载波监听(Carrier Sense)的专用无线电命令。要进入接收模式,可以发送CMD_PROP_RX或CMD_PROP_ADV。要做载波侦听,可以发送CMD_PROP_CS。还有两个命令,在信号存在的情况下将载波侦听与进入接收相结合,就是CMD_PROP_RX_SNIFF和CMD_PROP_RX_ADV_SNIFF命令。
Sniff命令本身由两部分组成。第一部分是与RX命令相同,第二部分与载波检测命令相同。实际上,sniff命令的行为非常像用CMD_PROP_RX(_ADV)和MD_PROP_CS的组合。
Sniff命令可以配置为使用RSSI,PQT或两者作为检测信号存在的标准。在这个例子中,使用的就是Sniff命令。
在rfWakeOnRadioRx工程中:配置RX Sniff命令时,有几个参数对于唤醒无线电使用长前导码很重要。
此示例默认情况下以下列方式配置了RX Sniff命令:
rxSniffCmd-> csConf.bEnaRssi = 1; rxSniffCmd-> csConf.bEnaCorr = 1;
rxSniffCmd-> csConf.operation = 1;
rxSniffCmd-> csConf.idleOp = 1;
rxSniffCmd-> csConf.busyOp = 0;
rxSniffCmd-> rssiThr =(int8_t)WOR_RSSI_THRESHOLD;
rxSniffCmd-> numRssiBusy = 1; rxSniffCmd-> numRssiIdle = 1;
rxSniffCmd-> corrConfig.numCorrBusy = 1; rxSniffCmd-> corrConfig.numCorrInv = 1;
除了功能设置外,还有几个时序参数需要正确配置。这些是基于前导码长度和/或所选数据速率的。以上代码可以在rfWakeOnRadioRx.c文件中configureSniffCmd函数中找到。
为了能够在唤醒之间具有确定性间隔,使用绝对时序。这通过将起始触发类型设置为TRIG_ABSTIME来完成,并且每个唤醒以给定的间隔(即每秒醒来两次500ms)递增。
RX Sniff命令的结束触发设置为比整个前导码加上同步字的长度稍长。意味着如果我们在前导码的最开头醒来,我们会等待直到我们收到整个前导码和同步字,如果结束触发之前还没有得到一个同步字,那么我们离开RX。
注意:这对于在接收到有效前导码的干扰源的情况下,不会被卡住在RX中至关重要。
相关周期是无线电必须检测到有效前导码的时间窗口。检测到的每个有效的PQT都将向前移动此时间窗口,这通过相关峰值在底层硬件中完成,因此命名。第一个峰值将在接收到约24个符号的前导码之后发生。每两个符号将发生后续的峰值。如果相关期间没有相关峰值,那么空中没有有效的前导码。
这个时期的一个值得注意的是,它必须足够宽以达到第一个相关峰值。另一个原因是它还必须足够宽,以便能够适应整个同步字,具有一定的余地。原因为如果没有空余,那么命令将会报告它在接收同步字时不再感测到前导码。
Rx板Board_PIN_LED0 500ms闪烁一次,一旦接收到pack,进行一次Board_PIN_LED1状态切换。TXBoard_BINT_1按键按下即发送数据包,并且每次发送成功后Board_PIN_LED1状态切换。
文章所有代码、工具、文档开源。加入我们QQ群 593145299获取更多支持,共同研究Contiki应用和TI-15.4Stack。