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

📄 cc2420transmitp.nc

📁 tinyos2.0版本驱动
💻 NC
字号:
/* * 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 Initial SACK implementation * @version $Revision: 1.1 $ $Date: 2008/02/11 17:41:25 $ */module CC2420TransmitP {  provides interface Init;  provides interface StdControl; provides interface Sendframe;  provides interface ReceiveIndicator as EnergyIndicator;  provides interface ReceiveIndicator as ByteIndicator;  uses interface GpioCapture as CaptureSFD;  uses interface GeneralIO as CCA;  uses interface GeneralIO as CSN;  uses interface GeneralIO as SFD;  uses interface Resource as SpiResource;  uses interface ChipSpiResource;  uses interface CC2420Fifo as TXFIFO;  uses interface CC2420Ram as TXFIFO_RAM;  uses interface CC2420Register as TXCTRL;  uses interface CC2420Strobe as SNOP;  uses interface CC2420Strobe as STXON;  uses interface CC2420Strobe as STXONCCA;  uses interface CC2420Strobe as SFLUSHTX;  uses interface CC2420Register as MDMCTRL1;  uses interface Leds;}implementation {  /** Byte reception/transmission indicator */  bool sfdHigh;  /***************** Prototypes ****************/  void attemptSend();  error_t acquireSpiResource();  error_t releaseSpiResource();  void signalDone( error_t err );      /***************** Init Commands *****************/  command error_t Init.init() {    call CCA.makeInput();    call CSN.makeOutput();    call SFD.makeInput();    return SUCCESS;  }  /***************** StdControl Commands ****************/  command error_t StdControl.start() {    atomic {      call CaptureSFD.captureRisingEdge();	}	    return SUCCESS;  }  command error_t StdControl.stop() {    atomic {      call CaptureSFD.disable();      call SpiResource.release();  // REMOVE      call CSN.set();    }    return SUCCESS;  }    /**************** Send Commands ****************/	async command error_t Sendframe.send(uint8_t* frame, uint8_t frame_length)	{		//printfUART("Send Command\n", "");     		if ( acquireSpiResource() == SUCCESS ) {			call CSN.clr();					call TXCTRL.write( ( 2 << CC2420_TXCTRL_TXMIXBUF_CUR ) |							 ( 3 << CC2420_TXCTRL_PA_CURRENT ) |							 ( 1 << CC2420_TXCTRL_RESERVED ) |							 ( (CC2420_DEF_RFPOWER & 0x1F) << CC2420_TXCTRL_PA_LEVEL ) );						call TXFIFO.write( (uint8_t*)frame, frame_length);		}		return SUCCESS;	}  /***************** Indicator Commands ****************/  command bool EnergyIndicator.isReceiving() {    return !(call CCA.get());  }    command bool ByteIndicator.isReceiving() {    bool high;    atomic high = sfdHigh;    return high;  }    /**   * The CaptureSFD event is actually an interrupt from the capture pin   * which is connected to timing circuitry and timer modules.  This   * type of interrupt allows us to see what time (being some relative value)   * the event occurred, and lets us accurately timestamp our packets.  This   * allows higher levels in our system to synchronize with other nodes.   *   * Because the SFD events can occur so quickly, and the interrupts go   * in both directions, we set up the interrupt but check the SFD pin to   * determine if that interrupt condition has already been met - meaning,   * we should fall through and continue executing code where that interrupt   * would have picked up and executed had our microcontroller been fast enough.   */  async event void CaptureSFD.captured( uint16_t time ) {   }  /***************** ChipSpiResource Events ****************/  async event void ChipSpiResource.releasing() {  }    /***************** SpiResource Events ****************/  event void SpiResource.granted() {         attemptSend();       }    /***************** TXFIFO Events ****************/  /**   * The TXFIFO is used to load packets into the transmit buffer on the   * chip   */  async event void TXFIFO.writeDone( uint8_t* tx_buf, uint8_t tx_len,error_t error )   {    call CSN.set();	attemptSend();       }    async event void TXFIFO.readDone( uint8_t* tx_buf, uint8_t tx_len,error_t error ) {  }          /***************** Functions ****************/     /**   * Attempt to send the packet we have loaded into the tx buffer on    * the radio chip.  The STXONCCA will send the packet immediately if   * the channel is clear.  If we're not concerned about whether or not   * the channel is clear (i.e. m_cca == FALSE), then STXON will send the   * packet without checking for a clear channel.   *   * If the packet didn't get sent, then congestion == TRUE.  In that case,   * we reset the backoff timer and try again in a moment.   *   * If the packet got sent, we should expect an SFD interrupt to take   * over, signifying the packet is getting sent.   */  void attemptSend() {     //printfUART("attempt Send Command\n", "");     atomic {	            call CSN.clr();       call STXON.strobe();           call CSN.set();	      releaseSpiResource();	}    	signalDone(SUCCESS);		  }    error_t acquireSpiResource() {    error_t error = call SpiResource.immediateRequest();       //printfUART("acquire spi\n", ""); 	if ( error != SUCCESS ) {      call SpiResource.request();    }    return error;  }  error_t releaseSpiResource() {    call SpiResource.release();    return SUCCESS;  }      void signalDone( error_t err ) {    call ChipSpiResource.attemptRelease();    signal Sendframe.sendDone( err );  }}

⌨️ 快捷键说明

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