📄 mac_power_management.c
字号:
/*******************************************************************************************************
* *
* ********** *
* ************ *
* *** *** *
* *** +++ *** *
* *** + + *** *
* *** + CHIPCON CC2420 INTEGRATED 802.15.4 MAC AND PHY *
* *** + + *** CC2420 Power Management *
* *** +++ *** *
* *** *** *
* ************ *
* ********** *
* *
*******************************************************************************************************
* CONFIDENTIAL *
* The use of this file is restricted by the signed MAC software license agreement. *
* *
* Copyright Chipcon AS, 2004 *
*******************************************************************************************************
* This module contains functions to be used by the higher layer to power down the CC2420. *
*******************************************************************************************************
* Compiler: AVR-GCC *
* Target platform: CC2420DB, CC2420 + any ATMEGA MCU *
*******************************************************************************************************
* The revision history is located at the bottom of this file *
*******************************************************************************************************/
#pragma SFR
#pragma NOP
#pragma STOP
#pragma HALT
#pragma DI
#pragma EI
#pragma section @@DATA power at 0xE300///
#include "mac_headers.h"
//-------------------------------------------------------------------------------------------------------
// Internal module data
MPM_INFO mpmInfo;
extern char str[32];///
//-------------------------------------------------------------------------------------------------------
int UART_StartTx(char *buffer);///
//-------------------------------------------------------------------------------------------------------
// Internal module function
void mpmSetTask(MAC_TASK_INFO *pTask);
//-------------------------------------------------------------------------------------------------------
//
//-------------------------------------------------------------------------------------------------------
// Simple power up/down functions
void mpmTurnOnVregAndReset(void) { DISABLE_GLOBAL_INT(); SET_RESET_ACTIVE(); SET_VREG_ACTIVE(); ENABLE_GLOBAL_INT(); }
void mpmTurnOffReset(void) { DISABLE_GLOBAL_INT(); SET_RESET_INACTIVE(); ENABLE_GLOBAL_INT(); }
void mpmTurnOnXosc(void) { DISABLE_GLOBAL_INT(); FASTSPI_STROBE(CC2420_SXOSCON); ENABLE_GLOBAL_INT(); }
void mpmTurnOffVreg(void) { DISABLE_GLOBAL_INT(); SET_RESET_ACTIVE(); SET_VREG_INACTIVE(); ENABLE_GLOBAL_INT(); }
void mpmTurnOffXosc(void) { DISABLE_GLOBAL_INT(); FASTSPI_STROBE(CC2420_SXOSCOFF); ENABLE_GLOBAL_INT(); }
//-------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------
// void mpmRestoreRegsAndRam(void)
//
// DESCRIPTION:
// Restores all CC2420 registers and RAM, assuming that there was no activity in the MAC layer at
// power-down. That includes:
// MDMCTRL0 (register) (PAN coordinator bit)
// MDMCTRL1 (register) (Correlation threshold, only required by old chip revisions, see data
// sheets)
// SECCTRL0 (register)
// PANID (RAM)
// IEEEADDR (RAM)
// SHORTADDR (RAM)
// FSCTRL (register)
//-------------------------------------------------------------------------------------------------------
void mpmRestoreRegsAndRam(void) {
WORD oldRegVal;
// Write default register values
DISABLE_GLOBAL_INT();
#if MAC_OPT_FFD
FASTSPI_SETREG(CC2420_MDMCTRL0, GET_MF(MF_PAN_COORDINATOR) ? 0x0BE2 : 0x0AE2);
#endif
FASTSPI_SETREG(CC2420_MDMCTRL1, 0x0500);
FASTSPI_SETREG(CC2420_IOCFG0, 0x0203);
#if MAC_OPT_SECURITY
FASTSPI_SETREG(CC2420_SECCTRL0, CC2420_SECCTRL0_RXFIFO_PROTECTION | CC2420_SECCTRL0_SEC_CBC_HEAD | CC2420_SECCTRL0_NO_SECURITY);
#else
FASTSPI_SETREG(CC2420_SECCTRL0, CC2420_SECCTRL0_NO_SECURITY);
#endif
FASTSPI_GETREG(CC2420_RXCTRL1, oldRegVal);
oldRegVal |= 0x2000;
FASTSPI_SETREG(CC2420_RXCTRL1, oldRegVal);
ENABLE_GLOBAL_INT();
// PAN ID, extended and short addresses
msupWriteRam((BYTE*)&mpib.macPANId, CC2420RAM_PANID, 2, TRUE);///
msupWriteRam((BYTE*)&aExtendedAddress, CC2420RAM_IEEEADDR, 8, TRUE);///
msupWriteRam((BYTE*)&mpib.macShortAddress, CC2420RAM_SHORTADDR, 2, TRUE);///
// Frequency word
msupSetChannel(ppib.phyCurrentChannel, FALSE);
} // mpmRestoreRegsAndRam
//-------------------------------------------------------------------------------------------------------
// void mpmSetTask(MAC_TASK_INFO *pTask)
//
// DESCRIPTION:
// This task is responsible for controlling CC2420 power, as requested by the higher layer through
// mpmSetRequest. Power-down is currently only supported for non-beacon PANs.
//
// TASK DATA:
// The new power mode (MPM_CC2420_ON, MPM_CC2420_XOSC_OFF, or MPM_CC2420_XOSC_AND_VREG_OFF)
//-------------------------------------------------------------------------------------------------------
void mpmSetTask(MAC_TASK_INFO *pTask) {
///UART_StartTx("\r\nP1\r\n>"); ///
// Powerdown is not permitted in non-beacon mode when "RX on when idle" is enabled
if ((mpib.macBeaconOrder == 15) && mpib.macRxOnWhenIdle) {
mschRemoveTask(pTask->priority, 0);
mpmSetConfirm(ERR_RX_ON_WHEN_IDLE);
return;
}
// Come back later if we're not in the default MAC state (there's something going on...)
if (macInfo.state != MAC_STATE_DEFAULT) {
mschRescheduleTask(pTask, 0);
return;
}
// Switch to the new power mode
mpmInfo.selectedMode = (BYTE) pTask->taskData;
// In a beacon-enabled network the beacon handler will control powerup and powerdown
// In a non-beacon network the changes will be made directly from here:
switch (mpmInfo.selectedMode) {
case MPM_CC2420_ON:
// Turn on VREG?
if (mpmInfo.currentState == MPM_CC2420_XOSC_AND_VREG_OFF) {
mpmTurnOnVregAndReset();
halWait(MPM_VREG_TURN_ON_TIME);
mpmTurnOffReset();
}
// Turn on XOSC?
if (mpmInfo.currentState != MPM_CC2420_ON) {
mpmTurnOnXosc();
halRfWaitForCrystalOscillator();
}
// Restore registers and RAM if the voltage regulator was turned off
if (mpmInfo.currentState == MPM_CC2420_XOSC_AND_VREG_OFF) {
mpmRestoreRegsAndRam();
}
mrxInfo.keepFifopIntOff = FALSE;
ENABLE_FIFOP_INT();
mpmInfo.currentState = MPM_CC2420_ON;
break;
case MPM_CC2420_XOSC_OFF:
///TIMER1_STOP();
TIMER3_STOP();///
TIMER1_STOP();///
DISABLE_FIFOP_INT();
mrxInfo.keepFifopIntOff = TRUE;
mpmTurnOffXosc();
break;
case MPM_CC2420_XOSC_AND_VREG_OFF:
///TIMER1_STOP();
TIMER3_STOP();///
TIMER1_STOP();///
DISABLE_FIFOP_INT();
mrxInfo.keepFifopIntOff = TRUE;
mpmTurnOffVreg();
break;
}
// Update with the new transceiver state
mpmInfo.currentState = mpmInfo.selectedMode;
// Clean up and make the callback
mschRemoveTask(pTask->priority, 0);
mschReleaseTask(pTask->taskNumber);///
mpmSetConfirm(OK_POWER_MODE_CHANGED);
///UART_StartTx("\r\n-- Start mlmeScanRequest");
} // mpmSetTask
//-------------------------------------------------------------------------------------------------------
// void mpmSetRequest(BYTE mode)
//
// DESCRIPTION:
// This function allows the higher layer to power down CC2420 to extend battery lifetime. CC2420
// must be powered up before any MLME or MCPS primitives can be used (both beacon/non-beacon modes).
// Power-down is currently only supported for non-beacon PANs.
//
// The change is not likely to happen instantaneously (under normal conditions the delay can be up
// to 320 us). Use either the mpmSetConfirm callback, or poll the current power state by using
// mpmGetState() (returns the selected power mode when it has become effective).
//
// ARGUMENTS:
// BYTE mode
// MPM_CC2420_ON: The CC2420 crystal oscillator is on, ready to receive/transmit
// MPM_CC2420_XOSC_OFF: The CC2420 crystal oscillator is off (startup time ~1 ms)
// MPM_CC2420_XOSC_AND_VREG_OFF: The CC2420 voltage regulator is off (startup time ~1.6 ms)
//
// Note: Nothing will happen if the current state is MPM_CC2420_XOSC_AND_VREG_OFF, and the new
// mode is MPM_CC2420_XOSC_OFF.
//-------------------------------------------------------------------------------------------------------
void mpmSetRequest(BYTE mode) {
UINT8 taskNumber;
// Any changes?
if (mode == mpmInfo.selectedMode) {
mpmSetConfirm(OK_POWER_MODE_UNCHANGED);
} else {
// Reserve the task to be used
do {
taskNumber = mschReserveTask();
} while (taskNumber == NO_TASK);
// Start the timer so that the task will be executed
/// if (mpmInfo.selectedMode != MPM_CC2420_ON) TIMER1_START(TIMER1_CLK_DIV1);
/// if (mpmInfo.selectedMode != MPM_CC2420_ON) TIMER3_START(TIMER3_CLK_DIV1);///
///if (mpmInfo.selectedMode != MPM_CC2420_ON) TIMER3_START(TIMER3_CLK);///
///+!!!
if (mpmInfo.selectedMode != MPM_CC2420_ON)
///{TIMER3_START(TIMER3_CLK);///
///TIMER1_START(TIMER1_CLK);///
/// }
{TIMER3_START();///
TIMER1_START();///
}
sprintf(str, "\n%d\n", taskNumber);///
UART_StartTx(str);///
/// mschAddTask(taskNumber, MAC_TASK_PRI_LOW, mpmSetTask, mode);
mschAddTask(taskNumber, MAC_TASK_PRI_LOW, mpmSetTask, mode);///
}
} // mpmSetRequest
//-------------------------------------------------------------------------------------------------------
// BYTE mpmGetState(void)
//
// DESCRIPTION:
// Returns the current power state when it has become effective (after a call to mpmSetRequest)
//
// RETURN VALUE:
// BYTE
// MPM_CC2420_ON: The CC2420 crystal oscillator is on, ready to receive/transmit
// MPM_CC2420_XOSC_OFF: The CC2420 crystal oscillator is off
// MPM_CC2420_XOSC_AND_VREG_OFF: The CC2420 voltage regulator is off
//-------------------------------------------------------------------------------------------------------
BYTE mpmGetState(void) {
return mpmInfo.currentState;
} // mpmGetState
/*******************************************************************************************************
* Revision history:
*
* $Log: mac_power_management.c,v $
* Revision 1.9 2005/03/01 12:42:51 thl
* Inn CC2420_RXCTRL1 the RXBPF_LOCUR is now enabled,
* result is about 1,2-1,5mA reduction in RX current for the chip.
*
* Revision 1.8 2004/11/18 15:07:58 thl
* Added support for pending frame bit in outgoing data frames.
* Only apply to outgoing data frames and wherer the address matches
* one or more packet in the indirect packet quee.
*
* Revision 1.7 2004/11/10 09:33:14 thl
* Fixed a number of bugs according to: MAC software check lists.xls
*
* Revision 1.6 2004/08/13 13:04:46 jol
* CC2420 MAC Release v0.7
*
*
*******************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -