📄 hh_mac.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 + -