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

📄 csma.c

📁 csma-ca 算法的源代码
💻 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 + -