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

📄 cc2420receivep.nc

📁 tinyos2.0版本驱动
💻 NC
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright *   notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright *   notice, this list of conditions and the following disclaimer in the *   documentation and/or other materials provided with the *   distribution. * - Neither the name of the Arch Rock Corporation nor the names of *   its contributors may be used to endorse or promote products derived *   from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE *//** * @author Jonathan Hui <jhui@archrock.com> * @author David Moss * @author Jung Il Choi * @version $Revision: 1.1 $ $Date: 2008/02/11 17:41:25 $ */ #include "printfUART.h"#include "frame_format.h"#include "mac_func.h"module CC2420ReceiveP {  provides interface Init;  provides interface StdControl;  //provides interface CC2420Receive;  //provides interface Receive;  //provides interface ReceiveIndicator as PacketIndicator;  provides interface Receiveframe;    provides interface AddressFilter;  uses interface GeneralIO as CSN;  uses interface GeneralIO as FIFO;  uses interface GeneralIO as FIFOP;  uses interface GpioInterrupt as InterruptFIFOP;  uses interface Resource as SpiResource;  uses interface CC2420Fifo as RXFIFO;  uses interface CC2420Strobe as SACK;  uses interface CC2420Strobe as SFLUSHRX;  //uses interface CC2420Packet;  //uses interface CC2420PacketBody;  uses interface CC2420Config;    uses interface Leds;          }implementation {typedef enum{	S_STOPPED =0,	S_STARTED=1,	S_RX_LENGTH=2,	S_RX_FC=3, //FC - FRAME CONTROL	S_RX_ADDR=4,	S_RX_PAYLOAD=5,	S_RX_DISCARD=6,}cc2420_receive_state_t;/*  typedef enum {    S_STOPPED,    S_STARTED,    S_RX_LENGTH,    S_RX_FCF,    S_RX_PAYLOAD,  } cc2420_receive_state_t;  */  enum {    RXFIFO_SIZE = 128,    TIMESTAMP_QUEUE_SIZE = 8,    SACK_HEADER_LENGTH = 7,  };    //uint16_t m_timestamp_queue[ TIMESTAMP_QUEUE_SIZE ];    //uint8_t m_timestamp_head;    //uint8_t m_timestamp_size;    /** Number of packets we missed because we were doing something else */  uint8_t m_missed_packets;    /** TRUE if we are receiving a valid packet into the stack */ bool receivingPacket;    /** The length of the frame we're currently receiving */  norace uint8_t rxFrameLength;    //number of bytes left in the FIFO Buffer  norace uint8_t m_bytes_left;    //norace message_t* m_p_rx_buf;  //message_t m_rx_buf;    //already used  //cc2420_receive_state_t m_state;      norace MPDU rxmpdu;  MPDU *rxmpdu_ptr;       cc2420_receive_state_t m_state;     uint8_t rssi;      uint8_t receive_count=0;      /*******************************************//****	ADDRESS DECODE VARIABLES		****//*******************************************/	//address verification frame control variables	//frame control variables	uint8_t source_address=0;	uint8_t destination_address=0;	//address verification structure pointers	dest_short *dest_short_ptr;	dest_long *dest_long_ptr;	source_short *source_short_ptr;	source_long *source_long_ptr;	beacon_addr_short *beacon_addr_short_ptr;	uint8_t address_decode = 1;	//address verification variables	uint16_t ver_macCoordShortAddress = 0x0000;	uint16_t ver_macShortAddress = 0xffff;		uint32_t ver_aExtendedAddress0=0x00000000;	uint32_t ver_aExtendedAddress1=0x00000000;  	uint16_t ver_macPANId=0xffff;          /***************** Prototypes ****************/  void reset_state();  void beginReceive();  void receive();  void waitForNextPacket();  void flush();   // task void receiveDone_task();    /***************** Init Commands ****************/  command error_t Init.init() {    //m_p_rx_buf = &m_rx_buf;		rxmpdu_ptr = &rxmpdu;		  printfUART_init();	    return SUCCESS;  }  /***************** StdControl ****************/  command error_t StdControl.start() {       atomic {      reset_state();      m_state = S_STARTED;      atomic receivingPacket = FALSE;      call InterruptFIFOP.enableFallingEdge();    }		    return SUCCESS;  }    command error_t StdControl.stop() {    atomic {      m_state = S_STOPPED;      reset_state();      call CSN.set();      call InterruptFIFOP.disable();    }    return SUCCESS;  }	command error_t AddressFilter.set_address(uint16_t mac_short_address, uint32_t mac_extended0, uint32_t mac_extended1)	{				ver_macShortAddress = mac_short_address;		ver_aExtendedAddress0=mac_extended0;		ver_aExtendedAddress1=mac_extended1;		address_decode = 1;		//printfUART("sa %i %x %x %x %x\n",address_decode,ver_macShortAddress,ver_aExtendedAddress0,ver_aExtendedAddress1);		return SUCCESS;	}	  	  	command error_t AddressFilter.set_coord_address(uint16_t mac_coord_address, uint16_t mac_panid)	{   		ver_macCoordShortAddress = mac_coord_address;		ver_macPANId = mac_panid;		//printfUART("sca %i %x %x\n",address_decode,ver_macCoordShortAddress,ver_macPANId);		return SUCCESS;	}      	command error_t AddressFilter.enable_address_decode(uint8_t enable)	{			address_decode = enable;				//printfUART("ead %i\n",address_decode);			return SUCCESS;	}	  /***************** Receive Commands ****************/  /*  command void* Receive.getPayload(message_t* m, uint8_t* len) {      if (len != NULL) {      *len = ((uint8_t*) (call CC2420PacketBody.getHeader( m_p_rx_buf )))[0];    }    return m->data;  }  command uint8_t Receive.payloadLength(message_t* m) {    uint8_t* buf = (uint8_t*)(call CC2420PacketBody.getHeader( m_p_rx_buf ));    return buf[0];  }    */  /***************** CC2420Receive Commands ****************/  /**   * Start frame delimiter signifies the beginning/end of a packet   * See the CC2420 datasheet for details.   */   /*  async command void CC2420Receive.sfd( uint16_t time ) {      if ( m_timestamp_size < TIMESTAMP_QUEUE_SIZE ) {      uint8_t tail =  ( ( m_timestamp_head + m_timestamp_size ) %                         TIMESTAMP_QUEUE_SIZE );      m_timestamp_queue[ tail ] = time;      m_timestamp_size++;    }	  }  async command void CC2420Receive.sfd_dropped() {      if ( m_timestamp_size ) {      m_timestamp_size--;    }	  }*/  /***************** PacketIndicator Commands ****************/  /*  command bool PacketIndicator.isReceiving() {    bool receiving;    atomic {      receiving = receivingPacket;    }    return receiving;  }    */  /***************** InterruptFIFOP Events ****************/  async event void InterruptFIFOP.fired() {    ////printfUART("Int %i\n",m_state);//call Leds.led1Toggle();  //call Leds.led2Toggle();    		if ( m_state == S_STARTED ) {		      beginReceive();	  	  	  /*	if(call SpiResource.isOwner()) {      receive();          } else if (call SpiResource.immediateRequest() == SUCCESS) {      receive();          } else {      call SpiResource.request();    }*/    } else {      m_missed_packets++;    }	  }      /***************** SpiResource Events ****************/  event void SpiResource.granted() {    receive();  }    /***************** RXFIFO Events ****************/  /**   * We received some bytes from the SPI bus.  Process them in the context   * of the state we're in.  Remember the length byte is not part of the length   */  async event void RXFIFO.readDone( uint8_t* rx_buf, uint8_t rx_len,error_t error ) {      //int i;	/*	uint8_t len;		//uint8_t rssi;	//uint8_t lqi;	int i;		len = rx_buf[0];		rssi= 255 - rx_buf[len-1];		//lqi = rssi & 0x7f;	*/	/*     //printfUART("r d %i %i\n", len, rssi);     // len = rx_buf[0];	//rssi=rx_buf[len-2]; 		for (i=0;i<40;i++)	{		//printfUART("r %i %x\n",i,rx_buf[i]);	}      	//signal Receiveframe.receive((uint8_t*)rxmpdu_ptr, rssi);		receive_count++;		if (receive_count == 2)	{	flush();		receive_count =0;	}	*/		atomic{	//my code	switch(m_state){		case S_RX_LENGTH:						rxFrameLength = rx_buf[0];										m_state = S_RX_FC;										//verify print					////printfUART("LEN %x %x %i %i\n",rxFrameLength,rxmpdu_ptr->length,m_state,m_bytes_left);										//printfUART("r%i %i %i\n",rxmpdu_ptr->seq_num,rxFrameLength,MAC_PACKET_SIZE);										if ( rxFrameLength + 1 > m_bytes_left )					{						// Length of this packet is bigger than the RXFIFO, flush it out.						//printfUART("pkt too big\n","");						flush();											}					else					{						if ( !call FIFO.get() && !call FIFOP.get() )						{						//printfUART("RED left %x\n",m_bytes_left);											  m_bytes_left -= rxFrameLength + 1;						}												//if(rxFrameLength <= MAC_PACKET_SIZE) 						//{							if(rxFrameLength > 0) 							{								//verify read length and read the frame control field (2 bytes)								if(rxFrameLength > 2) {								  // This packet has an FCF byte plus at least one more byte to read								  //call RXFIFO.continueRead(buf + 1, SACK_HEADER_LENGTH);								  								  ////printfUART("LEN OK\n","");								  //read frame control + sequence number								  call RXFIFO.continueRead((uint8_t*)rxmpdu_ptr + 1, 3);								}								else								{								  // This is really a bad packet, skip FCF and get it out of here.								  //m_state = S_RX_PAYLOAD;								  									m_state = S_RX_DISCARD;									//printfUART("bad len\n","");																		call RXFIFO.continueRead((uint8_t*)rxmpdu_ptr + 1, rxFrameLength);									return;								}							} 							else 							{								// Length == 0; start reading the next packet								atomic receivingPacket = FALSE;								call CSN.set();								call SpiResource.release();								waitForNextPacket();							}						  						//}						//else						//{							// Length is too large; we have to flush the entire Rx FIFO						//	//printfUART("pkt too large\n","");						//	flush();													//	return;						//}					}					break;	case S_RX_FC:										//verify print					////printfUART("FC %x %x %x %i\n",rxmpdu_ptr->frame_control1,rxmpdu_ptr->frame_control2,rxmpdu_ptr->seq_num, m_state);									if ((rxmpdu_ptr->frame_control1 & 0x7) == TYPE_ACK)					{						m_state = S_RX_PAYLOAD;												//printfUART("r ack \n",""); 						call RXFIFO.continueRead((uint8_t*)rxmpdu_ptr+4,2);						return;					}														if (address_decode == 1)					{						m_state = S_RX_ADDR;												destination_address=get_fc2_dest_addr(rxmpdu_ptr->frame_control2);												if (destination_address > 1)						{							switch(destination_address)							{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -