⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drivers.c

📁 用于WSN的PDA搜救器
💻 C
📖 第 1 页 / 共 2 页
字号:
/* 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 + -