📄 hal.h
字号:
#define TX_ACTIVE_FLAG 0x10
#define FIFO_FLAG 0x08
#define FIFOP_FLAG 0x04
#define SFD_FLAG 0x02
#define CCA_FLAG 0x01
// Radio status states
#define TX_ACTIVE (RFSTATUS & TX_ACTIVE_FLAG)
#define FIFO (RFSTATUS & FIFO_FLAG)
#define FIFOP (RFSTATUS & FIFOP_FLAG)
#define SFD (RFSTATUS & SFD_FLAG)
#define CCA (RFSTATUS & CCA_FLAG)
// Various radio settings
#define PAN_COORDINATOR 0x10
#define ADR_DECODE 0x08
#define AUTO_CRC 0x20
#define AUTO_ACK 0x10
#define AUTO_TX2RX_OFF 0x08
#define RX2RX_TIME_OFF 0x04
#define ACCEPT_ACKPKT 0x01
//-----------------------------------------------------------------------------
// Command Strobe Processor (CSP) instructions
//-----------------------------------------------------------------------------
#define DECZ do{RFST = 0xBF; }while(0)
#define DECY do{RFST = 0xBE; }while(0)
#define INCY do{RFST = 0xBD; }while(0)
#define INCMAXY(m) do{RFST = (0xB8 | m); }while(0) // m < 8 !!
#define RANDXY do{RFST = 0xBC; }while(0)
#define INT do{RFST = 0xB9; }while(0)
#define WAITX do{RFST = 0xBB; }while(0)
#define WAIT(w) do{RFST = (0x80 | w); }while(0) // w < 64 !!
#define WEVENT do{RFST = 0xB8; }while(0)
#define LABEL do{RFST = 0xBA; }while(0)
#define RPT(n,c) do{RFST = (0xA0 | (n << 3) | c); }while(0) // n = TRUE/FALSE && (c < 8)
#define SKIP(s,n,c) do{RFST = ((s << 4) | (n << 3) | c); }while(0) // && (s < 8)
#define STOP do{RFST = 0xDF; }while(0)
#define SNOP do{RFST = 0xC0; }while(0)
#define STXCALN do{RFST = 0xC1; }while(0)
#define SRXON do{RFST = 0xC2; }while(0)
#define STXON do{RFST = 0xC3; }while(0)
#define STXONCCA do{RFST = 0xC4; }while(0)
#define SRFOFF do{RFST = 0xC5; }while(0)
#define SFLUSHRX do{RFST = 0xC6; }while(0)
#define SFLUSHTX do{RFST = 0xC7; }while(0)
#define SACK do{RFST = 0xC8; }while(0)
#define SACKPEND do{RFST = 0xC9; }while(0)
#define ISSTOP do{RFST = 0xFF; }while(0)
#define ISSTART do{RFST = 0xFE; }while(0)
#define ISTXCALN do{RFST = 0xE1; }while(0)
#define ISRXON do{RFST = 0xE2; }while(0)
#define ISTXON do{RFST = 0xE3; }while(0)
#define ISTXONCCA do{RFST = 0xE4; }while(0)
#define ISRFOFF do{RFST = 0xE5; }while(0)
#define ISFLUSHRX do{RFST = 0xE6; }while(0)
#define ISFLUSHTX do{RFST = 0xE7; }while(0)
#define ISACK do{RFST = 0xE8; }while(0)
#define ISACKPEND do{RFST = 0xE9; }while(0)
#define PACKET_FOOTER_SIZE 2 //bytes after the payload
/******************************************************************************
******************* Utility functions *******************
******************************************************************************/
/******************************************************************************
* @fn halWait
*
* @brief
* This function waits approximately a given number of m-seconds
* regardless of main clock speed.
*
* Parameters:
*
* @param BYTE wait
* The number of m-seconds to wait.
*
* @return void
*
******************************************************************************/
void halWait(BYTE wait);
/******************************************************************************
******************* ADC macros/functions *******************
*******************************************************************************
These functions/macros simplifies usage of the ADC.
******************************************************************************/
// Macro for setting up a single conversion. If ADCCON1.STSEL = 11, using this
// macro will also start the conversion.
#define ADC_SINGLE_CONVERSION(settings) \
do{ ADCCON3 = settings; }while(0)
// Macro for setting up a single conversion
#define ADC_SEQUENCE_SETUP(settings) \
do{ ADCCON2 = settings; }while(0)
// Where _settings_ are the following:
// Reference voltage:
#define ADC_REF_1_25_V 0x00 // Internal 1.25V reference
#define ADC_REF_P0_7 0x40 // External reference on AIN7 pin
#define ADC_REF_AVDD 0x80 // AVDD_SOC pin
#define ADC_REF_P0_6_P0_7 0xC0 // External reference on AIN6-AIN7 differential input
// Resolution (decimation rate):
#define ADC_8_BIT 0x00 // 64 decimation rate
#define ADC_10_BIT 0x10 // 128 decimation rate
#define ADC_12_BIT 0x20 // 256 decimation rate
#define ADC_14_BIT 0x30 // 512 decimation rate
// Input channel:
#define ADC_AIN0 0x00 // single ended P0_0
#define ADC_AIN1 0x01 // single ended P0_1
#define ADC_AIN2 0x02 // single ended P0_2
#define ADC_AIN3 0x03 // single ended P0_3
#define ADC_AIN4 0x04 // single ended P0_4
#define ADC_AIN5 0x05 // single ended P0_5
#define ADC_AIN6 0x06 // single ended P0_6
#define ADC_AIN7 0x07 // single ended P0_7
#define ADC_GND 0x0C // Ground
#define ADC_TEMP_SENS 0x0E // on-chip temperature sensor
#define ADC_VDD_3 0x0F // (vdd/3)
//-----------------------------------------------------------------------------
// Macro for starting the ADC in continuous conversion mode
#define ADC_SAMPLE_CONTINUOUS() \
do { ADCCON1 &= ~0x30; ADCCON1 |= 0x10; } while (0)
// Macro for stopping the ADC in continuous mode (and setting the ADC to be
// started manually by ADC_SAMPLE_SINGLE() )
#define ADC_STOP() \
do { ADCCON1 |= 0x30; } while (0)
// Macro for initiating a single sample in single-conversion mode (ADCCON1.STSEL = 11).
#define ADC_SAMPLE_SINGLE() \
do { ADC_STOP(); ADCCON1 |= 0x40; } while (0)
// Macro for configuring the ADC to be started from T1 channel 0. (T1 ch 0 must be in compare mode!!)
#define ADC_TRIGGER_FROM_TIMER1() do { ADC_STOP(); ADCCON1 &= ~0x10; } while (0)
// Expression indicating whether a conversion is finished or not.
#define ADC_SAMPLE_READY() (ADCCON1 & 0x80)
// Macro for setting/clearing a channel as input of the ADC
#define ADC_ENABLE_CHANNEL(ch) ADCCFG |= (0x01<<ch)
#define ADC_DISABLE_CHANNEL(ch) ADCCFG &= ~(0x01<<ch)
/******************************************************************************
* @fn halAdcSampleSingle
*
* @brief
* This function makes the adc sample the given channel at the given
* resolution with the given reference.
*
* Parameters:
*
* @param BYTE reference
* The reference to compare the channel to be sampled.
* BYTE resolution
* The resolution to use during the sample (8, 10, 12 or 14 bit)
* BYTE input
* The channel to be sampled.
*
* @return INT16
* The conversion result
*
******************************************************************************/
INT16 halAdcSampleSingle(BYTE reference, BYTE resolution, UINT8 input);
/******************************************************************************
* @fn halGetAdcValue
*
* @brief
* Returns the result of the last ADC conversion.
*
* Parameters:
*
* @param void
*
* @return INT16
* The ADC value
*
******************************************************************************/
INT16 halGetAdcValue(void);
/******************************************************************************
******************* Power and clock management ********************
*******************************************************************************
These macros are used to set power-mode, clock source and clock speed.
******************************************************************************/
// Macro for getting the clock division factor
#define CLKSPD (CLKCON & 0x07)
// Macro for getting the timer tick division factor.
#define TICKSPD ((CLKCON & 0x38) >> 3)
// Macro for checking status of the crystal oscillator
#define XOSC_STABLE (SLEEP & 0x40)
// Macro for checking status of the high frequency RC oscillator.
#define HIGH_FREQUENCY_RC_OSC_STABLE (SLEEP & 0x20)
// Macro for setting power mode
#define SET_POWER_MODE(mode) \
do { \
if(mode == 0) { SLEEP &= ~0x03; } \
else if (mode == 3) { SLEEP |= 0x03; } \
else { SLEEP &= ~0x03; SLEEP |= mode; } \
PCON |= 0x01; \
asm("NOP"); \
}while (0)
// Where _mode_ is one of
#define POWER_MODE_0 0x00 // Clock oscillators on, voltage regulator on
#define POWER_MODE_1 0x01 // 32.768 KHz oscillator on, voltage regulator on
#define POWER_MODE_2 0x02 // 32.768 KHz oscillator on, voltage regulator off
#define POWER_MODE_3 0x03 // All clock oscillators off, voltage regulator off
// Macro for setting the 32 KHz clock source
#define SET_32KHZ_CLOCK_SOURCE(source) \
do { \
if( source ) { \
CLKCON |= 0x80; \
} else { \
CLKCON &= ~0x80; \
} \
} while (0)
// Where _source_ is one of
#define CRYSTAL 0x00
#define RC 0x01
// Macro for setting the main clock oscillator source,
//turns off the clock source not used
//changing to XOSC will take approx 150 us
#define SET_MAIN_CLOCK_SOURCE(source) \
do { \
if(source) { \
CLKCON |= 0x40; \
while(!HIGH_FREQUENCY_RC_OSC_STABLE); \
if(TICKSPD == 0){ \
CLKCON |= 0x08; \
} \
SLEEP |= 0x04; \
} \
else { \
SLEEP &= ~0x04; \
while(!XOSC_STABLE); \
asm("NOP"); \
CLKCON &= ~0x47; \
SLEEP |= 0x04; \
} \
}while (0)
#endif //HAL_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -