资源描述
试验题目: 试验7—TI Z-Stack协议栈入门试验 试验时间: .12.24
一、 试验目:
学习TI Z-Stack协议栈软件架构, 掌握TI Z-Stack协议栈软件开发步骤。相关Z-Stack协议栈具体内容, 请参考TI官方文档。
安装TI Z-Stack协议栈, 学习协议栈相关IAR工程配置, 及常见软件工具使用方法。
二、 试验原理及程序分析:
a) Z-Stack概述
图1 ZigBee规范版本
现在TIZ-Stack协议栈实际上已经成为了ZigBee联盟认可并推广指定软件规范。所以, 掌握Z-Stack协议栈相关软件架构及开发步骤, 是我们学习ZigBee无线网络关键步骤。
b) Z-Stack软件架构
图2 Z-Stack软件架构
协议栈定义了通信硬件和软件在不一样层次怎样协调工作。在网络通信领域, 在每个协议层实体经过对信息打包与对等实体通信。在通信发送方, 用户需要传输数据包根据从高层到低层次序依次经过各个协议层, 每一层实体根据最初预定消息格式在数据信息中加入自己信息, 比如每一层头信息和校验等, 最终抵达最低层物理层, 变成数据位流, 在物理连接间传输。在通信接收方数据包依次向上经过协议栈, 每一层实体能够依据预定格式正确提取需要在本层处理数据信息, 最终用户应用程序得到最终数据信息并进行处理。
ZigBee无线网络实现, 是建立在ZigBee协议栈基础上, 协议栈采取分层结构。协议分层目是为了使各层相对独立, 每一层都提供部分服务, 服务由协议定义, 程序员只需关心与她工作直接相关那些层协议, 它们向高层提供服务, 并由底层提供服务。在ZigBee协议栈中, PHY、 MAC层位于最低层, 且与硬件相关; NWK、 APS, APL层以及安全层建立在PHY和MAC 层之上, 而且完全与硬件无关。分层结构脉络清楚、 一目了然, 给设计和调试带来极大方便。
整个Z-Stack采取分层软件结构, 硬件抽象层(HAL)提供多种硬件模块驱动, 包含定时器Timer, 通用I/O 口GPIO, 通用异步收发传输器UART, 模数转换ADC 应用程序接口API, 提供多种服务扩展集。操作系统抽象层OSAL实现了一个易用操作系统平台, 经过时间片轮转函数实现任务调度, 提供多任务处理机制。用户能够调用OSAL提供相关API进行多任务编程, 将自己应用程序作为一个独立任务来实现。
c) Z-Stack软件步骤
整个Z-stack关键工作步骤, 大致分为系统开启, 驱动初始化, OSAL初始化和开启, 进入任务轮循多个阶段。
图3 Z-Stack软件步骤图
系统初始化
系统上电后, 经过实施ZMain文件夹中ZMain.cint main()函数实现硬件初始化, 其中包含关总中止osal_int_disable(INTS_ALL)、 初始化板上硬件设置HAL_BOARD_INIT()、 初始化I/O 口InitBoard(OB_COLD)、 初始化HAL层驱动HalDriverInit()、 初始化非易失性存放器sal_nv_init( NULL )、 初始化MAC层ZMacInit()、 分配64位地址zmain_ext_addr()、 初始化操作系统osal_init_system()等。
硬件初始化需要依据HAL文件夹中hal_board_cfg.h文件配置寄存器8051寄存器。TI官方公布Z-Stack配置针对是TI官方开发板CC2530EB等, 如采取其她开发板, 则需依据原理图设计改变hal_board_cfg.h文件配置, 比如本文档配套硬件模块与TI官方I/O 口配置略有不一样, 需要参考硬件原理图进行对应修改。
当顺利完成上述初始化时, 实施osal_start_system()函数开始运行OSAL系统。该任务调度函数根据优先级检测各个任务是否就绪。假如存在就绪任务则调用tasksArr[]中相对应任务处理函数去处理该事件, 直到实施完全部就绪任务。假如任务列表中没有就绪任务, 则能够使处理器进入睡眠状态实现低功耗。程序步骤如图所表示。osal_start_system()一旦实施, 则不再返回Main()函数。
图4 OSAL任务循环
OSAL任务初始化
OSAL是协议栈关键, Z-Stack任何一个子系统都作为OSAL一个任务, 所以在开发应用层时候, 必需经过创建OSAL任务来运行应用程序。经过osalInitTasks()函数创建OSAL任务, 其中TaskID为每个任务唯一标识号。任何OSAL任务必需分为两步: 一是进行任务初始化; 二是处理任务事件。任务初始化关键步骤以下:
(1) 初始化应用服务变量。
const pTaskEventHandlerFn tasksArr[]数组定义系统提供给用服务和用户服务变量, 如MAC 层服务macEventLoop、 用户服务SampleApp_ProcessEvent等。
(2) 分配任务ID和分配堆栈内存
void osalInitTasks(void)关键功效是经过调用osal_mem_alloc()函数给各个任务分配内存空间, 和给各个已定义任务指定唯一标识号。
(3) 在AF层注册应用对象
经过填入endPointDesc_t数据格式EndPoint变量, 调用afRegister()在AF层注册EndPoint应用对象。
经过在AF层注册应用对象信息, 通知系统afAddrType_t地址类型数据包路由端点, 比如用于发送周期信息SampleApp_Periodic_DstAddr和发送LED闪烁指令SampleApp_Flash_DstAddr。
(4) 注册对应OSAL或HAL系统服务
在协议栈中, Z-Stack提供键盘响应和串口活动响应两种系统服务, 不过任何Z-Stask任务均不自行注册系统服务, 二者均需要由用户应用程序注册。值得注意是, 有且仅有一个OSAL Task能够注册服务。比如注册键盘活动响应可调用RegisterForKeys()函数。
(5) 处理任务事件
处理任务事件经过创建“ApplicationName”_ProcessEvent()函数处理。一个OSAL任务除了强制事件(Mandatory Events)之外还能够定义15个事件。
SYS_EVENT_MSG(0x8000)是强制事件。该事件关键用来发送全局系统信息, 包含以下信息:
AF_DATA_CONFIRM_CMD: 该信息用来指示经过唤醒AF DataRequest( )函数发送数据请求信息情况。ZSuccess确定数据请求成功发送。假如数据请求是经过AF_ACK_REQUEST 置位实现, 那么ZSuccess能够确定数据正确抵达目地。不然, ZSuccess仅仅能确定数据成功传输到了下一个路由。
AF_INCOMING_MSG_CMD: 用来指示接收到AF信息。
KEY_ CHANGE: 用来确定按键动作。
ZDO_ NEW_ DSTADDR: 用来指示自动匹配请求。
ZDO_STATE_CHANGE: 用来指示网络状态改变。
d) Z-Stack协议栈目录结构
正如前面所描述那样, 我们以Z-Stack协议栈安装后, 自带一个工程SampleApp样例为模板, 了解下协议栈目录结构及相关软件步骤。
图5 SampleApp 工程
e) ZigBee系统初始化步骤
Z-Stackmain函数在ZMain.c中: 系统初始化、 实施操作系统实体
Osal_int_disable(INTS_ALL):关闭全部中止
HAL_BOARD_INIT():初始化系统时钟
Zmain_vdd_check():检测芯片电压是否正常
Zmain_ram_init():初始化堆栈
InitBoard(OB_COLD):初始化LED, 配置系统定时器
HalDriverInit():初始化芯片各个硬件模块
Osal_nv_init():初始化FLASH存放
Zmain_ext_addr():形成节点MAC地址
zgInit():初始化部分非易失变量
zmacInit():初始化mac层
Afinit():初始化应用框架层
Osal_init_system():初始化操作系统
Osal_int_enabled(inis_all):使能全部中止
Initboard(ob_ready):初始化按键
Zmain_dev_info():在液晶上显示设备信息
Osal_start_system():实施操作系统
三、 试验步骤及结果:
1、 安装TI ZStack-2.3.0-1.4.0协议栈(根据第一章windows开发环境搭建ZigBee部分安装)。
2、 熟悉TI ZStack-2.3.0-1.4.0协议栈自带例程IAR工程配置。
3、 编译工程, 并下载调试
选择对应模板工程, 进行编译, 下载调试。
连接ZigBee 模块硬件, 使用ZigBee Debuger USB 仿真器连接ZigBee 模块, 上电后, 即可经过IAR工程Debug来下载并调试。
4、 使用ChipconFlashProgrammer软件更改MAC物理地址
四、 试验心得:
在试验中了解到Z-Stack协议栈结构, 在调试下载代码时, 会出现下载错误, 这时可能会是USB线接触不良, 需要把USB线拔出再重新插入。
展开阅读全文