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

📄 hh_mac.c

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

#include "include.h"

//volatile MACTxFrameInfo gMACTxFrameInfo;
//volatile MACRxFrameInfo gMACRxFrameInfo;
MACTxFrameInfo gMACTxFrameInfo;
MACRxFrameInfo gMACRxFrameInfo;
StandardtimeSoure receivedtimeinfo;
///////////////////////////////
UINT32 templocaltime;UINT64 temp1,temp2;
extern BYTE HHY_FLAG;
BYTE numflag=0;
////////////////////////////
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);
           
      }
    
      gPHYTxFrameInfo.psduLength = msduLength + MAC_aDataFrameOverheadSize;///=108+11=119
      gPHYTxFrameInfo.psduStatus = TRUE; 
      gMACTxFrameInfo.msduStatus = FALSE; 
      
      return PDDATA_request(txOption);
}


void MCPSDATA_indication(void)
{
        WORD framecontrolfield; 
        UINT64 sendingtime,turnonRFtime;
        
      
       // UINT8 temp[8],temp1[8],  Instancetime1[8];
 
        
        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; 
              }
              else
              {
                   gPHYRxFrameInfo.psduStatus = FALSE;      
              }
        }
        else if(gPHYRxFrameInfo.psduLength < MAC_aDataFrameOverheadSize)
        {
              gPHYRxFrameInfo.psduStatus = FALSE;
        }
        else 
        {
              while(gMACRxFrameInfo.msduStatus);
              
              gMACRxFrameInfo.msduLength = gPHYRxFrameInfo.psduLength - MAC_aDataFrameOverheadSize;
              for(int i=0;i<gMACRxFrameInfo.msduLength;i++)
              {
                 gMACRxFrameInfo.msdu[i] = gPHYRxFrameInfo.psdu[i+9];
              }
              
   /////// ////////////store the received time and convert the time format ////////////////
              for (int j=0;j<8;j++)
              {
                 receivedtimeinfo.time[j] =  gPHYRxFrameInfo.psdu[j+34];
              }
              receivedtimeinfo.retime=convert_time_format64(receivedtimeinfo.time); 
              Timelinearity.LocalTime=Timeinfo.specialtime;//(add)
 /************************************************************************************/
              sendingtime  = receivedtimeinfo.retime + 46200;
              turnonRFtime = receivedtimeinfo.retime + 80000;
        
 /*************************************************************************************/
  
         if (framecontrolfield == 0x8040) 
          {
             receivedtimeinfo.n++;
             if (receivedtimeinfo.n>=10)//(add)
              numflag=1;
            
             changelocaltime1();
             calculatefuction();//计算回归参数
            
             //  FASTSPI_STROBE(CC2420_STXON); 
              // FASTSPI_STROBE(CC2420_SFLUSHTX);
                   // //test pro
              // = sendingtime-temp1;
             //  turnonRFtime- temp1;
    //////// 等待发送时隙的到来(在这里需要较高的时间同步,如果没有可能造成时隙相互占用)///
               while (!(sendingtime -20<Timeinfo.specialtime && Timeinfo.specialtime <sendingtime +20 ) );
               
               SET_VREG_ACTIVE();//test
               basicRfInit(26, 0x2420, 0x5678);//配置数据(add)
                
               basicRfReceiveOn();
               //temp1 = Timeinfo.specialtime;(dele)
               send_ADCdata_to_coordinator();//发送采集的数据//////////////////////
              
               SET_VREG_INACTIVE()  ;
               FASTSPI_STROBE(CC2420_SXOSCOFF); //关闭射频(add)
               halWait(1000);//(add)
               //temp2 = Timeinfo.specialtime; 
               //templocaltime  = temp2-temp1;
             // TXBUF0 =templocaltime>>8;
              //while ((UTCTL0&0x01)==0);
              //TXBUF0 =templocaltime  ;
             // while ((UTCTL0&0x01)==0);
             
             
               while (!( turnonRFtime-10 < Timeinfo.specialtime && Timeinfo.specialtime < turnonRFtime+ 10 ) );
                 
               SET_VREG_ACTIVE();
             basicRfInit(26, 0x2420, 0x5678);//配置数据(add)
              FASTSPI_STROBE(CC2420_SXOSCON); //(add)
              
              halRfWaitForCrystalOscillator(); //(add)
               basicRfReceiveOn();  //打开射频接收 
               HHY_FLAG=0;
               
             
   ///////////////////////////////////////////////////////////////////////////////////
 
               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 + -