微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > pm2模式下,终端始终打开接收,关闭poll,怎么做呢?

pm2模式下,终端始终打开接收,关闭poll,怎么做呢?

时间:10-02 整理:3721RD 点击:

2.5.1a

我要实现的效果是:

1.终端电池供电时候正常pm2模式,正常poll发送data request请求接收数据

2.usb供电时候,始终打开接收机,关闭poll。不知道该如何修改呢?

可以来回切换,为了usb供电时候可以不考虑节电,始终打开接收增加性能。

我按如下的修改,好用过(两种情况都能接收数据)。但后来又不好使了(usb供电一直打开接收关闭poll时候,不能接收到数据了)

监测功耗电流时候发现,usb切换到电池后,功耗没有降低,因为电池时候没有执行关闭接收只是打开了poll。

感觉主要问题在ZMacSetReq( ZMacRxOnIdle, &tmp )打开关闭接收好像并没有起作用呢?

pm2模式f8wconfig.cfg文件里面配置                 调用右边的函数是否对应动态修改数值呢?

-DRFD_RCVC_ALWAYS_ON=FALSE           tmp = true; ZMacSetReq( ZMacRxOnIdle, &tmp );//true始终打开接收?,flase始终关闭?这里好像不怎么好使?

-DPOLL_RATE=1000                                         NLME_SetPollRate( 0);//关闭poll

-DQUEUED_POLL_RATE=100

-DRESPONSE_POLL_RATE=100

大神求助啊

@VV

也有人问http://www.deyisupport.com/question_answer/wireless_connectivity/f/45/t/21769.aspx

运行过程中 切换 接收态?

这个确实是个很牛B的想法,但我没试过!

我在E2E上发了个帖,到时有答案,再共享给你!

这里很少有回复

你说 “ 好用过(两种情况都能接收数据)” 

意思是 可以了,但是不稳定是吗?

奇怪了,我得到的回复是:

No, you cannot change this dynamically.

poll rate都可以在程序里面修改

这个接收器的开关不能改吗?我在代码在组网和ota的部分都有用到一直打开接收机和调整poll的速度啊?

而我像1楼红字那样修改就没有作用呢

在ZDApp.c中的ZDApp_ProcessOSALMsg函数里面1118行,就有这样的代码和注释

tmp = true;
ZMacSetReq( ZMacRxOnIdle, &tmp ); // Set receiver always on during rejoin

意思不就是始终打开接收机在rejoin期间吗?

这样的代码别的地方也有

Poll rate 可以再运行过程中修改,这一点我知道!

但是接收机开关状态 可不可以在运行 过程中修改,我就不是很清楚。

不过我是这样认为的,不知道你有没有发现,

无论什么设备,在广播信息的时候都会将广播的信息 交给  协调器,  再由协调器分发出去。

而广播的形式 是有做区分的:

NWK_BROADCAST_SHORTADDR_DEVRXON : 一切非休眠的设备

NWK_BROADCAST_SHORTADDR_DEVALL : 所有设备(休眠和非休眠)

即便是可以在应用层中修改   接收机的状态, 那也必须保证 设备入网之前  修改。(但是这种可能性  是比较低)

不然,终端单方面进行  接收机状态的修改, 而又没有 让远端  协调器知道, 那么 广播的机制就乱了。

所以我认为  在运行过程中  修改 接收机状态  应该是不大可能的。

 

当然以上这是我的分析,具体还是需要TI的 给出一个答复  才行

谢谢你的跟踪

很少发广播,据说那样不好

ti一般都不回复啊

我昨晚又测试了一下cfg里面设置true,则程序中调用函数则可以实现,电池供电关闭rx,此时poll也停止了,终端完全不能接收只能上行,电流很小,

                                                                                                                            usb供电rx打开,poll设置成0,效果是能接收,并且电流较大,

但当cfg里面吧rx设置成false时候,程序中调用函数修改rx开关实现的效果则不同:

                                                                                                                            电池供电poll 1000,正常通信,电流很小

                                                                                                                            usb供电执行打开rx,poll设置0,不能接收,但电流较大,不知道为什么。

其实我要实现的是有些终端电池则只上行数据,不接收数据,关闭poll能节点,usb供电时候增加性能,不需要poll,实时都能接收到数据,这个用cfg=true的能实现

                                有些终端电池依然要poll,能接收数据。                              只是在usb时候rx一直打开,增加性能,实时接收数据,这个其实用cfg=true的应该也可以实现,但问题在于关闭rx后poll设置成多少都没有用了,就不能实现正常通信了,所以测试cfg里面设置false,此时感觉开关rx的函数根本没有起作用,能否通信完全看poll设置是否为0了。

不知道您听懂我上面说的逻辑了吗?

于此得到一个问题:

cfg里面设置rx总是打开或者关闭后,终端的父节点路由或者协调器知道他子节点的接收状况吗?rx关闭时候只有poll父节点的瞬间才打开自己的rx,父节点收到这个poll后才给子节点发送数据的。那么当子节点rx一直打开时候,父节点知道吗?给子节点发送数据还在等待poll吗?

节点在入网的时候,会告诉父设备是一个什么类型的什么,

#define CHILD_RFD 1
#define CHILD_RFD_RX_IDLE 2

这个主要有-DRFD_RCVC_ALWAYS_ON来决定的,如果你是一个-DRFD_RCVC_ALWAYS_ON=FALSE的设备,那么协调器对于所有发送给该子什么的数据都是基于Data Request,没有Data Request就不会把数据发送给子设备,那么子设备Rx一直打开着,这个是机制。

不清楚你这么做的目的为了什么?

cfg 默认设置为 TRUE =====》 后续软件执行 关接收  ,此时poll也停止了     终端不能接收只能发送  电流很小   ?      》》》》情况 1

                                                      (软件关了接收,Poll rate 也会自动被停止吗?你是如何 判断Poll 也停止了? 还是 你自己手动把poll 关掉的? )

                                     ======》 重新软件执行  开接收, POLL RATE 设置为0      终端能接收  电流较大                          》》》》情况 2

                                                       ( 只要 接收 为TRUE 情况下,接收与否与Poll  Rate 大小是没有关系)

cfg 默认设置为 FALSE =====》 后续软件不执行操作   ,POLL RATE 设置为1000     正常通信  电流很小                      》》》》情况 3

                                                      (正常通信  是指 上下行都可以对吗?   协调器发信息给终端, 应该要1s后才能收到 )

                                     ======》 重新软件执行  开接收, POLL RATE 设置为0      终端不能接收    电流较大                   》》》》情况 4

                                                       ( 这里的电流 大  和情况 2  的电流 大   是一样 大吗?  )

从以上四个情况来看, 表面上看    接收的状态, 在运行过程中只能是 从开转为关   才有效。

但你实验过程中是否确定:

1.  转换接收状态 , 都是在设备入网后操作 的吗?

2.  所谓电流大,电流小, 有没有个 实际的范围,比如 8mA 左右, 35mA 左右 之类?

cfg里面设置rx总是打开或者关闭后,终端的父节点路由或者协调器知道他子节点的接收状况吗?

====》 设备入网时 广播 Device Announce  这个信息就附带了 RX 的状态。 父节点当然就清楚了。(当然你抬杠说,那父节点要是刚好没收到呢?!)

rx关闭时候只有poll父节点的瞬间才打开自己的rx,父节点收到这个poll后才给子节点发送数据的。

====》 这是zigbee 固有的机制,  父节点会为 休眠的设备(即RX 为FALSE 的设备 ) 保存信息, 设备只有在POLL 父节点的时候 才能获取到这些信息。

              这个你可以理解成  门口的邮箱,  发信的人 不可能一直在你家门口等你, 他会把信放在 信息,你回家的时候查看 一下,有就查收。

那么当子节点rx一直打开时候,父节点知道吗?给子节点发送数据还在等待poll吗?

====》 就如我一开和你说的, 设备入网的时候就会告知自己 是否为休眠 的设备(即RX 是否为 TRUE), 父节点一旦知悉了终端的类型,那么在信息分发的时候就做对应的处理。  是放在信箱中 还是 直接发送。

所以,假设你说的 运用那条函数可以改变 接收 的状态, 但实际 它没有广播出来, 那么对于父节点 它该怎么办呢?

但是,你问我那函数 不是明明写着可以改变吗? 我 也不清楚

                               

大神终于出现了!

VV, 从他的描述 猜测:

这是一个终端设备, 有时用电池供电,有时又有USB 供电。

USB 供电时,  实时接收 消息。  (即像 RFD_RCVC_ALWAYS_ON = TRUE  这样设备)

电池供电时,  只在POLL RATE 到达的时候, 才去获取信息 (即像 RFD_RCVC_ALWAYS_ON = FALSE  这样设备)

简单的来说, 就是 一个设备  可以任意的从  实时接收信息的非休眠态  切换到   间隔接收信息的休眠态 。。

那长时间休眠的把poll rate改成0,实时接收信息的时候把poll rate改成500,不就可以了么

这样也不失为一个办法。

但是500的话, 一个网络中要是有几个这样的设备,那么网络中 全都是data request。。。网络应该很拥堵!

召唤@VV大神成功。不执行rx关闭,只是poll0能关闭poll但电流和rx打开时候电流一样,都不如关闭rx poll3000的水平

我的目的大致如楼上所说:为了降低功耗,和提升性能。d

1,电池供电,实验测得降低poll甚至关闭rx,电流的峰值就降低很多。所以想电池供电时一部分终端关闭rx完全不需要接收数据,以部分poll3000能接收数据。

2,usb供电,不考虑功耗,尽量提升性能,让rx一直开启,(终端都打开了power saving,若在切换供电时候能动态改变这个预编译内容,usb供电时候直接进pm2其实是更好的,但也要把rx一直打开,哪个函数应该是能修改rx打开或者关闭吧?ZMacSetReq( ZMacRxOnIdle, &tmp );)

我测试供电方式切换的时候和cfg里面设置rx的true、false,效果好像不能,都不能完全实现我预想的效果。

1,我在网站查找好像是只要-DRFD_RCVC_ALWAYS_ON=TRUE,则不论设置poll多少都不会发出poll,我测试应该是这样的,此时是usb,若切换到电池要关闭rx一直开,执行ZMacSetReq( ZMacRxOnIdle, &tmp );)关闭rx后poll1000已经不起作用了,若如你说的只修改poll1000则电流不会降低,证明rx依然是一直开的,要把rx修改成自动估计就好了。cfg初始化true能实现usb供电tx一直开,电池供电关闭roll,另一部分电池供电正常poll3000不能实现了。

,2,但-DRFD_RCVC_ALWAYS_ON=FALSE时候,调用ZMacSetReq( ZMacRxOnIdle, &tmp );)打开rx完全没有效果,usb供电rx一直开实现不了。电池供电关闭rx好用,电流也降低了,另一部分电池设备修改poll3000能实现。

3,我见ota升级里面的代码,都能提升降低poll,之前却执行了打开关闭rx。我跟我上面对函数的理解完全不同,但是照着做没有效果

static void SAPI_Ota_ProcessOTAMsgs( zclOTA_CallbackMsg_t* pMsg )

switch(pMsg->ota_event)
{
case ZCL_OTA_START_CALLBACK:

// Speed up the poll rate
RxOnIdle = TRUE;
ZMacSetReq( ZMacRxOnIdle, &RxOnIdle );
NLME_SetPollRate( 2000 );

 case ZCL_OTA_DL_COMPLETE_CALLBACK:

else
{
// slow the poll rate back down.
RxOnIdle = FALSE;
ZMacSetReq( ZMacRxOnIdle, &RxOnIdle );
NLME_SetPollRate(DEVICE_POLL_RATE);

最后:估计造成2方面都不能完全满足的原因,是对哪个函数理解的错误,要不就是如您前面说的要重新入网通知协调器(测得通信上行都是正常的,有问题的是指下行能否通信)。再请大神分析一下-DRFD_RCVC_ALWAYS_ON=FALSE;ZMacSetReq( ZMacRxOnIdle, &tmp );;poll的修改,这3者的关联吧

的确poll多了影响,抓包也不容易看,很多设备时候啥都看不见了

对的,如楼层时间2016-2-26 16:22 所说的一样的效果。

稍微补充一点,实时接收切换到间隔接收或关闭接收,并且功耗要下降。主要是同一个工程这部分共同的代码为不同类型的终端所使用

就是您楼层2016-2-26 16:17 分析那样的过程,我在整理回复您一下:

cfg 默认设置为 TRUE ,电池供电

》》》》情况 1

我只执行了函数关闭rx并没有修改poll=0,cfg里面默认poll=1000,没有起作用了貌似,抓包看data request,电流大于80-100ua,我就说电流较低,我这不是最小系统,此时不能通信(都只不能接收,可以发出),满足了要求。另外一些类型的设备需要接收,修改p0ll =3000,poll的频率是低了,但电流28-30ma(因为初始cfg里面rx=true,执行关闭后修改poll=3000,已结没有效果了,完全关闭了),不满足要求

切换到usb 

  》》》》情况 2

执行函数打开rx,并设置poll=0(我都是一起修改的3个poll值,若值修改pollrate=0不修改另外2个,抓包发现data request就变成15s了,很奇怪),电流28-30ma此时电流和入网前一样的,证明rx一直打开。正常通信。满足了要求

cfg 默认设置为 FALSE ,电池供电

  》》》》情况 3,POLL RATE 设置为1000,电流很小80-100ua,(正常通信  是指 上下行都可以对吗?   协调器发信息给终端, 应该要1s后才能收到 ),poll=3000,降低了电流峰值的次数,也节电了,满足了要求。另一部分类型设备,执行关闭rx,满足了要求,电流一直保持80-100ua,几乎没有poll那一下的峰值了。

切换到usb 

  》》》》情况 4

执行打开rx,poll=0,并不能通信,不论之前是关闭了rx,还是只降低了poll=3000.此处只要poll=0(rx完全打开,不需要poll了),就不能通信,rx打开根本没有作用,是否通信在于poll的值是否是0,不满足要求

但你实验过程中是否确定:

1,当然都是入网后切换的。

2,电流小就是我设备pm2的电流,80-100ua,电流大就是找网时候的电流28-30ma

后来我就怀疑到时协调器并不知道终端修改了rx常开还是依靠poll机制,所以下行数据有的时候抓不到包。若是终端入网信息Device Announce  中发给协调器的,这个信息就是cfg的-DRFD_RCVC_ALWAYS_ON的数值的话。那么我可以通过切换供电后执行终端重启来改变吗? 硬件重启好像依然是这个cfg的值,softreset呢?有用吗?还是执行什么函数有用呢?

协议栈的机制不够深入了解,难实现效果啊

  突然继续想到一个问题,终端依靠poll跟协调器通信。那么当有很多数据要协调器下发的时候,就要缓存这些数据吧。这部分代码在哪里呢,如何缓存的呢?想了解下,听说最多存9条3个设备的信息。若rx常开不依靠poll,以及路由接收数据的时候,也要一起缓存吗?此处也可能对我那么修改有影响,当子设备很多的时候

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top