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