微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > zcl_SendCommand() 返回成功但没有发送出数据包

zcl_SendCommand() 返回成功但没有发送出数据包

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

硬件情况: CC2530 + CC2592

协议栈版本: ZHA1.2.2a

phyTransmitPower设置为18

问题概述:出现一个问题,对设备控制(灯)时,出现不间断的控制不到。

问题详细描述:

调用函数 zcl_SendCommand() 控制设备,返回值为ZSuccess,但是通过抓包工具发现数据包并没有发送出去,导致控制不到设备;内存调试并没有出现溢出的现象,请问这是怎么回事?而且在1s间隔的长时间控制中,会出现RF死机的情况,这又是怎么回事呢?

是终端设备对路由吗?终端设备需要接收response吗?poll rate多少

感谢VV大神抽空回答。

是协调器对路由设备的控制,函数zcl_SendCommand() 返回值是ZSuccess,但是抓包发现有时数据包没有发出来。

协调器与高通的一款芯片是通过SPI DMA方式通信的,CC2530DMA中断后解析完命令调用zcl_SendCommand() 发送控制命令,函数返回ZSuccess则调用SPI DMA发送消息告诉主机成功,SPI的gpio是 P0_4: SSN     P0_5: SCK      P0_3: MOSI      P0_2: MISO,请问难道这两者会干扰吗?因为有时候CC2530 RF死机后,SPI也死机了。

还有就是,zcl_SendCommand()设置了默认响应,这个默认响应的消息内存也得到释放,是不是有其他需要注意的地方呢?

1. 导致RF与SPI死机的原因找到了,是由于ZStack的调度时间为320us,而程序DMA中断后处理程序执行时间超过了这个时间导致的。

2. zcl_SendCommand()返回ZSuccess但抓包没有抓到是由于,这个返回值仅表示数据包成功到了发送缓冲区,有没有真正的发送出去还得靠MAC ACK和APS ACK进行检测。

问题: 1. 什么原因会导致数据到发送缓冲区后出现没有调制成载波出去呢?

            2. 如果数据包没有发送出去,有没有触发事件到应用层呢?

你填写的参数是否都正确?

参数是对的,我调用的是on/off的宏:

tmp = zclGeneral_SendOnOff_CmdOn( dstAddr.endPoint, &dstAddr , false ,netServiceSeqNum++ );

补充一下,出现返回ZSuccess但是抓包没有抓到数据包这种情况是做压力测试时出现的,测试的方法是每隔1s协调器向路由器发送On/Off命令,测试时间1小时就出现了几次这种现象,PA用的CC2592,phyTransmitPower设置为20。

这个问题可能对产品在真实应用中出现很大的隐患,还请VV大神解答一下,硬件上的问题除了PA,应该没有其他影响,但是PA只是调制信号,按理说不应该会有影响;还是说这个压力测试的要求有点高呢?

还有就是有没有办法在应用层快速知道数据包是否真的发送出去了?

你是点对点做的测试,还是一对多的时候做的测试。

您好,这个问题解决了吗?我现在也遇到这个问题了,不知道该怎么弄

1. 解决方法:

这个问题可以在应用层加超时机制和重传解决。

2. 根本原因猜想:

AF_DataRequest只是把数据包打包后到达MAC层的Queue等待发送,

802.15.4中有一个原语purge,这个原语的作用对象是协调器,作用是删除发送Queue中的一个消息,

所以可能由于某种原因这个原语被使用了。

3. 测试思路建议:

purge接口在 mac_api.h 中描述如下:

/**************************************************************************************************
* @fn MAC_McpsPurgeReq
*
* @brief This function purges and discards a data request from the
* MAC data queue. When the operation is complete the MAC sends
* a MAC_MCPS_PURGE_CNF.
*
* input parameters
*
* @param msduHandle - The application-defined handle value
*
* output parameters
*
* None.
*
* @return None.
**************************************************************************************************
*/
extern void MAC_McpsPurgeReq(uint8 msduHandle);

从描述中可以看到这个原语有confirm,所以可以在CNF回掉函数中进行测试打印。

4.  如果有进行测试希望可以分享结果哈,谢谢!

AF_DataRequest还不是直接打包到MAC层的Queue,还有网络层的缓存。所以你想做Purge是没用的。唯一解决办法是不要连续调用,AF_DataRequest连续发送数据时,中间至少有10ms的超时间隔。也就是说要执行osal_run_system超过10ms

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

网站地图

Top