📄 csma.c
字号:
//----------------------------------------------------//
//-------Institute Of Computing Technology-----------//
//------------Chinese Academic Science---------------//
//-----中国科学院计算技术研究所先进测试技术实验室-----//
//----------------------------------------------------//
/**
* www.wsn.net.cn
* @copyright:nbicc_lpp
* @data:2005.11.22
* @version:0.0.1
* @updata:$
*
*/
#include "top.h"
#define aMaxBE 5
#define macMinBE 3
#define aUnitBackoffPeriod 20
#define macMaxCSMABackoffs 4
#define macAckWaitDuration 120
enum phy_description {
BUSY=0,
BUSY_RX,
BUSY_TX,
FORCE_TRX_OFF,
IDLE,
PHY_INVALID_PARAMETER,
RX_ON,
PHY_SUCCESS,
TRX_OFF,
TX_ON,
PHY_UNSUPPORTED_ATTRIBUTE,
Failure
};
void timer2_inital(void)
{
{ os_atomic_t _nesc_atomic = os_atomic_start();
{
TIMSK &= ~(1 << 7);
TIMSK &= ~(1 << 6);
TCCR2 = 0x0c;//scale is 256==2symbols,CTC mode,FOC2=0,
TCNT2 = 0;
//OCR2 = interval;
//TIMSK |= 1 << 7 不开中断
}
os_atomic_end(_nesc_atomic); }
}
void waitforbackoff(uint8_t num)
{
uint8_t temp=num;
OCR2=10;
while(temp>0)
{
TCNT2 = 0;
TIFR |=0x80;
while(!(TIFR&0x80));
temp--;
}
}
uint8_t CSMA_CA(uint8_t psdulength,uint8_t * psdu)
{
uint8_t NB,BE,CW,random_num,stats;
Is_CSMA=1;
stats=0;
NB=0;
BE=macMinBE;
random_num=0;
cc2420_writetxfifo(psdulength-1,psdu);//因为不包括长度字节本身,需要在其前面先送进长度字节
while (NB<macMaxCSMABackoffs)
{
CW=(1<<BE)-1;
random_num=random()%CW;
printf("\nNB is %d,BE is %d\n",NB,BE);
//{ os_atomic_t _nesc_atomic = os_atomic_start();
//{
if (random_num==0)
{
printf("random_num is 0");
cc2420_sendcmd(cc2420_STXONCCA);
}
else
{
printf("random_num is %d",random_num);
waitforbackoff(random_num);
cc2420_sendcmd(cc2420_STXONCCA);
}
//then TX_ACTIVE
stats=cc2420_sendcmd(cc2420_SNOP);
//}os_atomic_end(_nesc_atomic); }
if (stats&0x08)
{
Is_CSMA=0;
return PHY_SUCCESS;
}
NB++;
BE++;
BE=((BE<aMaxBE)?BE:aMaxBE);
}
Is_CSMA=0;
return Failure;
}
//---------------------------------------------------------
int main(void)
{
uint8_t csma_result;
demo_datapacket _demopacket;
OS_SET_PIN_DIRECTIONS();
Leds_greenOn();
Leds_redOn();
Leds_yellowOn();
IoInit();
OS_sched_init();
cc2420_init();
os_atomic_enable_interrupt();
cc2420_setchnl(11);
cc2420_setrxmode();
cc2420_enableAddrDecode();
cc2420_setpanid(0x0001);
cc2420_setshortaddress(0x0000);
cc2420_enablefifop();
timer2_inital();
printf("\nbegin experimnet CSMA/CA,send 100 packets to sink\n");
//------------------------------------------------------
des_address=0x01;
source_address=0x00;
//des_address=0x00;
//source_address=0x01;
demopacket=&_demopacket;
//demopacket=malloc(sizeof(demo_datapacket));
demopacket->length=0x0f;
demopacket->fcf=0x8841;
demopacket->dsn=0x01;
demopacket->address.destination_pan=0x0001;
demopacket->address.destination_address=des_address;
demopacket->address.source_pan=0x0001;
demopacket->address.source_address=source_address;
demopacket->payload=0x1234;
csma_result=0;
Is_CSMA=0;
//-------------------------------------------------------
//-----------
while(1) {
csma_result=CSMA_CA(demopacket->length,(uint8_t *) demopacket);
//for (uint16_t i=0;i<60000;i++)
//for (uint16_t i=0;i<2;i++)
;
OS_run_task();
Leds_greenToggle();
if (csma_result==PHY_SUCCESS)
printf("\ncsma/ca is success!\n");
else if (csma_result==Failure)
printf("\ncsma/ca is failure!\n");
else
printf("\nsomething is wrong!\n");
(demopacket->dsn)++;
};
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -