# CC1310 Wake-on-Radio 功能 # ## 介绍 ## 本章使用两块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。确保跳线帽正确连接,如下图所示。 ![](http://www.leconiot.com/md_res/cc1310/get_started/wake_on_radio/image/picture.jpg) 成功连接开发板之后,打开电脑的设备管理器。可以看见XDS110的两个端口,我们打印使用的串口是XDS110 Class Application/User UART(COM18) ![](http://www.leconiot.com/md_res/cc1310/get_started/wake_on_radio/image/com.png) >注意: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命令更新无线接收时间间隔,如下所示。 ````C 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将切换。 ## 数据包前导码 ## 以下是典型的无线电物理层数据包格式。 ````C | 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),它仅仅表示接收到的能量。另一个是检查有效前导码的存在并检查前导码质量(PQT)。 RSSI通常更快地检查,但也提供较少的信息。RSSI阈值大小主要取决于配置的接收器带宽。从RSSI中获得的信息只是表示存在信号,不会给出有用信息。 PQT比RSSI需要更长的时间来检查。主要原因是接收机必须接收一定数量的符号,才能看到接收的数据,并检查其确实是一个有效的前导码。这多长时间主要取决于符号率。 也可以RSSI和PQT都检测。在这种情况下,通常首先首先检查RSSI,如果RSSI达到阈值之上,则检查PQT。 ## RX Sniff命令 ## 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命令。 ## RX Sniff命令的无线电唤醒配置 ## 在rfWakeOnRadioRx工程中:配置RX Sniff命令时,有几个参数对于唤醒无线电使用长前导码很重要。 此示例默认情况下以下列方式配置了RX Sniff命令: - 使用RSSI和PQT: ````C rxSniffCmd-> csConf.bEnaRssi = 1; rxSniffCmd-> csConf.bEnaCorr = 1; ```` - 如果RSSI无效,则报告空闲,不需要测试PQT: ````C rxSniffCmd-> csConf.operation = 1; ```` - 如果报告空闲,请立即结束命令: ````C rxSniffCmd-> csConf.idleOp = 1; ```` - 连续检查前置码的整个长度的RSSI和PQT: ````C rxSniffCmd-> csConf.busyOp = 0; ```` - RSSI阈值在示例中的定义中设置。默认为SmartRF Studio设置的灵敏度50kbit/s : ````C rxSniffCmd-> rssiThr =(int8_t)WOR_RSSI_THRESHOLD; ```` - 一个RSSI高于阈值立刻报告忙,低于立刻报告空闲: ````C rxSniffCmd-> numRssiBusy = 1; rxSniffCmd-> numRssiIdle = 1; ```` - 一个有效的PQT立刻报告忙,无效的PQT立即报告空闲: ````C 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**](https://jq.qq.com/?_wv=1027&k=512J9pr)获取更多支持,共同研究Contiki应用和TI-15.4Stack。

CC2640R2F&BLE5.0-乐控畅联 © Copyright 2017, 成都乐控畅联科技有限公司.