在CC2530/CC2538/CC2630中分为两个IEEE地址,一个称为Primary IEEE地址,另外称为Secondary地址。Primary IEEE地址是存放在芯片的Information Page里面,这个地址是TI向IEEE协会购买的,每个芯片的地址都是唯一的。并且用户只能Read这个值,没办法擦除/修改。在协议栈中直接通过读地址可以获得 osal_memcpy(aExtendedAddress, (uint8 *)(P_INFOPAGE+HAL_INFOP_IEEE_OSET), Z_EXTADDR_LEN)。 Secondary地址是存放在CC2530里的Flash最后一个Page里面,用户可以进行Read/Write. 通过函数HalFlashRead(HAL_FLASH_IEEE_PAGE, HAL_FLASH_IEEE_OSET, aExtendedAddress, Z_EXTADDR_LEN);。
协议栈运行是,是如何选择Primary IEEE地址或者Secondary地址作为设备的MAC地址的,具体在函数zmain_ext_addr(void)操作。
1) 从NV中读取 IEEE地址,如果已经存在(都不为0xFF),就使用该地址作为MAC地址了。
2) 如果1)中没有,从Secondary IEEE地址存放位置读取,如果有(都不为0xFF),把该地址写入到NV中,以后就用该地址作为MAC地址了。
3) 如果2)中没有,从Primary IEEE地址存放位置读取,如果有(都不为0xFF),把该地址写入到NV中,以后就用该地址作为MAC地址了
4) 如果3)中没有,就随机产生一个64位的变量,写入到NV中,并作为MAC地址。
4,End Device是低功耗设备, 有电池供电, 节点在断网以后,如何能够禁止节点持续搜索网络,或者把发送Beacon Request间隔增大
1)启动搜索网络 uint8 ZDApp_StartJoiningCycle( void )
停止搜索网络 uint8 ZDApp_StopJoiningCycle( void )
2) 更改发送Beacon Request的周期
修改变量zgDefaultStartingScanDuration
// Beacon Order Values
#define BEACON_ORDER_NO_BEACONS 15
#define BEACON_ORDER_4_MINUTES 14 // 245760 milliseconds
#define BEACON_ORDER_2_MINUTES 13 // 122880 milliseconds
#define BEACON_ORDER_1_MINUTE 12 // 61440 milliseconds
#define BEACON_ORDER_31_SECONDS 11 // 30720 milliseconds
#define BEACON_ORDER_15_SECONDS 10 // 15360 MSecs
#define BEACON_ORDER_7_5_SECONDS 9 // 7680 MSecs
#define BEACON_ORDER_4_SECONDS 8 // 3840 MSecs
#define BEACON_ORDER_2_SECONDS 7 // 1920 MSecs
#define BEACON_ORDER_1_SECOND 6 // 960 MSecs
#define BEACON_ORDER_480_MSEC 5
#define BEACON_ORDER_240_MSEC 4
#define BEACON_ORDER_120_MSEC 3
#define BEACON_ORDER_60_MSEC 2
#define BEACON_ORDER_30_MSEC 1
#define BEACON_ORDER_15_MSEC 0
5,如何让End Device进入低功耗状态,休眠时间是如何设定的?
在协议栈宏定义中使能POWER_SAVING后,然后在f8wConfig.cfg文件里面把-DRFD_RCVC_ALWAYS_ON=FALSE,就可以让End Device进入休眠状态。
关于休眠的时间是有OSAL操作系统的调度来决定,每次休眠时间都是按照最新会发生的一个Event Timeout作为休眠时间。具体在协议栈hal_sleep函数中有说明。
这个timeout主要分为两类,一类是应用层事件的timeout,另外一类是MAC层事件的timeout,
1)应用层的timeout的时间,是在osal_pwrmgr_powerconserve( void )函数中,通过osal_next_timeout();获得的。
2)MAC层的timeout时间,是通过halSleep( uint16 osal_timeout )函数里面,通过MAC_PwrNextTimeout();来获得的。
6,ZigBee 3.0协议栈有哪些新的东西?
请参考下面的链接,介绍了ZigBee 3.0协议栈相对于之前ZigBee Home Automation/ZigBee Light Link 所增加的东西。
http://processors.wiki.ti.com/index.php/What%27s_New_in_ZigBee_3.0
7,TI ZigBee协议栈中关于终端设备的状态机切换
http://www.deyisupport.com/question_answer/wireless_connectivity/zigbee/f/104/t/104629.aspx
8,关于TI协议栈中OAD和OTA的区别
OAD全称Over the Air Download, OTA全称Over the Air. 这两个实现的功能都一样,都可以叫做对程序的空中升级。在早期的ZigBee协议标准中,并没有关于节点程序空中升级方面的标准,但是很多客户都对空中升级有需求,所以TI自己开发了一套关于程序空中升级的协议栈,并且命名为OAD。后来ZigBee联盟看到产品对空中升级的需求越来越来,随机也指定了空中升级方面的标准,命名为OTA,该标准也是参考了TI的OAD实现方式,做了相关的修改。所以TI的早期协议栈中,空中升级叫OAD,后来的协议栈中跟随ZigBee联盟的空中升级协议,就叫OTA了。
9,如果在非低功耗设备中,未焊接32K晶振,Z-Stack协议栈需要怎么修改?
在Z-Stack协议栈中,初始化都有对使用的晶振是否稳定进行检测。如果未焊接32K晶振,则需要对下面的代码进行修改。TI Z-Stack 协议栈默认是使用32K晶振的。
在hal_board_cfg.h文件,
#define OSC32K_CRYSTAL_INSTALLED FALSE
10,如果开发基于ZigBee Mesh网络的私有应用,应该选择哪个协议栈?
很多用户只想把zigbee mesh网络的功能运用在自己的系统或者产品中,并不需要完全按照zigbee 定义的应用层规范来做,特别是一些行业性的应用。针对这样的应用需求,应该如何选择TI 合适的协议栈进行产品开发呢?
http://www.deyisupport.com/question_answer/wireless_connectivity/zigbee/f/104/t/132197.aspx
11,使用CC2630/CC2650进行ZigBee开发,Debug时可以在Core stack代码进行下断点调试吗?
可以下的,你要下载断电的代码对应的文件,一定要提前打开,然后进行Debug,就可以去打开的文件进行Debug了。
12,Zigbee协调器是如何选择合适的信道创建网络?
Zigbee网络的创建必须有协调器来完成,一个Zigbee网络有且只有一个协调器。Zigbee协调器在创建网络时主要完成的是网络信道的选择和PANID的生成。关于信道的选择,大致可以分为两个步骤,1)被动扫描也叫能量扫描Energy Scan,所谓被动扫描就是协调器将自己的接收机打开,然后在事先设定的信道列表上依次扫描,扫描后会得到每个信道的能量值,这个能量主要来自其他的Zigbee网络,或者其他的2.4GHz无线信号。协调器会将能量值高于事先设定的阈值的信道认为有较大的干扰存在,将该信道排除。2) 主动扫描Active Scan,在第一轮扫描以后留下的信道中,依次发送Beacon Request,如果收到对应的Beacon数据包,认为该信道中存在其他的Zigbee。最后协调器会选择一个没有其他的Zigbee网络PANID., 或者存在Zigbee网络最少的信道建立自己的网络并且设定一个没有冲突的PANID.
13,如何使用免费的Wireshark做Zigbee Sniffer抓包工具?
https://e2echina.ti.com/question_answer/wireless_connectivity/zigbee/f/104/t/150032
14,删除UI,使用TI Zigbee 3.0协议栈快速进入产品开发模式
https://e2echina.ti.com/question_answer/wireless_connectivity/zigbee/f/104/t/146528
15, 但使用如何优化CC2530的Flash 和RAM
http://www.ti.com/lit/wp/swra635/swra635.pdf