📄 phym.nc.svn-base
字号:
break;
case PHYTRANSMITPOWER:
phy_PIB.phyTransmitPower= PIBAttributeValue;
SetRFPower(phy_PIB.phyTransmitPower);
signal PLME_SET.confirm(PHY_SUCCESS, PIBAttribute);
break;
case PHYCCAMODE:
phy_PIB.phyCcaMode= PIBAttributeValue;
signal PLME_SET.confirm(PHY_SUCCESS, PIBAttribute);
break;
default:
signal PLME_SET.confirm(PHY_UNSUPPORTED_ATTRIBUTE, PIBAttribute);
break;
}
return SUCCESS;
}
command result_t PLME_SET_TRX_STATE.request(uint8_t state){
//printfUART("PLME_SET_TRX_STATE.request\n","");
//MAC is demanding for PHY to change to the requested transceiver radio state
switch(state)
{
case PHY_RX_ON:
switch(currentRxTxState)
{
//transceiver state already on
case PHY_RX_ON: signal PLME_SET_TRX_STATE.confirm(PHY_RX_ON);
break;
case PHY_TRX_OFF:call HPLCC2420.cmd(CC2420_SRXON);
currentRxTxState = PHY_RX_ON;
signal PLME_SET_TRX_STATE.confirm(SUCCESS);
break;
case PHY_TX_ON:
signal PLME_SET_TRX_STATE.confirm(PHY_BUSY_TX);
break;
}
break;
case PHY_TRX_OFF:
switch(currentRxTxState)
{
//transceiver state already on
case PHY_RX_ON:call HPLCC2420.cmd(CC2420_SRFOFF);
currentRxTxState = PHY_TRX_OFF;
signal PLME_SET_TRX_STATE.confirm(PHY_BUSY_RX);
break;
case PHY_TRX_OFF: signal PLME_SET_TRX_STATE.confirm(PHY_TRX_OFF);
break;
case PHY_TX_ON: call HPLCC2420.cmd(CC2420_SRFOFF);
currentRxTxState = PHY_TRX_OFF;
signal PLME_SET_TRX_STATE.confirm(PHY_BUSY_TX);
break;
}
break;
case PHY_FORCE_TRX_OFF:
call HPLCC2420.cmd(CC2420_SRFOFF);
currentRxTxState = PHY_TRX_OFF;
break;
case PHY_TX_ON:
switch(currentRxTxState)
{
//transceiver state already on
case PHY_RX_ON: signal PLME_SET_TRX_STATE.confirm(PHY_BUSY_RX);
break;
case PHY_TRX_OFF:call HPLCC2420.cmd(CC2420_STXON);
currentRxTxState = PHY_TX_ON;
signal PLME_SET_TRX_STATE.confirm(SUCCESS);
break;
case PHY_TX_ON:
signal PLME_SET_TRX_STATE.confirm(PHY_TX_ON);
break;
}
break;
}
printfUART("TRX state: %i\n",currentRxTxState);
return SUCCESS;
}
/**************************************************
*******************Physical Events CC2420**********
**************************************************/
async event result_t HPLCC2420.FIFOPIntr() {
//call Leds.redToggle();
//return SUCCESS;
call HPLCC2420FIFO.readRXFIFO(100,(uint8_t*)rxmpdu_ptr);
//printfUART("RSSI: %i\n", call HPLCC2420.read(CC2420_RSSI));
//post process_received_packet();
signal PD_DATA.indication(rxmpdu_ptr->length,(uint8_t*)rxmpdu_ptr, 1);
call HPLCC2420.cmd(CC2420_SFLUSHRX);
return SUCCESS;
}
task void process_received_packet()
{
signal PD_DATA.indication(rxmpdu_ptr->length,(uint8_t*)rxmpdu_ptr, 1);
return;
}
async event result_t HPLCC2420RAM.readDone(uint16_t addr, uint8_t length, uint8_t* buffer) {
return SUCCESS;
}
async event result_t HPLCC2420RAM.writeDone(uint16_t addr, uint8_t length, uint8_t* buffer) {
return SUCCESS;
}
async event result_t HPLCC2420FIFO.RXFIFODone(uint8_t length, uint8_t *data) {
return SUCCESS;
}
async event result_t HPLCC2420FIFO.TXFIFODone(uint8_t length, uint8_t *data) {
return SUCCESS;
}
/**************************************************
*******************OTHER FUNCTIONS******************
**************************************************/
/************************************************************************
* SetRegs
* - Configure CC2420 registers with current values
* - Readback 1st register written to make sure electrical connection OK
*************************************************************************/
bool SetRegs(){
uint16_t data;
call HPLCC2420.write(CC2420_MAIN,gCurrentParameters[CP_MAIN]);
call HPLCC2420.write(CC2420_MDMCTRL0, gCurrentParameters[CP_MDMCTRL0]);
data = call HPLCC2420.read(CC2420_MDMCTRL0);
if (data != gCurrentParameters[CP_MDMCTRL0]) return FALSE;
call HPLCC2420.write(CC2420_MDMCTRL1, gCurrentParameters[CP_MDMCTRL1]);
call HPLCC2420.write(CC2420_RSSI, gCurrentParameters[CP_RSSI]);
call HPLCC2420.write(CC2420_SYNCWORD, gCurrentParameters[CP_SYNCWORD]);
call HPLCC2420.write(CC2420_TXCTRL, gCurrentParameters[CP_TXCTRL]);
call HPLCC2420.write(CC2420_RXCTRL0, gCurrentParameters[CP_RXCTRL0]);
call HPLCC2420.write(CC2420_RXCTRL1, gCurrentParameters[CP_RXCTRL1]);
call HPLCC2420.write(CC2420_FSCTRL, gCurrentParameters[CP_FSCTRL]);
call HPLCC2420.write(CC2420_SECCTRL0, gCurrentParameters[CP_SECCTRL0]);
call HPLCC2420.write(CC2420_SECCTRL1, gCurrentParameters[CP_SECCTRL1]);
call HPLCC2420.write(CC2420_IOCFG0, gCurrentParameters[CP_IOCFG0]);
call HPLCC2420.write(CC2420_IOCFG1, gCurrentParameters[CP_IOCFG1]);
call HPLCC2420.cmd(CC2420_SFLUSHTX); //flush Tx fifo
call HPLCC2420.cmd(CC2420_SFLUSHRX);
return TRUE;
}
bool default_CC2420_registers(){
//uint16_t data;
call HPLCC2420.write(CC2420_MAIN,0xF800);
call HPLCC2420.write(CC2420_MDMCTRL0,0x1AE2);
//data = call HPLCC2420.read(CC2420_MDMCTRL0);
//if (data != gCurrentParameters[CP_MDMCTRL0]) return FALSE;
call HPLCC2420.write(CC2420_MDMCTRL1, 0x0500);
call HPLCC2420.write(CC2420_RSSI, 0xE000);
call HPLCC2420.write(CC2420_SYNCWORD, 0xA70F);
call HPLCC2420.write(CC2420_TXCTRL, 0xA0FF);
call HPLCC2420.write(CC2420_RXCTRL0, 0x12E5);
call HPLCC2420.write(CC2420_RXCTRL1, 0x0A56);
call HPLCC2420.write(CC2420_FSCTRL, 0x4165);
call HPLCC2420.write(CC2420_SECCTRL0, 0x03C4);
call HPLCC2420.write(CC2420_SECCTRL1, 0x0000);
call HPLCC2420.write(CC2420_IOCFG0, 0x0040);
call HPLCC2420.write(CC2420_IOCFG1, 0x0000);
call HPLCC2420.cmd(CC2420_SFLUSHTX); //flush Tx fifo
call HPLCC2420.cmd(CC2420_SFLUSHRX);
return TRUE;
}
/*************************************************************************
* GetRFPower
* return power seeting
*************************************************************************/
uint8_t GetRFPower() {
return (gCurrentParameters[CP_TXCTRL] & 0x000f); //rfpower;
}
/*************************************************************************
* SetRFPower
* power = 31 => full power (0dbm)
* 3 => lowest power (-25dbm)
* return SUCCESS if the radio power was successfully set
*************************************************************************/
result_t SetRFPower(uint8_t power) {
gCurrentParameters[CP_TXCTRL] = (gCurrentParameters[CP_FSCTRL] & 0xfff0) | (power << CC2420_TXCTRL_PAPWR);
call HPLCC2420.write(CC2420_TXCTRL,gCurrentParameters[CP_TXCTRL]);
return SUCCESS;
}
/**
* Turns on the 1.8V references on the CC2420.
*
* @return SUCCESS if the VREF has been turned on
*/
result_t VREFOn(){
TOSH_SET_CC_VREN_PIN(); //turn-on
TOSH_uwait(600); // CC2420 spec: 600us max turn on time
return SUCCESS;
}
/**
* Turns off the 1.8V references on the CC2420.
*
* @return SUCCESS if the VREF has been turned on
*/
result_t VREFOff(){
TOSH_CLR_CC_VREN_PIN(); //turn-off
return SUCCESS;
}
/*************************************************************************
* TunePreset
* -Set CC2420 channel
* Valid channel values are 11 through 26.
* The channels are calculated by:
* Freq = 2405 + 5(k-11) MHz for k = 11,12,...,26
* chnl requested 802.15.4 channel
* return Status of the tune operation
*************************************************************************/
result_t TunePreset(uint8_t chnl) {
int fsctrl;
fsctrl = 357 + 5*(chnl-11);
gCurrentParameters[CP_FSCTRL] = (gCurrentParameters[CP_FSCTRL] & 0xfc00) | (fsctrl << CC2420_FSCTRL_FREQ);
call HPLCC2420.write(CC2420_FSCTRL, gCurrentParameters[CP_FSCTRL]);
return SUCCESS;
}
/*************************************************************************
* TuneManual
* Tune the radio to a given frequency. Frequencies may be set in
* 1 MHz steps between 2400 MHz and 2483 MHz
*
* Desiredfreq The desired frequency, in MHz.
* Return Status of the tune operation
*************************************************************************/
result_t TuneManual(uint16_t DesiredFreq) {
int fsctrl;
fsctrl = DesiredFreq - 2048;
gCurrentParameters[CP_FSCTRL] = (gCurrentParameters[CP_FSCTRL] & 0xfc00) | (fsctrl << CC2420_FSCTRL_FREQ);
call HPLCC2420.write(CC2420_FSCTRL, gCurrentParameters[CP_FSCTRL]);
return SUCCESS;
}
result_t setShortAddress(uint16_t addr) {
addr = toLSB16(addr);
return call HPLCC2420RAM.write(CC2420_RAM_SHORTADR, 2, (uint8_t*)&addr);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -