ZigBee中遇到的问题总结

来源:互联网 发布:nba2kol贾森汤普森数据 编辑:程序博客网 时间:2024/04/30 12:32

学习ZigBee已经有一个月的时间。从CC2430CC2530都有过接触,也写了一些简单的程序。在学习的过程中,找了不少资料,解决了很多困惑。总结如下(不断更新):


1:生成的hex文件大于128K256K 

hex文件是可以烧录到MCU,并可以被MCU执行的文件。文件本身包含了很多信息,

:起始地址、数据长度、段地址、偏远地址等信息。代码的大小应该从生成的.map文件中查看(在工程目录的最后)。在文件末尾就是代码的大小。实际不到128K

101 290 bytes of CODE  memory

      26 bytes of DATA  memory (+ 78 absolute )

    6 306 bytes of XDATA memory

      192 bytes of IDATA memory

        8 bits  of BIT   memory

      181 bytes of CONST memory


2:不进行绑定,终端节点和协调器怎么进行通信

绑定是两个或者多个应用设备之间信息流的控制机制。绑定允许应用程序发送一个数据包而不需要知道目标地址。在协调器开始工作时,会根据PAN_ID建立一个网络,其段地址为0x0000,所以终端节点只需要把发送地址设为0x0000,就可以给协调器发送信息。如:zb_SendDataRequest( 0x0000, ENDDEV_REPORT_CMD_ID, 9, "xxxxxxxxx", 0, AF_TX_OPTIONS_NONE, 0); (如果需要双向通信,或多向通信还需要其他办法)。


3hex文件刷到设备上后没反应

这个问题还真的遇到过,首先排除程序的问题,发现是生成的hex文件不正确。

project->options->linker->output Format 选项内应该选择Other 剩下的默认。

Tools文件夹下 f8w2530.xcl 文件 210行左右 有以下内容:

Include these two lines when generating a .hex file for banked code model

-M(CODE)[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_CODEBANK_END+_FIRST_BANK_ADDR)]*\

_NR_OF_BANKS+_FIRST_BANK_ADDR=0x8000

生成正确的hex文件要把这两行注解去掉


4:怎么接收数据

收发数据主要是靠AF(应用框架层)完成。

发送数据的函数是AF_DataRequest()(在sapi中是zb_SendDataRequest()

发送到节点后,节点执行osal_msg_receive()来检索收到的信息,判断是否是AF_INCOMING_MSG_CMD 事件。如果是则通过AF_INCOMING_MSG_CMD 消息事件来处理收到的数据包,处理函数可以自己来写(在sapi中有zb_ReceiveDataIndication())。函数参数中要有刚收到的数据包,数据类型是afIncomingMSGPacket_t


5:怎么给协调器发送信息,是否需要绑定

当一个终端节点加入协调器建好的网络时,只需要将发送目的的短地址设置为0x0000,就可以向协调器发送信息。协调器是网络的创建者,网络建好后协调器的短地址就是0x0000。可以不需要进行绑定,绑定是在不知道对方地址而进行通信的一种方法。


6:终端节点怎样加入一个网络

只要协调器和节点的PAN_ID 设为相同的数值,如:#define PAN_ID 23,节点就可以加入协调器建立的网络。需要注意的是在f8wConfig.cfg文件中(Tools文件夹下)ZDAPP_CONFIG_PAN_ID是否被注解掉或者值为0xFFFF,应该改成-DZDAPP_CONFIG_PAN_ID = PAN_ID。还有要看协调器是否能自启动,是否编译了HOLD_AUTO_START选项。


7:怎么正确设置PAN_ID

最直接的办法就是在f8wConfig.cfg中 -DZDAPP_CONFIG_PAN_ID = 10,或者一个合法的值。如果是用宏定义的方式自己定义PAN_ID,如:在自己写的一个头文件中加入#define PAN_ID 23,f8wConfig.cfg中也改成

 -DZDAPP_CONFIG_PAN_ID = PAN_ID,这样编译会出现错误提示  identifier “PAN_ID” undefined 标识符“PAN_ID”未定义。还需要把头文件包含到ZGlobals.c文件中(NWK文件夹中)。

8:关于#pragma optimize=none 禁止优化指令

IAR EWARM编译器和其他厂家的C编译器相比非常高效,但是当程序里面包含对时序要求比较严格的代码的时候,IAR常常会把这些代码过渡优化,破坏了时序的要求,造成程序错误,在程序代码比较紧的时候又必须优化,特别在延时函数,spi操作等延时要求高的操作中,如果不加禁止优化指令,很多都会出现莫名奇妙的错误,如:延时时间不对,spi没有收到数据。解决加入禁止优化指令可以很好的解决这一问题。


推荐飞比论坛http://www.feibit.com/ 锋硕电子http://fuccesso.com.cn/ 锋硕出的资料对代码分析很好,初学看代码分析会理解很多。(如有理解不当之处,欢迎指正)。



原创粉丝点击