⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hh_mac.c

📁 zigbee中心节点源代码
💻 C
字号:

#include "include.h"

//volatile MACTxFrameInfo gMACTxFrameInfo;
//volatile MACRxFrameInfo gMACRxFrameInfo;
MACTxFrameInfo gMACTxFrameInfo;
MACRxFrameInfo gMACRxFrameInfo;
/////////////////////////////////////
//UINT8 adressnum;
///////////////////


UINT8 MCPSDATA_request(WORD macFrameControlField, BYTE dataSeqNumber, WORD panId, WORD destAddr, WORD srcAddr, UINT8 msduLength, BYTE *msdu, BYTE txOption)
{
     // while(gPHYTxFrameInfo.psduStatus);  
      
      gPHYTxFrameInfo.psdu[0] = macFrameControlField;
      gPHYTxFrameInfo.psdu[1] = macFrameControlField >> 8;      
      gPHYTxFrameInfo.psdu[2] = dataSeqNumber;
      gPHYTxFrameInfo.psdu[3] = panId;
      gPHYTxFrameInfo.psdu[4] = panId >> 8;
      gPHYTxFrameInfo.psdu[5] = destAddr;      
      gPHYTxFrameInfo.psdu[6] = destAddr >> 8;
      gPHYTxFrameInfo.psdu[7] = srcAddr;
      gPHYTxFrameInfo.psdu[8] = srcAddr >> 8;      
      for(int i=0;i<msduLength;i++)
      {
            gPHYTxFrameInfo.psdu[i+9] = *(msdu+i);
           
      }
   /* for(int j=0;j<8;j++)
      {
        gPHYTxFrameInfo.psdu[j+msduLength-38] = Timeinfo.time[j];
          
      }
       for(int v=msduLength-30;v<msduLength;v++)
      {
            gPHYTxFrameInfo.psdu[v] = *(msdu+v-8);
           
      }
        */
     /* UINT8 iiii[8];
            for (int l=0;l<8;l++)
              iiii[8]=0;
            for (int v=0;v<8;v++)
            iiii[v]=Timeinfo.time[v];*/
      gPHYTxFrameInfo.psduLength = msduLength + MAC_aDataFrameOverheadSize;
      gPHYTxFrameInfo.psduStatus = TRUE; 
      gMACTxFrameInfo.msduStatus = FALSE;
      
      return PDDATA_request(txOption);
}
//////////////////信标帧的MAC层////////////////////
UINT8 Beacon_MCPSDATA_request(WORD macFrameControlField, BYTE dataSeqNumber, WORD panId, WORD destAddr, WORD srcAddr, UINT8 msduLength, BYTE *msdu, BYTE txOption)
{
      while(gPHYTxFrameInfo.psduStatus);  
      
      gPHYTxFrameInfo.psdu[0] = macFrameControlField;//0x8060
      gPHYTxFrameInfo.psdu[1] = macFrameControlField >> 8;      
      gPHYTxFrameInfo.psdu[2] = dataSeqNumber;//
      gPHYTxFrameInfo.psdu[3] = panId;//协调器的ID0x2420()由于没有实现多跳所有的节点都是同一个ID
      gPHYTxFrameInfo.psdu[4] = panId >> 8;
      //gPHYTxFrameInfo.psdu[5] = BroadAddr;      
      //gPHYTxFrameInfo.psdu[6] = BroadAddr >> 8;
      gPHYTxFrameInfo.psdu[5] = srcAddr;//协调器地址
      gPHYTxFrameInfo.psdu[6] = srcAddr >> 8; 
      /////////////////////超帧定义
      gPHYTxFrameInfo.psdu[7]   = superFrameSpcefication;    //定义超帧长度.活跃长度等0xd39e
      gPHYTxFrameInfo.psdu[8]   = superFrameSpcefication>>8;
      gPHYTxFrameInfo.psdu[9]   = GTSspecificationfield;///说明要发送的目标地址的个数为四个及0x04
      gPHYTxFrameInfo.psdu[10]  = GISdirectionsField;//指明方向全为零 (0x00)因为子节点只发送数据个解调器
      gPHYTxFrameInfo.psdu[11]  = DeviceShortAdressing1;//要发送的目的地址1、2、3、4共四个
      gPHYTxFrameInfo.psdu[12]  = DeviceShortAdressing1>>8;
      gPHYTxFrameInfo.psdu[13]  = GTSstartingSlotAndLength1;//子节点1所得到的实隙开始点和持续的时间长度
      gPHYTxFrameInfo.psdu[14]  = DeviceShortAdressing2;//子节点2的目的地址
      gPHYTxFrameInfo.psdu[15]  = DeviceShortAdressing2>>8; 
      gPHYTxFrameInfo.psdu[16]  = GTSstartingSlotAndLength2;//子节点2所得到的实隙开始点和持续的时间长度
      gPHYTxFrameInfo.psdu[17]  = DeviceShortAdressing3;//子节点3的目的地址
      gPHYTxFrameInfo.psdu[18]  = DeviceShortAdressing3>>8; 
      gPHYTxFrameInfo.psdu[19]  = GTSstartingSlotAndLength3;//子节点3所得到的实隙开始点和持续的时间长度
      gPHYTxFrameInfo.psdu[20]  = DeviceShortAdressing4;//子节点4的目的地址
      gPHYTxFrameInfo.psdu[21]  = DeviceShortAdressing4>>8; 
      gPHYTxFrameInfo.psdu[22]  = GTSstartingSlotAndLength4;//子节点4所得到的实隙开始点和持续的时间长度
      gPHYTxFrameInfo.psdu[23]  = PendingAddressSpecificationField;//待转发的地址数  (因为是星型网络没有转发地址为0x00)
      /////////////以下为信标负载////////
      for(int i=0;i<msduLength-5;i++)
      {
            gPHYTxFrameInfo.psdu[i+24] = msdu[i];
           
      }
/*   for(int j=0;j<8;j++)
      {
        gPHYTxFrameInfo.psdu[j+msduLength-38] = Timeinfo.time[j];
          
      }
       for(int v=msduLength-30;v<msduLength;v++)
      {
            gPHYTxFrameInfo.psdu[v] = *(msdu+v-8);
           
      }
        
      UINT8 iiii[8];
            for (int l=0;l<8;l++)
              iiii[8]=0;
            for (int v=0;v<8;v++)
            iiii[v]=Timeinfo.time[v];*/
      gPHYTxFrameInfo.psduLength = msduLength + MAC_aDataFrameOverheadSize+10;
      gPHYTxFrameInfo.psduStatus = TRUE; 
      gMACTxFrameInfo.msduStatus = FALSE;
      
      return PDDATA_request(txOption);
}


//接收MAC层代码协议,解包
void MCPSDATA_indication(void)
{
        WORD framecontrolfield;         
        framecontrolfield = (gPHYRxFrameInfo.psdu[1] << 8) | gPHYRxFrameInfo.psdu[0];
        BYTE dataseqnumber;
        dataseqnumber = gPHYRxFrameInfo.psdu[2];
        WORD panId;
        panId = (gPHYRxFrameInfo.psdu[4] << 8) | gPHYRxFrameInfo.psdu[3];
        WORD destAddr;
        destAddr = (gPHYRxFrameInfo.psdu[6] << 8) | gPHYRxFrameInfo.psdu[5];
        WORD srcAddr;     
        srcAddr = (gPHYRxFrameInfo.psdu[8] << 8) | gPHYRxFrameInfo.psdu[7];
        BYTE framecheckseq[2];        
        framecheckseq[0] = gPHYRxFrameInfo.psdu[gPHYRxFrameInfo.psduLength - 2];
        framecheckseq[1] = gPHYRxFrameInfo.psdu[gPHYRxFrameInfo.psduLength - 1]; 
        
       
          

        //gMACRxFrameInfo.rssi = framechecksequence[0];       
      if((gPHYRxFrameInfo.psduLength == MAC_aAckFrameSize) && (framecontrolfield == MAC_FCF_ACKNOWLEDGMENT) && (dataseqnumber == gPHYTxFrameInfo.psdu[2]))
        {
              while(gMACRxFrameInfo.ackReceived);
              if(framecheckseq[1] & MAC_FCS_CRCOK)
              {
                    gMACRxFrameInfo.ackReceived = TRUE;
                    gPHYRxFrameInfo.psduStatus = FALSE; 
                   // adressnum++;
                   
              }
              else
              {
                    gPHYRxFrameInfo.psduStatus = FALSE;      
              }
        }
        else if(gPHYRxFrameInfo.psduLength < MAC_aDataFrameOverheadSize)
        {
              gPHYRxFrameInfo.psduStatus = FALSE;
        }
        else 
        {
              //while(gMACRxFrameInfo.msduStatus);
              
              gMACRxFrameInfo.msduLength = gPHYRxFrameInfo.psduLength - MAC_aDataFrameOverheadSize-6;
              /*for(int i=0;i<gMACRxFrameInfo.msduLength-2;i++)//注释掉串口输出
              {
                 TXBUF0  = gPHYRxFrameInfo.psdu[i+17]; 
                 while ((UTCTL0&0x01)==0);
              }*/
             //  FASTSPI_STROBE(CC2420_SFLUSHTX);
            /* for (int i=0;i<gMACRxFrameInfo.msduLength;i++)    
               {
                  =gMACRxFrameInfo.msdu[i];
                  
              }*/
              if(framecheckseq[1] & MAC_FCS_CRCOK)
              {
                    gMACRxFrameInfo.msduStatus = TRUE;
                    gPHYRxFrameInfo.psduStatus = FALSE;
                    //NLDEDATA_indication();                  
              }              
              else
              {
                    gPHYRxFrameInfo.psduStatus = FALSE;      
              }
        }       
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -