?? drivers.c
字號:
/* Description : driver functions.
*
* $Author: 王琢玉
* $Date: 2007/02/23
* $Name: drivers.c
*/
#define DRIVERS_GLOBALS
#include "include.h"
/* Defines */
#define AssertCE() MC13192_CE = 0; /* Asserts the MC13192 CE pin */
#define DeAssertCE() MC13192_CE = 1; /* Deasserts the MC13192 CE pin */
#define SPIClkInvert SPI1C1 |= 0x04; /*Set CPHA bit of SPCR (clk polarity) */
#define SPIClkNormal SPI1C1 &= 0xFB; /*clr CPHA bit of SPCR (clk polarity) */
/* Globals */
/************************************************************
Function: void interrupt IRQIsr(void)
Parameter:
Return:
Description:
************************************************************/
void interrupt IRQIsr(void)
{
volatile UINT16 u16StatusContent, u16Reg; /*
* Result of the status register
* read
*/
CLRWDT();
CLEAR_IRQ_FLAG; /* Acknowledge the interrupt. MC13192 IRQ pin still low. */
u16StatusContent = SPIDrvRead(STATUS_ADDR); /*
* Read the MC13192 status
* register.
*/
/* Test for IRQ glitch or possible fast double IRQ. */
if(IRQPinLow())
{ //__isflag_int_enabled
/* IRQ is low. Re-read status. */
CLEAR_IRQ_FLAG; /* Acknowledge the interrupt. MC13192 IRQ pin still low. */
u16Reg = SPIDrvRead(STATUS_ADDR); /* Read the MC13192 status register. */
u16StatusContent = u16StatusContent | u16Reg; /*
* Actual status is the OR
* of both.
*/
}
// u16StatusContent &= TX_IRQ_MASK | RX_IRQ_MASK | CRC_VALID_MASK | CCA_IRQ_MASK | TIMER1_IRQ_MASK ;
if ((gu8RTxMode == IDLE_MODE) || ((u16StatusContent & CCA_IRQ_MASK) != 0) || \
((u16StatusContent & TX_IRQ_MASK) != 0))
{
//If in idle mode already or if CCA or TX is done, just return.
PLMESetTrxStateRequest(IDLE_MODE); // Forces the MC13192 to idle.
return;
}
if((u16StatusContent & TIMER1_IRQ_MASK) != 0)
{
SPIDrvWrite(T1_HI_ADDR, 0x8000); // Disables TC1 and clears IRQ
SPIDrvWrite(T1_LO_ADDR, 0x0000);
PLMESetTrxStateRequest(IDLE_MODE);
return;
}
// If rx is done
if ((u16StatusContent & RX_IRQ_MASK) != 0)
{
PLMESetTrxStateRequest(IDLE_MODE); // Forces the MC13192 to idle.
if((u16StatusContent & CRC_VALID_MASK) == 0)
{
// If an invalid CRC, restart receiver.
PLMESetTrxStateRequest(RX_MODE); // Forces the MC13192 to enter the receive mode.
return;
}
else
{
UINT8 u8DataLength;
u8DataLength = (UINT8) (SPIDrvRead(RX_PKT_LEN) & 0x7F);
if (u8DataLength < 3) // Rx_pkt_length is bad when < 3 because of CRC .
{
PLMESetTrxStateRequest(RX_MODE);
return;
}
Zigbee_Flags.bits.RFDataIndication = 1;
return;
}
}
}
/************************************************************
Function: void RTXENDeAssert(void)
Parameter:
Return:
Description: Deassert the MC13192 RTXEN pin (forces IC to idle)
************************************************************/
void RTXENDeAssert(void)
{
MC13192_RTXEN = 0; /* Deassert RTXEN */
}
/************************************************************
Function: void RTXENAssert(void)
Parameter:
Return:
Description: Assert the MC13192 RTXEN pin (initiates programmed cycle)
************************************************************/
void RTXENAssert(void)
{
MC13192_RTXEN = 1; /* Assert RTXEN */
}
/************************************************************
Function: void SPIDrvWrite(UINT8 u8Addr, UINT16 u16Content)
Parameter: u8Addr address of register
u16Content the value that want to write to the register
Return:
Description: Write 1 word to SPI
************************************************************/
void SPIDrvWrite(UINT8 u8Addr, UINT16 u16Content)
{
UINT8 u8TempValue;
CLRWDT();
SaveStatusReg();
SPIClearRecieveStatReg(); /* Clear status register (possible SPRF, SPTEF) */
SPIClearRecieveDataReg(); /*
* Clear receive data register. SPI entirely ready
* for read or write
*/
AssertCE(); /* Enables MC13192 SPI */
SPISendChar(u8Addr & 0x3F); /*
* Mask address, 6bit addr.
* Set write bit (i.e. 0).
*/
SPIWaitTransferDone(); /*
* For this bit to be set, SPTED MUST be set.
* Now write content MSB
*/
SPIClearRecieveDataReg(); /*
* Clear receive data register. SPI entirely
* ready for read or write
*/
SPISendChar(u16Content >> 8); /* Write MSB */// SPI1D = u16Content >> 8;
SPIWaitTransferDone(); /*
* For this bit to be set, SPTED MUST be set.
* Now write content LSB
*/
SPIClearRecieveDataReg(); /*
* Clear receive data register. SPI entirely
* ready for read or write
*/
SPISendChar(u16Content & 0x00FF); /* Write LSB */
SPIWaitTransferDone(); /*
* For this bit to be set, SPTED MUST be set.
* Now read last of garbage
*/
SPIClearRecieveDataReg(); /*
* Clear receive data register. SPI entirely
* ready for read or write
*/
DeAssertCE(); /* Disables MC13192 SPI */
RestoreStatusReg();
}
/************************************************************
Function: UINT16 SPIDrvRead(UINT8 u8Addr)
Parameter: u8Addr address of register
Return: u16Data u16Data[0] is the MSB, u16Data[1] is the LSB
Description: Read 1 word from SPI
************************************************************/
UINT16 SPIDrvRead(UINT8 u8Addr)
{
UINT8 u8TempValue;
UINT16 u16Data; /* u16Data[0] is MSB, u16Data[1] is LSB */
CLRWDT();
SaveStatusReg();
SPIClearRecieveStatReg(); /* Clear status register (possible SPRF, SPTEF) */
SPIClearRecieveDataReg(); /*
* Clear receive data register. SPI entirely
* ready for read or write
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -