TIMAC 学习笔记1

TIMAC是TI公司推出的基于IEEE 802.15.4的通讯协议栈,编译环境为IAR,使用IAR自带的CLIB库,CLIB库提供了轻量级的C库,它不支持嵌入式C++。适用于RF4CE协议和ZigBee-Pro产品。

目前学习的MAC层协议版本为1.5.0.

为什么要学习TIMAC呢?在开发基于ZigBee的项目中,遇到了一些底层上的问题,再深入时,发现卡在底层封装的库中去,TIMAC比ZStack的底层开放程度更高,为了更好的理解无线传输的一些细节问题,才会去看TIMAC协议。

特点

1. 多平台支持,CC2538,2530,2531无线MCUs,CC2520收发器,

2. 支持星型拓扑,点对点,一点对多点

3. 支持同步信标和异步非信标模式。目前的ZStack是不支持同步信标网络的。

4. 支持网络安全,无版权和license费用

应用领域

1. 无线点对点和点对多点传输环境

2. 电池供电设备,需要支持ACK和重传的环境,低速率无线传输要求(<100Kbps)

学习步骤

1. 先从TIMAC自带的文档看起,先大体的浏览一次,以后遇到相关的函数,能够记得在哪里去找就可以了。

  802.14.4 MAC API.pdf 整个分三部分

1.1 文档目的,参考引用和相关的缩写

   1.2 API总览,分为内部接口机制、数据接口和管理接口等、常用常量和结构体

   1.3 下面按照功能来介绍相关接口,初始化接口、数据接口、管理接口、扩展接口、回调接口和一些常见的使用场景。每部分接口按照介绍、通用常量和结构体、函数接口详细介绍来描述,条理分明,层次清楚,参考价值非常高。

2. 看TIMAC 提供的例程

  目录位于 D:\Texas Instruments\TIMAC 1.5.0\Projects\mac\Sample\cc2530\IAR Project,工程名称为msa_cc2530.eww.此工程有四项配置,如下图所示:

TIMAC的CC2350例程提供了两种不同大小程序配置,分为bank(最大可用256K FLASH)和non-banked(最大可用 64K FLASH).提供了安全和正常两种数据传输方式,为Normal和Secure.程序默认选择配置:Normal,含义是正常传输,non-banked配置,总共有4种不同的配置选项,含义以此类推。

IEEE 802.15.4 规范在2.4G 频率范围内,定义了16个信道,编号从11到26.

下面开始,逐步分析实例程序的整体结构。

从任务数组(见下图)来看,整个系统只有三个任务在跑,一个是mac层,一个应用层msa,一个硬件抽象层hal。

mac层的事件处理肯定是被封掉了啦,封在哪里呢?代码里面肯定是找不到的,搜一下lib文件,发现如下几个可疑文件。

很明显,从名字上来看,mac层的相关操作函数封在这里了,四种库,对上上图工程配置里面的四种情况,对应上了。从大小和编译生成的时间上来看,安全传输要求的MAC库比普通传输的MAC要大,Banked模式要比Non-Banked的库要大,原因很明显,就不用解释啦。具体在IAR的哪里把库文件的路径引用进入的呢?从Option for node—>Linker—>Extra Options里面,应该是要包含引用库所在的路径的,但是默认配置里面没有包含,是少些了吗?还是在其他什么地方包含了?这一点还没想明白。

还是回到程序本身,TIMAC里面的例程,提供了基本的协议和函数接口,用于测试和验证IEEE 802.15.4 MAC层的相关操作。能够演示设备角色的建立、加入/建立网络、连接和断开连接、收发数据和信标支持。 

示例程序由4部分组成,main,初始化,系统事件处理和回调函数处理。

当编译出现下图的错误时,需要修改IAR使用的虚拟寄存器数量,将原数值改为8,就可以编译通过了。

下图给出了四种不同工程配置的宏配置区别,便于以后在代码中对照。

工程配置 normal secure normal-banked normal-secure
默认宏配置
CC2530EB
POWER_SAVING
HAL_AES=FALSE
HAL_DMA=FALSE
HAL_FLASH=FALSE
NON_BANKED
FEATURE_ENHANCED_BEACON
FEATURE_GREEN_POWER


CC2530EB
POWER_SAVING
FEATURE_MAC_SECURITY

HAL_FLASH=FALSE

NON_BANKED

FEATURE_ENHANCED_BEACON
FEATURE_GREEN_POWER


CC2530EB
POWER_SAVING
HAL_AES=FALSE
HAL_DMA=FALSE
HAL_FLASH=FALSE

FEATURE_ENHANCED_BEACON
FEATURE_GREEN_POWER


CC2530EB
POWER_SAVING
FEATURE_MAC_SECURITY

HAL_FLASH=FALSE

FEATURE_ENHANCED_BEACON
FEATURE_GREEN_POWER

在MSA的事件处理函数中,通过macCbackEvent_t类型的指针来统一处理接收到的各种不同的数据包。这是怎么做到的呢?原来,macCbackEvent_t是一个枚举类型的变量指针,其原型定义如下:

typedef union
{
  macEventHdr_t                hdr;
  macMlmeAssociateInd_t        associateInd;           /* MAC_MLME_ASSOCIATE_IND */
  macMlmeAssociateCnf_t       associateCnf;           /* MAC_MLME_ASSOCIATE_CNF */
  macMlmeDisassociateInd_t     disassociateInd;    /* MAC_MLME_DISASSOCIATE_IND */
  macMlmeDisassociateCnf_t     disassociateCnf;    /* MAC_MLME_DISASSOCIATE_CNF */
  macMlmeBeaconNotifyInd_t     beaconNotifyInd;       /* MAC_MLME_BEACON_NOTIFY_IND */
  macMlmeOrphanInd_t           orphanInd;             /* MAC_MLME_ORPHAN_IND */
  macMlmeScanCnf_t             scanCnf;               /* MAC_MLME_SCAN_CNF */
  macMlmeStartCnf_t            startCnf;              /* MAC_MLME_START_CNF */
  macMlmeSyncLossInd_t         syncLossInd;           /* MAC_MLME_SYNC_LOSS_IND */
  macMlmePollCnf_t             pollCnf;               /* MAC_MLME_POLL_CNF */
  macMlmePollInd_t             pollInd;               /* MAC_MLME_POLL_IND */
  macMlmeCommStatusInd_t   commStatusInd;         /* MAC_MLME_COMM_STATUS_IND */
  macMcpsDataCnf_t             dataCnf;               /* MAC_MCPS_DATA_CNF */
  macMcpsDataInd_t             dataInd;               /* MAC_MCPS_DATA_IND */
  macMcpsPurgeCnf_t            purgeCnf;              /* MAC_MCPS_PURGE_CNF */
} macCbackEvent_t;

从名字上,应该可以看出什么端倪了吧。对于每一种命令,几乎都有一个IND和CNF。其中,IND应该是指的发出这个命令的事件,而对于的CNF为MAC层完成这个命令后对应用层的确认,简单来理解,IND就是发出去的命令,CNF就是底层完成这个命令后给应用层的确认信息或者底层收到数据时给应用层的信息,(更正了理解,IND和CNF其实都是MAC层根据接收到的命令,而向应用层发送的事件通知,只不过接收命令的来源不同。CNF类型的事件通知是本地MAC接收到本地应用发来的请求,完成时反馈给本地应用层,而IND类型事件通知,是本地MAC接收到外来MAC层发送的请求,处理完后反馈给本地应用层,恩,他们之间就是这个区别,这下应该是没错了,^_^。)以建立连接为例子来说明:

MAC层的SYS_EVENT_MSG回调事件处理共有16个,刚刚好够两个字节的16个位,再多一个状态信息就不行啦。除了SYS_EVENT_MSG之外,还有对于终端设备的轮训请求事件MSA_POLL_EVENT,数据发送事件MSA_SEND_EVENT.

在调用发送数据函数MSA_McpsDataReq,有一个directMsg参数,从名字上,可以大概猜出它的意思,直接发送的信息。根据后面的代码可以得知,当这个参数为真时,协调器直接向终端发送数据,而无需缓存数据等待终端发送poll来请求数据.作为协调器来说,在MAC层空闲时,其接收机要始终保持打开状态,作为终端设备来说,MAC层接收机的设置取决于msa_IsDirectMsg,如果它为真,则需要在MAC层接收机空闲时,保持打开状态。

MAC_CbackEvent函数,是MAC层的回调函数,用于向应用层传递MAC层发生的事件,在这个函数里面,应该要分配OSAL消息空间,拷贝MAC层消息到OSAL的消息结构体来,然后传递给应用层。因为此回调函数可能在任务或者中断上下文中频繁调用,因此需要设计成可重入的。在函数的开头,为了统一不同消息的长度信息,采用一个消息长度数组

在函数的开始,使用

来根据不同的事件类型来分配不同的消息长度,这个做法很好,学习记录下。

从使用说明上来看,对于同一工程来说,程序启动后,它的行为取决于外部的按键,在有任何物理动作之前,只会有对于的闪灯行为。

对于协调器来说,有信标使能和非信标使能两种模式,对于终端设备来说,有直接发送模式和间接发送模式,因此,它们之间两两组合就有4种网络情况。如下表:

好了,今天就先学习到这里,明天继续深入各个代码的执行流程去学习TIMAC层的各个设计思路和流程,为以后的开发奠定基础。

时间: 2024-11-03 19:49:45

TIMAC 学习笔记1的相关文章

TIMAC 学习笔记(二)

昨天大体上熟悉了TIMAC自带的CC2530的示范例程,今天先从演示抓包入手,分析四种不同的配置工程在空中传输的差异.随后,会按照扫描.组网.入网等MAC层接口函数入手,结合IEEE 802.15.4标准规范和能够看到的函数接口代码,来学习MAC的一些操作处理. 前面提到了,例程有四种网络组建方式,分为非信标直接模式,非信标间接模式,信标直接模式,信标间接模式.以下分别来抓包,结合具体代码分析,安全传输模式最后另作分析. 1. 非信标直接模式 对于非信标网络的建立,设备上电开机后,会扫描默认信道

TIMAC 学习笔记(三)

本文主要内容参考 <Security on TI IEEE 802.15.4 Compliant RF Devices>.<Design Note DN108>.<IEEE 802.15.4协议规范>来考察MAC层的安全机制. 1. MAC层安全机制 先简要介绍一下MAC层的帧格式,下图为通用MAC帧类型. 其中的,Frame Control域结构如下: Frame Type表示帧类型,MAC层共有四种类型的帧,信标帧.数据帧.命令帧和确认帧. Security Ena

vector 学习笔记

vector 使用练习: /**************************************** * File Name: vector.cpp * Author: sky0917 * Created Time: 2014年04月27日 11:07:33 ****************************************/ #include <iostream> #include <vector> using namespace std; int main

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则 用了几天时间看了一下开源框架Caliburn.Micro 这是他源码的地址http://caliburnmicro.codeplex.com/ 文档也写的很详细,自己在看它的文档和代码时写了一些demo和笔记,还有它实现的原理记录一下 学习Caliburn.Micro要有MEF和MVVM的基础 先说一下他的命名规则和引导类 以后我会把Caliburn.Micro的 Actions IResult,IHandle ICondu

jQuery学习笔记(一):入门

jQuery学习笔记(一):入门 一.JQuery是什么 JQuery是什么?始终是萦绕在我心中的一个问题: 借鉴网上同学们的总结,可以从以下几个方面观察. 不使用JQuery时获取DOM文本的操作如下: 1 document.getElementById('info').value = 'Hello World!'; 使用JQuery时获取DOM文本操作如下: 1 $('#info').val('Hello World!'); 嗯,可以看出,使用JQuery的优势之一是可以使代码更加简练,使开

[原创]java WEB学习笔记93:Hibernate学习之路---Hibernate 缓存介绍,缓存级别,使用二级缓存的情况,二级缓存的架构集合缓存,二级缓存的并发策略,实现步骤,集合缓存,查询缓存,时间戳缓存

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Activiti 学习笔记记录(三)

上一篇:Activiti 学习笔记记录(二) 导读:上一篇学习了bpmn 画图的常用图形标记.那如何用它们组成一个可用文件呢? 我们知道 bpmn 其实是一个xml 文件

HTML&CSS基础学习笔记8-预格式文本

<pre>标签的主要作用是预格式化文本.被包围在 pre 标签中的文本通常会保留空格和换行符.而文本也会呈现为等宽字体. <pre>标签的一个常见应用就是用来表示计算机的源代码.当然你也可以在你需要在网页中预显示格式时使用它. 会使你的文本换行的标签(例如<h>.<p>)绝不能包含在 <pre> 所定义的块里.尽管有些浏览器会把段落结束标签解释为简单地换行,但是这种行为在所有浏览器上并不都是一样的. 更多学习内容,就在码芽网http://www.

java/android 设计模式学习笔记(14)---外观模式

这篇博客来介绍外观模式(Facade Pattern),外观模式也称为门面模式,它在开发过程中运用频率非常高,尤其是第三方 SDK 基本很大概率都会使用外观模式.通过一个外观类使得整个子系统只有一个统一的高层的接口,这样能够降低用户的使用成本,也对用户屏蔽了很多实现细节.当然,在我们的开发过程中,外观模式也是我们封装 API 的常用手段,例如网络模块.ImageLoader 模块等.其实我们在开发过程中可能已经使用过很多次外观模式,只是没有从理论层面去了解它. 转载请注明出处:http://bl