原创 【原创】ZigBee学习之10——MAC层API解读

2010-2-5 11:20 3870 3 4 分类: 通信

其实也算不上什么解读拉,基本上是把官方的文档翻译了一下。在Zigbee中,是分层结构的,这样做有很多的好处,每一层只负责自己的东西,数据传输更加透明和有效,好了闲话不说,我们开始解读MAC层API,当然是针对Z-Stack的,呵呵


MAC API[802.15.4 MAC API _F8W-2005-1503_.pdf]<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


常量和结构体


typedef uint8 sAddrExt_t[8];


 


typedef struct


{


  union


  {


    uint16      shortAddr;


    sAddrExt_t  extAddr;


  } addr;


  uint8         addrMode;


} sAddr_t;


shortAddr       - 16位MAC 短地址


extAddr     - 64位MAC 扩展地址


addrMode        - 地址模式


    SADDR_MODE_NONE     - 地址不存在


    SADDR_MODE_SHORT    - 使用16位短地址


    SADDR_MODE_EXT  - 使用64位扩展地址  


状态值


    标准状态值


MAC_SUCCESS             操作成功


MAC_BEACON_LOSS         同步请求中丢失信标


MAC_CHANNEL_ACCESS_FAILURE 由于通道活跃,数据请求失败


MAC_COUNTER_ERROR       接收到的帧的发送源的帧计数器不可用


MAC_DENIED          MAC不能进入低功耗模式


MAC_FRAME_TOO_LONG      接收到的帧或者操作产生的帧或数据请求太长


MAC_IMPROPER_KEY_TYPE  接收到的帧的发送源的KEY不可用


MAC_IMPROPER_SECURITY_LEVEL 接收到的帧的发送源安全等级和最低等级不匹配


MAC_INVALID_ADDRESS     由于没有源地址或目的地址,数据请求失败


MAC_INVALID_HANDLE      清除请求包含不可用的处理


MAC_INVALID_PARAMETER  API函数参数超出范围


MAC_LIMIT_REACHED       由于PAN描述储存达到界限,扫描中止


MAC_NO_ACK          由于没有收到应答,操作或数据请求失败


MAC_NO_BEACON           由于没有收到信标,扫描请求失败


MAC_NO_DATA             由于没有收到关联应答,关联请求失败


MAC_NO_SHORT_ADDRESS        开始请求的短地址错误


MAC_PAN_ID_CONFLICT     检测到一个PAN ID冲突


MAC_READ_ONLY           拥有只读标记的请求


MAC_REALIGNMENT         接收到协调器重排列


MAC_SCAN_IN_PROGRESS    扫描正在进行,新的扫描请求失败


MAC_SECURITY_ERROR      接收到的安全帧密码处理失败


MAC_SUPERFRAME_OVERLAP  信标开始时间超出协调器传输时间


MAC_TRACKING_OFF        没有找到其协调器的信标,开始请求失败


MAC_TRANSACTION_EXPIRED 关联应答,解关联请求,间接数据传输失败


MAC_TRANSACTION_OVERFLOW    数据缓存溢出,操作失败 


MAC_UNAVAILABLE_KEY     安全密钥不可用


MAC_UNSUPPORTED_ATTRIBUTE   由于不支持的特性指令或请求失败


MAC_UNSUPPORTED_LEGACY  不支持的安全方式


MAC_UNSUPPORTED_SECURITY    接收到的帧的安全方式不支持


    私有状态值


MAC_UNSUPPORTED         当前配置不支持的操作


MAC_BAD_STATE           当前状态不支持的操作


MAC_NO_RESOURCES        内存资源不足


    MAC时间值


aBaseSuperframeDuration     构成超帧的符号周期           960 15.36ms(2.4G)


aUnitBackoffPeriod      构成CSMA-CA算法的时间周期的符号周期   20  320us(2.4G)


初始化接口


初始化接口函数都是直接执行函数


void MAC_Init(void)


初始化MAC子系统


void MAC_InitDevice(void)


初始化MAC关联到一个非信标网络,使用此函数初始化一个RFD设备,如果使用此函数,要在调用其它数据和管理API之前调用


void MAC_InitCoord(void)


初始化MAC能进行协调器的操作。此函数用来初始化一个FFD设备,要在调用其它数据和管理API之前调用


void MAC_InitSecurity(void)


使MAC能使用安全功能,要在调用其它数据和管理API之前调用


void MAC_InitBeaconCoord(void)


初始化MAC在信标网络中能进行协调器的操作。此函数要在调用其它数据和管理API之前调用


void MAC_InitBeaconDevice(void)


初始化MAC能关联到一个信标网络,此函数要在调用其它数据和管理API之前调用


提供一些ZigBee的配置事例,其他的网络配置请看TI的文档


ZigBee节点设备           ZigBee路由器        ZigBee协调器


MAC_InitDevice();       MAC_InitDevice();       MAC_InitCoord();


                MAC_InitCoord();


数据接口


MAC层用来发送和接收数据的API


数据结构


typedef struct 


{


  uint8     *p;


  uint8     len;


} sData_t;


p 指向数据


len 数据的字节长度


数据常量


MAC_MAX_FRAME_SIZE  102         不包含安全域的最大数据长度


MAC_DATA_OFFSET     24      MAC头要求的数据偏移


MAC_ENC_OFFSET 5       加密头要求的数据偏移


MAC_MIC_32_LEN 4       32位认证代码要求的长度


MAC_MIC_64_LEN  8       64位认证代码要求的长度


MAC_MIC_128_LEN     16      128位认证代码要求的长度


void MAC_McpsDataReq(macMcpsDataReq_t *pData)


将应用数据发送到MAC。若MAC拥堵或者不能接受数据请求则发送状态为MAC_TRANSACTION_OVERFLOW的MAC_MCPS_DATA_CNF,最终MAC将变得不拥堵并且为一个缓存的请求发送MAC_MCPS_DATA_CNF。所以应用能在任何时候发送数据,只是数据将被队列。


应用必须分配一定字节的缓存,数目是:MAC_DATA_OFFSET+MAC_ENC_OFFSET(如果使用加密安全)。可用使用MAC_McpsDataAlloc()来方便准确的分配这个缓存。最大的数据帧长度为MAC_MAX_FRAME_SIZE,如果使用加密安全,则还要减去MAC_ENC_OFFSET及其相关的加密代码区域:比如使用AES-MIC128,则最大的数据帧长度为:max = MAC_MAX_FRAME_SIZE - MAC_ENC_OFFSET MAC_MIC_128_LEN;


参数:


typedef struct


{


  sAddr_t         dstAddr;


  uint16          dstPanId;


  uint8           srcAddrMode;


  uint8           mdsuHandle;


  uint8           txOptions;


  uint8           channel;


  uint8           power;


} macDataReq_t;


 


typedef struct


{


  macEventHdr_t   hdr;     


  sData_t         msdu;     


  macTxIntData_t  internal;


  macSec_t        sec;


  macDataReq_t    mac;     


} macMcpsDataReq_t;


hdr和internal是内部使用的,mac.mdsuHandle是应用定义的关于数据请求的句柄值,mac.txOptions为TX参数位掩码,有以下一些值,其他的都很好理解了。


MAC_TXOPTION_ACK        应答传输。如果没有收到应答将重传


MAC_TXOPTION_GTS        GTS传输(unused).


MAC_TXOPTION_INDIRECT   间接传输。MAC将队列数据等待目标设备请求此数据。只有协调器才可用这种方式


MAC_TXOPTION_NO_RETRANS 无中继传输。


MAC_TXOPTION_NO_CNF     无确认。这将阻止为此帧发送MAC_MCPS_DATA_CNF事件


MAC_TXOPTION_ALT_BE  Use PIB value MAC_ALT_BE for the minimum backoff exponent.


MAC_TXOPTION_PWR_CHAN   用macDataReq_t结构中的电源和通道值而不用PIB中的值来传输


void MAC_McpsPurgeReq(uint8 msduHandle)


从MAC数据队列中清空并丢弃数据请求,当完成操作后MAC发送MAC_MCPS_PURGE_CNF


macMcpsDataReq_t *MAC_McpsDataAlloc(uint8 len, uint8 securityLevel, uint8 keyIdMode)


如果用此函数分配了MAC_McpsDataReq()所需的数据缓存,在收到MAC_MCPS_DATA_CNF后要通过osal_msg_deallocate(pBuffer)来释放。若不使用安全则设置securityLevel和keyIdMode为MAC_SEC_LEVEL_NONE和MAC_KEY_ID_MODE_NONE


回调函数事件


这些回调函数由应用调用,用来将事件或者数据从MAC传到应用。


MAC_MCPS_DATA_IND


从MAC发送数据到应用。这个事件的参数指向一个动态分配的缓存,当应用用完数据后必须调用osal_msg_deallocate(pData)来释放缓存。MAC还能为应用定义的数据分配额外的空间,应用定义的数据的大小由MAC_MlmeSetReq()的属性MAC_DATA_IND_OFFSET设置。


参数:


typedef struct


{


  sAddr_t       srcAddr;


  sAddr_t       dstAddr;


  uint32        timestamp;


  uint16        timestamp2;


  uint16        srcPanId;


  uint16        dstPanId;


  uint8         mpduLinkQuality;


  uint8         correlation;


  uint8         rssi;


  uint8         dsn;


} macDataInd_t;


 


typedef struct 


{


  macEventHdr_t  hdr;


  sData_t        msdu;


  macRxIntData_t internal;


  macSec_t       sec;


  macDataInd_t   mac;


} macMcpsDataInd_t;


mac.timestamp 接收到帧的时间,单位为aUnitBackoffPeriod


mac.timestamp2 接收到帧的时间,单位为内部MAC定时器单元


mac.correlation The raw correlation value of the received data frame.  This value depends on the radio.  See the chip data sheet for details.


dsn 接收到的帧的数据序列


MAC_MCPS_DATA_CNF


每当调用MAC_McpsDataReq()时就会向应用发送这个事件,这个事件返回数据请求的状态这个事件同样返回指向数据缓存的指针,应用能利用这个指针来释放空间。


typedef struct


{


  macEventHdr_t      hdr;


  uint8              msduHandle;


  macMcpsDataReq_t   *pDataReq;


  uint32             timestamp;


  uint16             timestamp2;


} macMcpsDataCnf_t;


hdr.status有如下的值


MAC_SUCCESS             操作成功


MAC_CHANNEL_ACCESS_FAILURE  通道繁忙,请求失败


MAC_FRAME_TOO_LONG      数据太长


MAC_INVALID_PARAMETER   参数超出范围


MAC_NO_ACK          没有收到应答


MAC_TRANSACTION_EXPIRED 传输期到没有收到响应


MAC_TRANSACTION_OVERFLOW    数据buffer溢出


MAC_MCPS_PURGE_CNF


当调用MAC_McpsPurgeReq()时向应用发送这一事件


typedef struct


{


  macEventHdr_t      hdr;


  uint8              msduHandle;


} macMcpsPurgeCnf_t;


hdr.status  - 清空请求的状态


    MAC_SUCCESS         成功


    MAC_INVALID_HANDLE      清空请求包含不可用的处理


管理接口


通用常量和数据结构


通道掩码


MAC_CHAN_11_MASK - MAC_CHAN_28_MASK 通道11到28的掩码


比如要使用通道11,12,23则:uint32 chan = MAC_CHAN_11_MASK | MAC_CHAN_12_MASK | MAC_CHAN_23_MASK;


通道


MAC_CHAN_11 - MAC_CHAN_28   通道11到28


通道页


2.4G只用通道0页MAC_CHANNEL_PAGE_0


性能信息


这些掩码指示了器件的性能信息,在关联操作中将用到这些信息


MAC_CAPABLE_PAN_COORD       器件可以作为PAN协调器


MAC_CAPABLE_FFD         器件是FFD


MAC_CAPABLE_MAINS_POWER     器件用的是主干线而不是电池


MAC_CAPABLE_RX_ON_IDLE      空闲时也打开接收


MAC_CAPABLE_SECURITY            能够发送和接收安全帧


MAC_CAPABLE_ALLOC_ADDR      在关联工程中请求分配短地址


属性


可用通过 MAC_MlmeGetReq()和MAC_MlmeSetReq()来读取和设置,实在是太都了,大家看文档把。


超帧协议


MAC_SFS_BEACON_ORDER(s)         返回信标顺序


MAC_SFS_SUPERFRAME_ORDER(s)     返回超帧顺序


MAC_SFS_FINAL_CAP_SLOT(s)       返回最后的CAP槽


MAC_SFS_BLE(s)          返回电池延寿位


MAC_SFS_PAN_COORDINATOR(s)      返回PAN协调器位


MAC_SFS_ASSOCIATION_PERMIT(s)   返回关联许可位


void MAC_MlmeAssociateReq(macMlmeAssociateReq_t *pData)


向协调器发送关联请求,当请求完成后MAC发送MAC_MLME_ASSOCIATE_CNF给应用


参数:


typedef struct 


{


  uint8         logicalChannel;


  uint8         channelPage;


  sAddr_t       coordAddress;


  uint16        coordPanId;


  uint8         capabilityInformation;


  macSec_t      sec;


} macMlmeAssociateReq_t;


void MAC_MlmeAssociateRsp(macMlmeAssociateRsp_t *pData)


给发送关联请求的设备发送应答,在接收到 MAC_MLME_ASSOCIATE_IND后应该调用此函数,当答复完成后MAC将发送MAC_MLME_COMM_STATUS_IND


typedef struct 


{


  sAddrExt_t       deviceAddress;


  uint16           assocShortAddress;


  uint8            status;


  macSec_t         sec;


} macMlmeAssociateRsp_t;


assocShortAddress 分配给器件的短地址,只有关联成功且器件请求短地址时才会设置此值


void MAC_MlmeDisassociateReq(macMlmeDisassociateReq_t *pData)


已关联的设备通知协调器脱离PAN,或者是协调器指示一个已关联设备脱离PAN,解关联完成后MAC发送 MAC_MLME_DISASSOCIATE_CNF


typedef struct 


{


  sAddr_t          deviceAddress;


  uint16           devicePanId;


  uint8            disassociateReason;


  bool             txIndirect;


  macSec_t         sec;


} macMlmeDisassociateReq_t;


uint8 MAC_MlmeGetReq(uint8 pibAttribute, void *pValue)


从MAC PIB取得属性


pibAttribute    属性项


pValue      指向属性值的指针


返回值:


MAC_SUCCESS             操作成功


MAC_UNSUPPORTED_ATTRIBUTE   没有找到对应的属性


void MAC_MlmeOrphanRsp(macMlmeOrphanRsp_t *pData)


回应节点的orphan宣告


void MAC_MlmePollReq(macMlmePollReq_t *pData)


从协调器请求未决数据,当完成后MAC发送MAC_MLME_POLL_CNF和MAC_MCPS_DATA_IND


typedef struct 


{


  sAddr_t          coordAddress;


  uint16           coordPanId;


  macSec_t         sec;


} macMlmePollReq_t;


uint8 MAC_MlmeResetReq(bool setDefaultPib)


重置MAC,在系统启动时,这个函数必须被调用一次,并且用设置setDefaultPib为true用MAC PIB作为默认值


void MAC_MlmeScanReq(macMlmeScanReq_t *pData)


能量检测,激活或失活扫描,在扫描器期间器件不能执行其他的MAC管理操作,也不能收发MAC数据


typedef struct 


{


  uint32           scanChannels;


  uint8            scanType;


  uint8            scanDuration;


  uint8            channelPage;


  uint8            maxResults;


  macSec_t         sec;


  {


    uint8         *pEnergyDetect;


    macPanDesc_t  *pPanDescriptor;


  } result;


} macMlmeScanReq_t;


uint8 MAC_MlmeSetReq(uint8 pibAttribute, void *pValue)


设置属性值到MAC PIB中


返回值:


MAC_SUCCESS          操作成功


MAC_UNSUPPORTED_ATTRIBUTE   不支持的属性


MAC_INVALID_PARAMETER       值越界


MAC_READ_ONLY           属性为只读


void MAC_MlmeStartReq(macMlmeStartReq_t *pData)


协调器或者PAN协调器调用此函数开始或者重新配置一个网络。在开始一个网络前,器件必须设置短地址,PAN协调器通过设置属性MAC_SHORT_ADDRESS来设置短地址,协调器通过关联设置短地址。


typedef struct 


{


  uint32           startTime;


  uint16           panId;


  uint8            logicalChannel;


  uint8            channelPage;


  uint8            beaconOrder;


  uint8            superframeOrder;


  bool             panCoordinator;


  bool             batteryLifeExt;


  bool             coordRealignment;


  macSec_t         realignSec;


  macSec_t         beaconSec;


} macMlmeStartReq_t;


startTime   - 开始传输信标的时间,若是PAN协调器或者是非信标网络则忽略此项


panId       - 如果panCoordinator为FALSE则忽略此项


logicalChannel  - 如果panCoordinator为FALSE则忽略此项


channelPage - 如果panCoordinator为FALSE则忽略此项


beaconOrder - 计算信标帧间隔的指数,对于非信标帧则设为15


superframeOrder-用来计算超帧时间,非信标网络忽略此项


batteryLifeExt- 若设为真,则MAC_BATT_LIFE_EXT_PERIODS完全信标帧帧间后的完全backoff期间,关闭接收,非信标网络忽略此项


coordRealignment-当设为真时在改变超帧前发送协调器重列


void MAC_MlmeSyncReq(macMlmeSyncReq_t *pData)


请求MAC通过信标统协调器同步,推荐在和信标网络关联前和协调器同步,如果信标不能被定为,则MAC向应用发送包含MAC_BEACON_LOSS状态的MAC_MLME_SYNC_LOSS_IND。在调用这个函数前必须设置用来同步的协调器的地址。MAC成功同步以后将发送MAC_MLME_BEACON_NOTIFY_IND,应用在收到这个事件后将设置MAC_AUTO_REQUEST为真用来停止接收信标宣言。


typedef struct 


{


  uint8            logicalChannel;


  uint8            channelPage;


  bool             trackBeacon;


} macMlmeSyncReq_t;


trackBeacon     - 设置为真将继续跟踪同步信标后的其他信标,设为假则只用第一个信标同步。如果已开始跟踪,设为FALSE则停止跟踪。


 


今天先来这么多,剩下的部分我再研究研究以后再发生来,呵呵

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户377235 2015-4-18 19:54

写的很详细了,谢谢

相关推荐阅读
huotingtu_505472073 2014-01-12 22:18
嵌入式程序员面试问题集锦
这个测试适于不同水平的应试者,大多数初级水平的应试者的成绩会很差,经验丰富的程序员应该有很好的成绩。为了让你能自己决定某些问题的偏好,每个问题没有分配分数,如果选择这些考题为你所用,请自行按你的意...
huotingtu_505472073 2011-04-14 23:24
【转】一种实用的步进电机驱动电路
1 引言步进电动机是一种将电脉冲信号转换成角位移或线位移的精密执行元件,由于步进电机具有控制方便、体积小等特点,所以在数控系统、自动生产线、自动化仪表、绘图机和计算机外围设备中得到广泛应用。微电子学的...
huotingtu_505472073 2011-04-14 23:22
【转】几种微型电机驱动电路分析
 以下所述电路用于3V供电的微型直流电机的驱动,这种电机有两根引线,更换两根引线的极性,电机换向。该驱动电路要求能进行正反转和停止控制。 电路一: 如下图所示,这电路是作者最初设计的电路,P1.3、P...
huotingtu_505472073 2011-02-18 19:57
【转】集成运放组成的电压比较器
1. 功能及应用:主要用来判断输入信号电位之间的相对大小,它至少有两个输入端及一个输出端,通常用一个输入端接被比较信号Ui,另一个则接基准电压VR 定门限电压(或称阀值)的UT。输出通常仅且仅有二...
huotingtu_505472073 2011-01-26 08:05
【转】直流无刷电动机工作原理与控制方法12
研究结果表明,在半导体薄片上产生的霍尔电动势E可用下式表示: 式中RH ——霍尔系数(  );IH——控制电流(A);B——磁感应强度(T);d——薄片厚度(m);p——材料电阻率(Ω*s);...
huotingtu_505472073 2011-01-26 07:55
【转】直流无刷电动机工作原理与控制方法1
序言   由于直流无刷电动机既具有交流电动机的结构简单、运行可靠、维护方便等一系列优点,又具备直流电动机的运行效率高、无励磁损耗以及调速性能好等诸多优点,故在当今国民经济各领域应用日益普及。   一个...
EE直播间
更多
我要评论
1
3
关闭 站长推荐上一条 /3 下一条