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

📄 phym.nc.svn-base

📁 802.15.4协议的实现
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
/*
 *
 * @author IPP HURRAY http://www.hurray.isep.ipp.pt/art-wise
 * @author Andre Cunha
 *
 */
includes byteorder;
 
module PhyM
{
  provides {
   
   interface StdControl;
   
   interface PD_DATA;
   
   //PLME-SAP
   interface PLME_ED;
   interface PLME_CCA;
   interface PLME_GET;
   interface PLME_SET;
   interface PLME_SET_TRX_STATE;
}
  uses {

  	interface StdControl as Phy_control;
	
	interface StdControl as HPL_Control;
  
    interface HPLCC2420;
    interface HPLCC2420RAM;
	interface HPLCC2420FIFO;

	interface Leds;
  	   }
}
implementation
{

  norace uint16_t gCurrentParameters[14];

  phyPIB phy_PIB;

  //transceiver current status
  //it can only be PHY_TRX_OFF, PHY_RX_ON and PHY_TX_ON
  uint8_t currentRxTxState = PHY_TRX_OFF;
  
  
  //message received
  norace MPDU rxmpdu;
  MPDU *rxmpdu_ptr;
  
	//FUNCTION DEFINITION
	bool default_CC2420_registers();
	bool SetRegs();
	uint8_t GetRFPower(); 
	result_t SetRFPower(uint8_t power); 
	result_t VREFOn();
	result_t VREFOff();
	result_t TunePreset(uint8_t chnl);
	result_t TuneManual(uint16_t DesiredFreq);
	result_t setShortAddress(uint16_t addr);
	
	task void process_received_packet();

  /**
   * Used to initialize this component.
   */
  command result_t StdControl.init() 
  {
    call HPL_Control.init();
  
    // Set default parameters
	//MAIN CONTROL REGISTER
    gCurrentParameters[CP_MAIN] = 0xf800;
	//MODEM CONTROL REGISTER 0
    gCurrentParameters[CP_MDMCTRL0] = ((0 << CC2420_MDMCTRL0_ADRDECODE) | 
       (2 << CC2420_MDMCTRL0_CCAHIST) | (3 << CC2420_MDMCTRL0_CCAMODE)  | 
       (1 << CC2420_MDMCTRL0_AUTOCRC) | (2 << CC2420_MDMCTRL0_PREAMBL));

    gCurrentParameters[CP_MDMCTRL1] = 20 << CC2420_MDMCTRL1_CORRTHRESH;

    gCurrentParameters[CP_RSSI] =     0xE080;
    gCurrentParameters[CP_SYNCWORD] = 0xA70F;
    gCurrentParameters[CP_TXCTRL] = ((1 << CC2420_TXCTRL_BUFCUR) | 
       (1 << CC2420_TXCTRL_TURNARND) | (3 << CC2420_TXCTRL_PACUR) | 
       (1 << CC2420_TXCTRL_PADIFF) | (0x1f << CC2420_TXCTRL_PAPWR));

    gCurrentParameters[CP_RXCTRL0] = ((1 << CC2420_RXCTRL0_BUFCUR) | 
       (2 << CC2420_RXCTRL0_MLNAG) | (3 << CC2420_RXCTRL0_LOLNAG) | 
       (2 << CC2420_RXCTRL0_HICUR) | (1 << CC2420_RXCTRL0_MCUR) | 
       (1 << CC2420_RXCTRL0_LOCUR));

    gCurrentParameters[CP_RXCTRL1]  = ((1 << CC2420_RXCTRL1_LOLOGAIN) | 
       (1 << CC2420_RXCTRL1_HIHGM) |  (1 << CC2420_RXCTRL1_LNACAP) | 
       (1 << CC2420_RXCTRL1_RMIXT) |  (1 << CC2420_RXCTRL1_RMIXV)  | 
       (2 << CC2420_RXCTRL1_RMIXCUR));

    gCurrentParameters[CP_FSCTRL]   = ((1 << CC2420_FSCTRL_LOCK) | 
       ((357+5*(CC2420_DEF_CHANNEL-11)) << CC2420_FSCTRL_FREQ));

    gCurrentParameters[CP_SECCTRL0] = ((1 << CC2420_SECCTRL0_CBCHEAD) |
       (1 << CC2420_SECCTRL0_SAKEYSEL)  | (1 << CC2420_SECCTRL0_TXKEYSEL) | 
       (1 << CC2420_SECCTRL0_SECM));

    gCurrentParameters[CP_SECCTRL1] = 0;
    gCurrentParameters[CP_BATTMON]  = 0;

    // set fifop threshold to greater than size of tos msg, 
    // fifop goes active at end of msg
    gCurrentParameters[CP_IOCFG0]   = (((127) << CC2420_IOCFG0_FIFOTHR) | 
        (1 <<CC2420_IOCFG0_FIFOPPOL)) ;

    gCurrentParameters[CP_IOCFG1]   =  0;



/////////////////////////////////////////////////////
////////////////////////////////////////////////////
////PHY PIB initialization

	phy_PIB.phyCurrentChannel=0x15;
	phy_PIB.phyChannelsSupported=0;
	phy_PIB.phyTransmitPower=31;
	phy_PIB.phyCcaMode=0;

call Leds.init();
	
    return SUCCESS;
  }
/******************************************************************************
 * Start CC2420 radio:
 * -Turn on 1.8V voltage regulator, wait for power-up, 0.6msec
 * -Release reset line
 * -Enable CC2420 crystal,          wait for stabilization, 0.9 msec
 *
 ******************************************************************************/
  command result_t StdControl.start() 
  {
   result_t status=0;
   
	atomic{
		rxmpdu_ptr = &rxmpdu;
	}
    
	call HPL_Control.start();
    //turn on power
    VREFOn();
    // toggle reset
    TOSH_CLR_CC_RSTN_PIN();
    TOSH_wait();
    TOSH_SET_CC_RSTN_PIN();
    TOSH_wait();
    // turn on crystal, takes about 860 usec, 
    // chk CC2420 status reg for stablize
	call HPLCC2420.cmd(CC2420_SXOSCON); 
    //status = call CC2420Control.OscillatorOn();
    //set freq, load regs
    status = SetRegs() && status;
	//status = default_CC2420_registers() && status;
    status = status && setShortAddress(TOS_LOCAL_ADDRESS);
   // status = status && TunePreset(CC2420_DEF_CHANNEL);

   //RF power
	SetRFPower(phy_PIB.phyTransmitPower);
	//CHANNEL
	TunePreset(phy_PIB.phyCurrentChannel);
	
 //TEMP VAR
	call HPLCC2420.cmd(CC2420_SFLUSHRX);
	call HPLCC2420.enableFIFOP();
//TEMP VAR
//call HPLCC2420.cmd(CC2420_SRXON);
	/*initialize timer*/
	//call Timer.start(TIMER_REPEAT, 1000);
		
    return SUCCESS;
  }
  /**
   * Stops the SensorControl and CommControl components.
   * @return Always returns SUCCESS.
   */
command result_t StdControl.stop() {
       //disable interrupts
   result_t ok = call HPLCC2420.disableFIFOP();    

    call HPLCC2420.cmd(CC2420_SXOSCOFF); 

    call HPL_Control.stop();

    TOSH_CLR_CC_RSTN_PIN();
    ok &= VREFOff();
    TOSH_SET_CC_RSTN_PIN();

    return SUCCESS;
  }
   
/************************************************  
*******************PD-DATA***********************
**************************************************
*/

 async command result_t PD_DATA.request(uint8_t psduLength, uint8_t* psdu) {
	
	//call HPLCC2420.cmd(CC2420_SRXON);
	
	
	atomic{
	
		call HPLCC2420FIFO.writeTXFIFO(psduLength,(uint8_t *)psdu);
		
		call HPLCC2420.cmd(CC2420_STXON);
		}
		
		signal PD_DATA.confirm(PHY_SUCCESS);
		
      return SUCCESS;
  }

/************************************************  
*******************PLME-ED***********************
**************************************************/

  command result_t PLME_ED.request(){
  //MAC asking for energy detection
	//signal PLME_ED.confirm(PHY_SUCCESS,GetRFPower());
	uint8_t rssi;
	rssi =  (uint8_t) call HPLCC2420.read(CC2420_RSSI);
	
	//verify how to do the energy detection
  
	printfUART("ED: %i\n", rssi);
	
	signal PLME_ED.confirm(PHY_SUCCESS,rssi);

  return SUCCESS;
  }

command result_t PLME_CCA.request(){
  
  //MAC asking for CCA
  return SUCCESS;
  }
command result_t PLME_GET.request(uint8_t PIBAttribute){
//MAC asking for PIBAttribute value
  switch(PIBAttribute)
		{
			case PHYCURRENTCHANNEL:
				signal PLME_GET.confirm(PHY_SUCCESS, PIBAttribute, phy_PIB.phyCurrentChannel);
				break;

			case PHYCHANNELSSUPPORTED:
				signal PLME_GET.confirm(PHY_SUCCESS, PIBAttribute, phy_PIB.phyChannelsSupported);
				break;

			case PHYTRANSMITPOWER:
				signal PLME_GET.confirm(PHY_SUCCESS, PIBAttribute, phy_PIB.phyTransmitPower);
				break;
			case PHYCCAMODE:
				signal PLME_GET.confirm(PHY_SUCCESS, PIBAttribute, phy_PIB.phyCcaMode);
				break;
			default:
				signal PLME_GET.confirm(PHY_UNSUPPORTED_ATTRIBUTE, PIBAttribute, 0x00);
				break;
		}
		
  
  return SUCCESS;
  }
  
  
   command result_t PLME_SET.request(uint8_t PIBAttribute, uint8_t PIBAttributeValue){
  
  //MAC is demanding for PHY to write the indicated PIB value
  switch(PIBAttribute)
		{
			case PHYCURRENTCHANNEL:
				printfUART("PLME_SET.request CURRENTCHANNEL: %i\n",PIBAttributeValue);
				phy_PIB.phyCurrentChannel = PIBAttributeValue;
				TunePreset(phy_PIB.phyCurrentChannel);
				signal PLME_SET.confirm(PHY_SUCCESS, PIBAttribute);
				break;

			case PHYCHANNELSSUPPORTED:
				phy_PIB.phyChannelsSupported = PIBAttributeValue;
				signal PLME_SET.confirm(PHY_SUCCESS, PIBAttribute);

⌨️ 快捷键说明

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