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种网络情况。如下表:

注意:当终端设备尝试加入信标网络时,它只能是直接模式。为什么呢?深入想一想,既然是信标模式,那么终端设备就会定时与协调器同步信标,这个动作产生的效果就和poll是一样的了,所以,处于此模式下的终端设备是直接模式。

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

TIMAC 学习笔记(一)的更多相关文章

  1. TIMAC 学习笔记(二)

    昨天大体上熟悉了TIMAC自带的CC2530的示范例程,今天先从演示抓包入手,分析四种不同的配置工程在空中传输的差异.随后,会按照扫描.组网.入网等MAC层接口函数入手,结合IEEE 802.15.4 ...

  2. TIMAC 学习笔记(三)

    本文主要内容参考 <Security on TI IEEE 802.15.4 Compliant RF Devices>.<Design Note DN108>.<IEE ...

  3. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  4. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  5. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  6. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  7. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  8. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

  9. CSS学习笔记

    CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...

随机推荐

  1. leetcode || 53、Maximum Subarray

    problem: Find the contiguous subarray within an array (containing at least one number) which has the ...

  2. 【转】Dancing Links精确覆盖问题

    原文链接:http://sqybi.com/works/dlxcn/ (只转载过来一部分,全文请看原文,感觉讲得很好~)正文    精确覆盖问题    解决精确覆盖问题    舞蹈步骤    效率分析 ...

  3. 也来一篇关于Infragistics WPF Report的使用教程 (一)

    前言 Infragistics Report是一款比較灵活的报表控件, 比微软的rdlc控件至少在页面打印上, 页面的控制比較好调整. 这里使用的是Infragistics Ultimate  v14 ...

  4. C链表操作

    #define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <string.h> #include <std ...

  5. 文本编辑器Nano实用快捷键

    一.复制.剪切和粘贴文本 1.行复制.剪切和粘贴 Alt+6:复制光标所在行. Ctrl+K:剪切光标所在行. Ctrl+U:粘贴. 2.自由复制.剪切和粘贴 自由复制: Ctrl+6:设置复制文本的 ...

  6. Scala Error: error while loading Suite, Scala signature Suite has wrong version expected: 5.0 found: 4.1 in Suite.class

    准备给scala项目引入单元测试 <dependency> <groupId>org.scalatest</groupId> <artifactId>s ...

  7. 关于设置android:imeOptions属性无效的解决办法

    在对Android的EditText控件进行设置时,经常会限定一下输入法的属性,设置右下角为完成或者搜索等,一般都会想到android:imeOptions属性,但是仅仅这么设置通常是无效的,还要搭配 ...

  8. Spring与Hibernate、Mybatis整合

    在Web项目中一般会把各个web框架结合在一起使用,比如spring+hibernate,spring+ibatis等,如此以来将其他的框架整合到spring中来,便有些少许的不便,当然spring已 ...

  9. Header 与 Footer 的 DIV 高度固定, 中间内容 DIV高度自适应,内容不满一页时,默认填满屏幕。

    一.需求: 页面布局分三大块: Header Body Footer 1.内容不满一页时,Footer 在屏幕最底部,Body 填充满 Header 与 Footer 中间的部分. 2.当缩小浏览器时 ...

  10. CSS设置行内元素和块级元素的水平居中、垂直居中

    CSS设置行内元素的水平居中 div{text-align:center} /*DIV内的行内元素均会水平居中*/ CSS设置行内元素的垂直居中 div{height:30px; line-heigh ...