📄 hal.h
字号:
/******************************************************************************************************
* TEXAS INSTRUMENTS INC., *
* MSP430 APPLICATIONS. *
* Copyright Texas Instruments Inc, 2004 *
*****************************************************************************************************
* This header file is for the MSP430_RF application. *
* Compiler: IAR Workbench 3.0 or MSP430-GCC *
*****************************************************************************************************/
#ifndef HAL_H
#define HAL_H
/***********************************************************
FAST SPI: Low level functions
***********************************************************/
#define SPI_WAITFOREOTx() while ((U1TCTL & TXEPT) == 0) // USART1 Tx buffer ready?
#define SPI_WAITFOREORx() while ((IFG2 & URXIFG1) == 0) // USART1 Rx buffer ready?
#define FASTSPI_TX(x)\
do {\
U1TXBUF = x;\
SPI_WAITFOREOTx();\
} while(0)
#define FASTSPI_RX(x)\
do {\
U1TXBUF = 0;\
SPI_WAITFOREORx();\
x = U1RXBUF;\
} while(0)
#define FASTSPI_RX_GARBAGE()\
do {\
U1TXBUF = 0;\
SPI_WAITFOREORx();\
U1RXBUF;\
} while(0)
#define FASTSPI_TX_MANY(p,c)\
do {\
for (UINT8 spiCnt = 0; spiCnt < (c); spiCnt++) {\
FASTSPI_TX(((BYTE*)(p))[spiCnt]);\
}\
} while(0)
#define FASTSPI_RX_WORD(x)\
do {\
U1TXBUF = 0;\
SPI_WAITFOREORx();\
x = U1RXBUF << 8;\
U1TXBUF = 0;\
SPI_WAITFOREORx();\
x |= U1RXBUF;\
} while (0)
#define FASTSPI_TX_ADDR(a)\
do {\
U1TXBUF = a;\
SPI_WAITFOREOTx();\
} while (0)
#define FASTSPI_RX_ADDR(a)\
do {\
U1TXBUF = (a) | 0x40;\
SPI_WAITFOREOTx();\
} while (0)
/***********************************************************
FAST SPI: Register access
***********************************************************/
// s = command strobe
// a = register address
// v = register value
#define FASTSPI_STROBE(s) \
do {\
SPI_ENABLE();\
FASTSPI_TX_ADDR(s);\
SPI_DISABLE();\
} while (0)
#define FASTSPI_SETREG(a,v)\
do {\
SPI_ENABLE();\
FASTSPI_TX_ADDR(a);\
FASTSPI_TX((BYTE) ((v) >> 8));\
FASTSPI_TX((BYTE) (v));\
SPI_DISABLE();\
} while (0)
#define FASTSPI_GETREG(a,v)\
do {\
SPI_ENABLE();\
FASTSPI_RX_ADDR(a);\
v= (BYTE)U1RXBUF;\
FASTSPI_RX_WORD(v);\
halWait(1);\
SPI_DISABLE();\
} while (0)
// Updates the SPI status byte
#define FASTSPI_UPD_STATUS(s)\
do {\
SPI_ENABLE();\
U1TXBUF = CC2420_SNOP;\
SPI_WAITFOREOTx();\
s = U1RXBUF;\
SPI_DISABLE();\
} while (0)
/***********************************************************
FAST SPI: FIFO Access
***********************************************************/
// p = pointer to the byte array to be read/written
// c = the number of bytes to read/write
// b = single data byte
#define FASTSPI_WRITE_FIFO(p,c)\
do {\
SPI_ENABLE();\
FASTSPI_TX_ADDR(CC2420_TXFIFO);\
for (UINT8 i = 0; i < (c); i++) {\
FASTSPI_TX(((BYTE*)(p))[i]);\
}\
SPI_DISABLE();\
} while (0)
#define FASTSPI_WRITE_FIFO_NOCE(p,c)\
do {\
FASTSPI_TX_ADDR(CC2420_TXFIFO);\
for (UINT8 spiCnt = 0; spiCnt < (c); spiCnt++) {\
FASTSPI_TX(((BYTE*)(p))[spiCnt]);\
}\
} while (0)
#define FASTSPI_READ_FIFO_BYTE(b)\
do {\
SPI_ENABLE();\
FASTSPI_RX_ADDR(CC2420_RXFIFO);\
U1RXBUF;\
FASTSPI_RX(b);\
halWait(1);\
SPI_DISABLE();\
} while (0)
#define FASTSPI_READ_FIFO_NO_WAIT(p,c)\
do {\
SPI_ENABLE();\
FASTSPI_RX_ADDR(CC2420_RXFIFO);\
U1RXBUF;\
for (UINT8 spiCnt = 0; spiCnt < (c); spiCnt++) {\
FASTSPI_RX(((BYTE*)(p))[spiCnt]);\
}\
halWait(1);\
SPI_DISABLE();\
} while (0)
#define FASTSPI_READ_FIFO_GARBAGE(c)\
do {\
SPI_ENABLE();\
FASTSPI_RX_ADDR(CC2420_RXFIFO);\
U1RXBUF;\
for (UINT8 spiCnt = 0; spiCnt < (c); spiCnt++) {\
FASTSPI_RX_GARBAGE();\
}\
halWait(1);\
SPI_DISABLE();\
} while (0)
/***********************************************************
FAST SPI: CC2420 RAM access (big or little-endian order)
***********************************************************/
// FAST SPI: CC2420 RAM access (big or little-endian order)
// p = pointer to the variable to be written
// a = the CC2420 RAM address
// c = the number of bytes to write
// n = counter variable which is used in for/while loops (UINT8)
//
// Example of usage:
// UINT8 n;
// UINT16 shortAddress = 0xBEEF;
// FASTSPI_WRITE_RAM_LE(&shortAddress, CC2420RAM_SHORTADDR, 2);
#define FASTSPI_WRITE_RAM_LE(p,a,c,n)\
do {\
SPI_ENABLE();\
FASTSPI_TX(0x80 | (a & 0x7F));\
FASTSPI_TX((a >> 1) & 0xC0);\
for (n = 0; n < (c); n++) {\
FASTSPI_TX(((BYTE*)(p))[n]);\
}\
SPI_DISABLE();\
} while (0)
//-------------------------------------------------------------------------------------------------------
// void halWait(UINT16 timeout)
//
// DESCRIPTION:
// Runs an idle loop for [timeout] microseconds.
//
// ARGUMENTS:
// UINT16 timeout
// The timeout in microseconds
//-------------------------------------------------------------------------------------------------------
void halWait(UINT16 timeout);
/*******************************************************************************************************
*******************************************************************************************************
************************** SIMPLE CC2420 FUNCTIONS **************************
*******************************************************************************************************
*******************************************************************************************************/
//-------------------------------------------------------------------------------------------------------
// Example of usage: Starts RX on channel 14 after reset
// FASTSPI_RESET_CC2420();
// FASTSPI_STROBE(CC2420_SXOSCON);
// halRfSetChannel(14);
// ... other registers can for instance be initialized here ...
// halRfWaitForCrystalOscillator();
// ... RAM access can be done here, since the crystal oscillator must be on and stable ...
// FASTSPI_STROBE(CC2420_SRXON);
//-------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------
// void rfWaitForCrystalOscillator(void)
//
// DESCRIPTION:
// Waits for the crystal oscillator to become stable. The flag is polled via the SPI status byte.
//
// Note that this function will lock up if the SXOSCON command strobe has not been given before the
// function call. Also note that global interrupts will always be enabled when this function
// returns.
//-------------------------------------------------------------------------------------------------------
void halRfWaitForCrystalOscillator(void);
//-------------------------------------------------------------------------------------------------------
// void halRfSetChannel(UINT8 Channel)
//
// DESCRIPTION:
// Programs CC2420 for a given IEEE 802.15.4 channel.
// Note that SRXON, STXON or STXONCCA must be run for the new channel selection to take full effect.
//
// PARAMETERS:
// UINT8 channel
// The channel number (11-26)
//-------------------------------------------------------------------------------------------------------
void halRfSetChannel(UINT8 channel);
void halSpiInit(void);
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -