历史上的今天
返回首页

历史上的今天

今天是:2025年04月09日(星期三)

正在发生

2019年04月09日 | ZigBee协议栈(一)--协议栈介绍

2019-04-09 来源:eefocus

1、Zigbee协议栈简介

  协议是一系列的通信标准,通信双方需要按照这一标准进行正常的数据发射和接收。协议栈是协议的具体实现形式,通俗讲协议栈就是协议和用户之间的一个接口,开发人员通过使用协议栈来使用这个协议,进而实现无线数据收发。


  如图1所示:Zigbee协议分为两部分,IEEE 802.15.4定义了PHY(物理层)和MAC(介质访问层)技术规范;Zigbee联盟定义了NWK(网络层)、APS(应用程序支持层)、APL(应用层)技术规范。Zigbee协议栈就是将各个层定义的协议都集合在一起,以函数的形式实现,并给用户提供API(应用层),用户可以直接调用。


            图1 ZigBee无线网络协议层的架构图

 

2、如何理解Zigbee协议栈

  协议栈是协议的实现,可以理解为代码,库函数,供上层应用调用,协议较底下的层与应用是相互独立的。商业化的协议栈只提供你接口(其实和互联网行业的API模式很像)。就像你调用地图API时不需要关心底层地图是怎么根据位置或坐标绘制的,你也不用关心协议栈底层的实现,除非你想做协议研究。每个厂家的协议栈是有区别的,比如TI的BLE协议栈和nordic的BLE协议栈就有很大的不同(多说一点,TI的BLE协议栈更像是安卓的BLE结构,所以会安卓蓝牙的人可能能看懂TI的代码)。

 

3、如何使用Zigbee协议栈

  以简单的无线数据通信为例,其一般步骤为:

① 组网:调用协议栈组网函数、加入网络函数,实现网络的建立和节点的加入

② 发送:发送节点调用协议栈的发送函数,实现数据无线发送

③ 接收:接收节点调用协议栈的无线接收函数,实现无线数据接收

  由于协议栈都把这些函数都封装好了,因此我们用起来比较方便。下面是协议栈无线发送函数:



  如果想更好的应用协议栈就需要对协议栈提供的这些函数及其参数的具体作用和意义进行细致的了解,这个在接下来中会详细介绍。

 

4、安装Zigbee协议栈

  从我百度共享的所有本系列资料中下载004解压并安装:


               图2 ZigBee协议栈下载路径

 

安装好之后在win7开始按钮下会有如下文件结构:


                  图3 ZigBee协议安装完成后的文件结构


  其中:


 

5、基于协议栈的无线收发控制LED工程讲解(一)

  从网盘下载ZStack-2.3.1a压缩文件:


图4 工程源码所在云盘目录

  

  用IAR打开.. ZStack-2.5.1aProjectszstackSamplesSampleAppCC2530DB目录下的工程文件,注意不要把001Stack-2.5.1a放在比较深的文件夹内,否则IAR打开工程时可能一直卡打不开,也最好不要有中文!打开后工程及结构如下:(有点眼花缭乱,不要紧,后面会结合源码一步步分析)


                  图5 工程整体架构

 

6、基于协议栈的无线收发控制LED工程讲解(二)

  在IAR中选择XXXXEB,第一遍要rebuild all,下载好协调器之后,再切换到EndDeviceEB编译下载到另一个板子做终端设备:


          图6 编译工程

 

两个节点程序下载好之后上电会看到:组网成功后D1闪烁。


                图7 实验现象

 

7、基于协议栈的无线收发控制LED工程讲解(三)

main code:

 1 int main( void )

 2 {

 3     osal_int_disable( INTS_ALL );// Turn off interrupts         关中断

 4     HAL_BOARD_INIT();// Initialization for board related stuff such as LEDs

 5     zmain_vdd_check();// Make sure supply voltage is high enough to run   检查芯片是否上电正常

 6     InitBoard( OB_COLD );// Initialize board I/O  初始化I/O,LED,Timer等

 7     HalDriverInit();// Initialze HAL drivers 初始化硬件抽象层驱动模块

 8     osal_nv_init( NULL );// Initialize NV System 初始化flash存储器

 9     znpTestRF();// Initialize and check the ZNP RF Test Mode NV items. 

10     ZMacInit();// Initialize the MAC  初始化MAC层

11     zmain_ext_addr();// Determine the extended address  确定IEEE64位地址

12 

13 #if defined ZCL_KEY_ESTABLISH

14     zmain_cert_init();// Initialize the Certicom certificate information.

15 #endif

16 

17     zgInit();// Initialize basic NV items  初始化非易失变量

18 

19 #ifndef NONWK

20     afInit();// Since the AF isn't a task, call it's initialization routine

21 #endif

22 

23     osal_init_system();// Initialize the operating system     初始化OS(重点介绍1)

24     osal_int_enable( INTS_ALL );// Allow interrupts       使能中断

25     InitBoard( OB_READY );// Final board initialization      最终板载初始化

26     zmain_dev_info();// Display information about this device     显示设备信息(这里有LCD屏幕)

27 

28 #ifdef LCD_SUPPORTED/* Display the device info on the LCD 将信息显示在LCD上*/

29     zmain_lcd_init();      

30 #endif

31 

32 #ifdef WDT_IN_PM1

33     WatchDogEnable( WDTIMX );/* If WDT is used, this is a good place to enable it. */

34 #endif

35 

36     osal_start_znp(); // No Return from here    执行操作系统(重点介绍2)

37 

38     return 0;  // Shouldn't get here.

39 } // main()

代码有点难懂,核心是执行初始化工作,包括硬件抽象层、网络层、任务等。然后执行osal_start_znp() ,进入一个死循环,不断对任务进行遍历执行。这里我们需要重点了解两个函数:

 

 

① 操作系统初始化函数

在操作系统初始化中需重点关注的是操作系统任务初始化osalInitTasks函数,操作系统初始化函数中主要来创建任务,taskID是任务ID,每增加一个任务ID++,同时ID越小表示该任务优先级越高!其中蓝框内的函数是要根据系统想完成的任务做修改的地方,其他都是官方提供的基本不用变的任务。

 

② 操作系统启动函数

 

执行OS的函数就是个大循环,不断取出当前优先级最高的待处理事件进行处理,处理的核心思想在osal_run_task函数内:通过调用一个函数指针来远程调用一个事件处理函数!

 

8、小结

  至此,我们讲到任务如何建立、如何处理等,其中有一个环节没有讲——如何从events=(tasksArr[idx])(idx,event)关联到每个具体任务的事件处理函数的?这个其实我在CC2540/CC2541的前两篇中已有详细介绍:[接下来会针对具体通信梳理流程!]

1、CC2541蓝牙4.0芯片中级教程——基于OSAL操作系统的运行流程了解+定时器和串口例程了解

2、CC2541芯片中级教程-OSAL操作系统(进一步了解-OLED && 普通按键和5方向按键-中断!!!)这个系统驱动层和应用层不一样~

3、CC2541芯片中级教程-OSAL操作系统(ADC光敏电阻和修改串口波特率)

4、CC2541芯片中级教程-OSAL操作系统(简单AT指令实现+IIC软件和硬件实现驱动MPU6050)

5、CC2541芯片中级教程-OSAL操作系统(PWM+看门狗)


推荐阅读

史海拾趣

Display Elektronik GmbH公司的发展小趣事

Display Elektronik GmbH始终将产品质量放在首位。公司建立了严格的质量控制体系,从原材料采购到生产流程,再到成品检测,每一个环节都严格把关。这种对品质的坚持让Display Elektronik GmbH的产品在市场上赢得了良好的口碑,也为其赢得了众多知名客户的信赖。

歌普(GEPU)公司的发展小趣事

为了进一步扩大市场份额,Display Elektronik GmbH实施了国际化战略。公司积极开拓海外市场,与多个国家和地区的客户建立了合作关系。同时,Display Elektronik GmbH还在海外设立了研发中心和生产基地,以便更好地满足当地市场的需求。这种国际化战略的实施,让Display Elektronik GmbH的产品逐渐走向世界。

EF Johnson Technologies Inc公司的发展小趣事

在电子通信技术的浪潮中,EF Johnson Technologies Inc公司凭借其卓越的研发团队,成功开发出一款新型无线通信设备,该设备在信号稳定性和传输距离上均取得了重大突破。这一技术突破不仅让EF Johnson在市场上获得了显著的竞争优势,也推动了整个行业的技术进步。随着产品的广泛应用,EF Johnson逐渐确立了其在无线通信领域的领先地位。

EDAL公司的发展小趣事

随着云计算、大数据等技术的兴起,传统EDA行业面临着前所未有的挑战。为了应对这些挑战,EDAL公司积极转型升级,将云计算、大数据等技术与EDA工具相结合,推出了更加高效、智能的云端EDA服务。这一创新的服务模式不仅提升了客户的设计效率,还降低了成本,赢得了市场的广泛认可。

Adamant Co Ltd公司的发展小趣事

随着电子行业的快速发展,市场竞争日益激烈。Adamant Co Ltd面临着来自同行的压力以及新兴技术的挑战。为了应对这些变革,公司进行了战略调整,加大了对研发和创新的投入。同时,公司还积极拓展新的业务领域,如物联网、人工智能等前沿技术。这些战略调整使得Adamant Co Ltd在激烈的市场竞争中保持了领先地位。

AUK Contractors Co Ltd公司的发展小趣事

AUK Contractors Co Ltd深知人才是企业发展的核心。因此,公司一直注重人才培养和团队建设。通过定期的培训、交流以及激励机制,公司吸引并留住了一批批优秀的电子工程师和技术人才。这些人才为公司的发展提供了源源不断的动力。

问答坊 | AI 解惑

ATmega16中文资料

本帖最后由 paulhyde 于 2014-9-15 09:20 编辑 ATmega16中文资料  …

查看全部问答>

关于三星封装的KBN00900HM-A439的详细资料

如题,各位大侠有没有关于三星封装的KBN00900HM-A439的详细资料啊????…

查看全部问答>

把kernel从vivi向u-boot移植的时候遇到问题了!

三星提供的kernel是for vivi 的,但俺想用u-boot来引导,结果移植上去之后,u-boot是跑起来了,但是引导kernel却出问题了 看了kernel的头部的二进制数据,发现kernel的格式竟然还和bootloader的类型有关,for vivi的kernel的头就是适合vivi,不 ...…

查看全部问答>

摆脱电源线不是梦,2015日本将实现无线家电

本2015年有望进入“无线家电时代”   “如果所有家用电器都不需要插电了该多方便啊!这样就不必为了家居的摆放费脑筋了……”这种想法并非“天方夜谭”,记者了解到,这一理想有望于2015年在日本率先实现。      文/记者 冯秋瑜&nbs ...…

查看全部问答>

【求助】定时器A的输入信号

我想用捕获模式.书上有这样一句: 定时器A的输入信号,由CCIx1和CCIx0选择,输入信号可以来自外部引脚也可以来自内部信号. 但是看电路,不是都在P1口输入的吗,怎样能做到用内部信号? 是用一个IO口输出信号再连到P1口的1.1 或 1.2或 1.3 吗 ?…

查看全部问答>

【求助】

斑竹和高手们: 救命啊!我的(flash emulation tools)JTAG程序下载的头坏了,不知道怎么修理。现在急用请大家帮帮忙!!!!!!!!…

查看全部问答>

常用二阶IIR滤波系数的计算方法

  IIR滤波器是无限冲击响应滤波器, 其优点:       1. 采用模拟原型滤波的标准设计,容易理解。       2. 可以用低阶设计实现,并且可以高速运行       ...…

查看全部问答>

linux驱动模型简析(转帖)

作者:李强,华清远见嵌入式学院讲师。 本人注:详细请参见《深入理解LINUX内核》第十三章。 kobjec是linux在2.6中新引进的统一的设备管理模型,他的主要目的就是对linux的2.6系统所有的设备进行统一的管理,在以前的内核中并没有独立的数据结构 ...…

查看全部问答>

简单的改product string和vendor string ,用AT24C01A,却出现乱码,求助大侠

简单的改product string和vendor string ,用AT24C01A,却出现乱码,求助大侠 根据产品的数据表列出的EXTERNAL ROM EXAMPLE,进入编程,按照列表数据逐一输入,插上PCB后,却出现乱码 编程 搞好后竟然是乱码 不知哪里出了问题,求助…

查看全部问答>