📄 phym.nc.svn-base
字号:
/*
*
* @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 + -