亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? drivers.c

?? FREESCALE 提供的 ZIGBEE協議
?? C
?? 第 1 頁 / 共 2 頁
字號:
/**
 * Copyright (c) 2004, Freescale Semiconductor
 * Freescale Confidential Proprietary
 *
 * File name :  drivers.c
 * Project name: SMAC (Simple Media Access Controller)
 *
 * Department : Freescale Radio Products Division
 *
 * Description : This is the SMAC C source driver file for the HC(S)08 MCU and
 * MC13192 transceiver.
 * The driver controls all interfaces to/from the MC13192 by the SPI, selected 
 * interrupt source and MCU GPIO's assigned to other MC13192 pins.
 * The SMAC driver is the lowest layer of C code.
 * Actual hardware interconnects from the MCU to the MC13192 are defined in the
 * MC13192_hw_config.h header file.
 *
 * $Author: r01160 $
 * $Date: 2005/07/29 03:30:40 $
 * $Name:  $
 */

#include "device_header.h"
#include "pub_def.h"
#include "drivers.h"
#include "MC13192_regs.h"
#include "MC13192_hw_config.h"
#include "mcu_hw_config.h"
#include "mcu_spi_config.h"
#include "simple_phy.h"

/* Globals */
tRxPacket *psDrvRxPacket;
tCCAMeasurement sDrvCCAReading;     /* NOT USED */ 
UINT8 gu8IRQValue = 0;
extern UINT8 gu8RTxMode;

/*
 * IRQIsr : MC13192 initiated IRQ interrupt handler
 *
 * Parameters : None
 *
 * Return : The interrupt will RTI unless valid data is recvd.
 * In this case a PDDataIndication function call-back will be executed first, 
 * followed by a RTI.
 */
#if defined (HCS08G) | defined (HCS08R) | defined (_HCS12)
void interrupt IRQIsr(void)
#elif defined (_56F800E)
void IRQIsr(void)
#endif
{
    /* The vector is defined in vectortable.c */
    volatile UINT16 u16StatusContent, u16Reg, u16Temp;   /* 
                                                 * Result of the status register
                                                 * read
                                                 */
    UINT8 u8DataLength = 0;     /* Data length for the RX packet */

    #if defined (HCS08G) | defined (HCS08R)
    CLEAR_IRQ_FLAG();   /* Acknowledge the interrupt. MC13192 IRQ pin still low. */     
    #endif
    u16StatusContent = SPIDrvRead(STATUS_ADDR); /* 
                                                 * Read the MC13192 status 
                                                 * register.
                                                 */
    /* Test for IRQ glitch or possible fast double IRQ. */

    if(IRQPinLow())       //__isflag_int_enabled
    {        
   
        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 | ATTN_IRQ_MASK | \
                        CRC_VALID_MASK | TIMER1_IRQ_MASK | CCA_IRQ_MASK | \
                        LO_LOCK_IRQ_MASK | DOZE_IRQ_MASK;
                        
    if (gu8RTxMode != RX_MODE_WTO) {
        /* If timeout not being used, mask out timer. */
        u16StatusContent &= ~(TIMER1_IRQ_MASK);
    }
    
    if ((u16StatusContent & ~(CRC_VALID_MASK)) == 0) {
        /* If no status bits are set just return. */
        return;
    }
    
    /* DOZE Complete Interrupt */
    if ((u16StatusContent & DOZE_IRQ_MASK) != 0) {
        SPIDrvWrite(T2_HI_ADDR, 0x8000); /* disable the timer2 */
        u16Temp= SPIDrvRead(MODE2_ADDR);
        u16Temp &= 0xFFFC;                    
        SPIDrvWrite(MODE2_ADDR, u16Temp);/* disable doze/hibernate modes */      
        gu8RTxMode = IDLE_MODE;        
    }  
    
    /* ATTN IRQ Handler*/
    if ((u16StatusContent & ATTN_IRQ_MASK) != 0) {
       /* 
        * If attn interrupt, set the rtx_state mirror.
        * For MC13192 V2.x devices, read the reset indication in R25/7 first. 
        * If a reset is indicated, call back to a reset handler. 
        */
        u16StatusContent = SPIDrvRead(RESIND_ADDR); /* 
                                                     * Read the MC13192 reset 
                                                     * indicator register.
                                                     */
        u16StatusContent &= RESET_BIT_MASK;
        if (u16StatusContent == 0) {            /* Reset */
            gu8RTxMode = MC13192_RESET_MODE;    /* 
                                                 * Set the rtx_state mirror to 
                                                 * idle with attn.
                                                 */
            PLMEMC13192ResetIndication();
            return;
        }
        else {
            gu8RTxMode = IDLE_MODE_ATTN;    /* 
                                             * Set the rtx_state mirror to idle
                                             * with attn.
                                             */
            return;
        }
    }
    /* TIMER1 IRQ Handler (Used for receiver timeout notification) */
    if ((u16StatusContent & TIMER1_IRQ_MASK) != 0) {
        /* If timeout ocurs (and timeout enabled), update mode mirror state. */  
        if (gu8RTxMode == RX_MODE_WTO) {
            /* Clear Timer1 if in RX_MODE_WTO */
            SPIDrvWrite(T1_HI_ADDR, 0x8000); /* Disables TC1 and clears IRQ */
            SPIDrvWrite(T1_LO_ADDR, 0x0000);
            psDrvRxPacket->u8Status = TIMEOUT;
            RTXENDeAssert();                 /* Forces the MC13192 to idle. */
            gu8RTxMode = IDLE_MODE;
            PDDataIndication();              /* TIMEOUT notification */
            return;
        }
    }
    /* LO LOCK IRQ - Occurs when MC13192 loses LOCK */
    /* For receive cycles, re-enable. For transmit/CCA, abort. */
    if ((u16StatusContent & LO_LOCK_IRQ_MASK) != 0) {
        RTXENDeAssert(); /* Forces the MC13192 to idle. */
        /* Unlock from receive cycles */
        if ((gu8RTxMode == RX_MODE) || (gu8RTxMode == RX_MODE_WTO) || \
            (gu8RTxMode == CCA_MODE)) {
            /* Read the MC13192 trx register. Timer trigger off. */
            u16StatusContent = (SPIDrvRead(MODE_ADDR) & 0xFF7F); 
            SPIDrvWrite(MODE_ADDR, u16StatusContent);   /* 
                                                         * Re-write the trx 
                                                         * register.
                                                         */  
            RTXENAssert();          /* Re-start the sequence. */
        }
        else {
            gu8RTxMode = IDLE_MODE;
        }
        return;
    }
    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. */
        RTXENDeAssert();            /* Forces the MC13192 to idle. */
        
        
        /* Check for Pulse TX Mode for PRBS9 Test mode sequence */
        if (gu8RTxMode == PULSE_TX_MODE) {
                u16StatusContent = (SPIDrvRead(MODE_ADDR) & 0xFF7F); /* Read the MC13192 trx register. Timer trigger off. */
                SPIDrvWrite(MODE_ADDR, u16StatusContent); /* Re-write the trx register. */  
                  RTXENAssert(); /* Re-start the sequence. */
            
                #if defined (PA)
            MC13192_PA_CTRL = PA_OFF;       //Turn off the PA when TX is complete
            #endif
            return;
        }
        
        gu8RTxMode = IDLE_MODE;
        return;
    }
    /* If rx is done */
    if ((u16StatusContent & RX_IRQ_MASK) != 0) 
    {  
        RTXENDeAssert();            /* Forces the MC13192 to idle. */
        if ((u16StatusContent & CRC_VALID_MASK) == 0) 
        {
            /* If an invalid CRC, restart receiver. */
            /* Read the MC13192 trx register. Timer trigger off. */
            u16StatusContent = (SPIDrvRead(MODE_ADDR) & 0xFF7F); 
            /* Update the trx register */          
            SPIDrvWrite(MODE_ADDR, u16StatusContent); 
            RTXENAssert(); /* Forces the MC13192 to enter the receive mode. */
            return;
        }
        else {
            /* Read received packet length register and mask off length bits */
            u8DataLength = (UINT8) (SPIDrvRead(RX_PKT_LEN) & 0x7F);
            if (u8DataLength < 5) /* Rx_pkt_length is bad when <5 because of CRC and byte codes. */
            {
                /* Read the MC13192 trx register. Timer trigger off. */                
                u16StatusContent = (SPIDrvRead(MODE_ADDR) & 0xFF7F); 
                /* Update the trx register. */ 
                SPIDrvWrite(MODE_ADDR, u16StatusContent);
                /* Forces the MC13192 to enter the receive mode. */
                RTXENAssert();  
                return;
            }
            /* Test the Byte Codes */
            u16Temp = SPIDrvRead2(RX_PKT); /* Get the code bytes */
            
            if (u16Temp != 0xFF7E) 
            {
                /* Read the MC13192 trx register. Timer trigger off. */                
                u16StatusContent = (SPIDrvRead(MODE_ADDR) & 0xFF7F); 
                /* Update the trx register. */ 
                SPIDrvWrite(MODE_ADDR, u16StatusContent);
                /* Forces the MC13192 to enter the receive mode. */
                RTXENAssert();  
                return;
            }
            
            /* A valid packet has been received. */
            gu8RTxMode = IDLE_MODE;             /* Set the rtx_state to idle */
            SPIDrvWrite(T1_HI_ADDR, 0x8000);    /* 
                                                 * Disables TC1 and clears the 
                                                 * IRQ. 
                                                 */
            SPIDrvWrite(T1_LO_ADDR, 0x0000);
            psDrvRxPacket->u8DataLength = u8DataLength;
            psDrvRxPacket->u8Status = SUCCESS;
            PDDataIndication(); /* Notify PHY that there is data available. */
            return;
        }
    }
}


/*
 * SPIDrvWrite : Write 1 word to SPI
 *
 * Parameters : u8Addr - SPI address
 * u16Content - Data to send
 *
 * Return : None
 */
void SPIDrvWrite(UINT8 u8Addr, UINT16 u16Content)
{
    UINT8 u8TempValue;

  SPIClearRecieveStatReg(); /* Clear status register (possible SPRF, SPTEF) */  
  SPIClearRecieveDataReg(); /* 
                             * Clear receive data register. SPI entirely ready 
                             * for read or write 
                             */                       
  MC13192DisableInterrupts();   /* Necessary to prevent double SPI access */
  AssertCE();                   /* Enables MC13192 SPI */
  SPISendChar((UINT8)(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((UINT8)(u16Content >> 8));    /* Write MSB */       
  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((UINT8)(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 */
  MC13192RestoreInterrupts();   /* Restore MC13192 interrupt status */
}


/*
 * SPIDrvRead : Read 1 word from SPI
 *
 * Parameters : u8Addr - SPI address
 *
 * Return : u16Data -  u16Data[0] is the MSB, u16Data[1] is the LSB
 */
UINT16 SPIDrvRead(UINT8 u8Addr)
{
    UINT8 u8TempValue;
    UINT16  u16Data;            /* u16Data[0] is MSB, u16Data[1] is LSB */

    SPIClearRecieveStatReg();   /* Clear status register (possible SPRF, SPTEF) */  
    SPIClearRecieveDataReg();   /* 
                                 * Clear receive data register. SPI entirely 
                                 * ready for read or write
                                 */                       
    MC13192DisableInterrupts(); /* Necessary to prevent double SPI access */
    AssertCE();                 /* Enables MC13192 SPI */
    SPISendChar((UINT8)((u8Addr & 0x3f) | 0x80));   /* Mask address, 6bit addr, Set 
                                                     * read bit. 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色综合天天性综合| 亚洲精品在线网站| 欧美精品一区二区三区四区 | 亚洲一区欧美一区| 免费观看成人av| 色婷婷av一区| 久久精品一区二区三区不卡牛牛| 亚洲图片你懂的| 国产乱子轮精品视频| 色女孩综合影院| 国产亚洲午夜高清国产拍精品 | 99国产精品久久| 欧美xfplay| 亚洲国产中文字幕在线视频综合 | 91精品福利在线一区二区三区| 中文字幕免费不卡| 国产在线一区二区综合免费视频| 在线观看视频欧美| 日韩美女精品在线| 懂色av一区二区三区蜜臀| 欧美成人一区二区三区片免费 | 国产午夜亚洲精品午夜鲁丝片| 亚洲成人一二三| 色欧美88888久久久久久影院| 国产亚洲欧洲一区高清在线观看| av中文字幕一区| 久久嫩草精品久久久精品一| 日本系列欧美系列| 欧美精品vⅰdeose4hd| 亚洲精品欧美综合四区| 97se亚洲国产综合自在线不卡| 久久亚洲精品国产精品紫薇| 久久电影网站中文字幕 | 99在线精品观看| 国产欧美日韩视频一区二区 | 日韩视频在线你懂得| 香蕉久久一区二区不卡无毒影院| 色狠狠桃花综合| 亚洲精品少妇30p| 在线亚洲+欧美+日本专区| 亚洲免费在线观看| 欧美在线观看视频在线| 亚洲国产精品欧美一二99| 欧美色爱综合网| 午夜av一区二区三区| 91精品国产乱| 激情偷乱视频一区二区三区| 久久久久久久综合狠狠综合| 国产不卡在线视频| 中文字幕亚洲精品在线观看| 97se亚洲国产综合在线| 亚洲激情第一区| 欧美精品高清视频| 狠狠狠色丁香婷婷综合激情| 久久综合九色欧美综合狠狠| 国产精品一区二区x88av| 国产精品美女久久久久久久久久久 | 丝袜诱惑亚洲看片| 欧美成人r级一区二区三区| 国产精品一区二区三区网站| 中文字幕在线观看不卡| 欧美日韩国产a| 在线免费观看日本欧美| 亚洲一区二区三区爽爽爽爽爽| 欧美日韩视频在线观看一区二区三区| 日韩不卡一二三区| 中文字幕国产一区二区| 91国偷自产一区二区三区观看| 日韩国产欧美三级| 欧美经典一区二区| 欧美日韩成人综合天天影院| 国产精品影视网| 香蕉加勒比综合久久| 国产日韩欧美不卡在线| 欧美私模裸体表演在线观看| 精品一区二区久久| 亚洲乱码中文字幕| 337p日本欧洲亚洲大胆色噜噜| 91在线视频播放| 九九在线精品视频| 亚洲综合男人的天堂| 久久久久成人黄色影片| 欧美日本在线一区| 北岛玲一区二区三区四区| 日韩电影免费在线| 亚洲日本一区二区| 久久久久久久久久久久电影| 欧美亚洲综合在线| 成人av在线看| 精品一区二区综合| 亚洲h动漫在线| 亚洲日本在线a| 国产精品麻豆99久久久久久| 91精品国产综合久久精品| 91麻豆6部合集magnet| 国产老肥熟一区二区三区| 五月天亚洲精品| 玉米视频成人免费看| 国产欧美视频在线观看| 日韩视频永久免费| 777亚洲妇女| 欧美日韩精品福利| 在线观看亚洲a| 色美美综合视频| 日韩一区二区在线观看| 欧美三级电影在线看| 99久久99久久综合| av电影天堂一区二区在线观看| 国产乱人伦偷精品视频不卡 | 亚洲免费观看高清完整版在线观看熊 | 日韩福利视频网| 亚洲国产欧美在线人成| 亚洲乱码日产精品bd| 亚洲婷婷在线视频| 亚洲同性gay激情无套| 成人欧美一区二区三区小说| 国产精品系列在线| 国产精品不卡一区| 自拍视频在线观看一区二区| 一区在线播放视频| 亚洲精品国产一区二区精华液| 1区2区3区欧美| 亚洲女子a中天字幕| 一区二区三区鲁丝不卡| 亚洲猫色日本管| 亚洲国产成人av网| 轻轻草成人在线| 激情成人午夜视频| 国产精品白丝jk白祙喷水网站| 国产成人精品免费| 97久久精品人人澡人人爽| 色老汉一区二区三区| 欧美午夜视频网站| 日韩美女视频一区二区在线观看| 精品奇米国产一区二区三区| 国产亚洲欧洲997久久综合 | 香蕉成人伊视频在线观看| 天堂精品中文字幕在线| 美女性感视频久久| 成人手机在线视频| 欧洲一区二区三区在线| 91麻豆精品国产| 久久亚洲精精品中文字幕早川悠里 | 日韩一区二区高清| 国产亚洲欧美中文| 亚洲综合在线免费观看| 奇米精品一区二区三区四区| 国产成人福利片| 色偷偷久久一区二区三区| 欧美福利电影网| 国产欧美一区二区三区沐欲| 成人欧美一区二区三区视频网页| 偷窥国产亚洲免费视频| 国产精品18久久久久久vr| 一本到不卡精品视频在线观看| 在线播放视频一区| 国产精品福利一区| 日韩中文字幕亚洲一区二区va在线| 国内一区二区在线| 色噜噜久久综合| 久久久91精品国产一区二区精品| 亚洲色图另类专区| 韩国精品一区二区| 欧美日韩在线不卡| 中文字幕久久午夜不卡| 日韩成人免费电影| 日本二三区不卡| 久久久青草青青国产亚洲免观| 亚洲综合偷拍欧美一区色| 国产伦精一区二区三区| 制服丝袜激情欧洲亚洲| 国产精品二三区| 韩国女主播成人在线观看| 欧美综合视频在线观看| 国产精品视频观看| 美女一区二区视频| 欧美日韩一级片在线观看| 国产精品网曝门| 国产在线播精品第三| 欧美精品久久一区二区三区| 亚洲黄一区二区三区| 粉嫩一区二区三区性色av| 日韩精品一区二区三区中文精品| 亚洲图片欧美色图| 91免费国产在线观看| 亚洲国产经典视频| 精品一二三四在线| 91精品视频网| 天天亚洲美女在线视频| 91久久精品一区二区三区| 国产精品久久久久久亚洲伦| 国产美女娇喘av呻吟久久| 欧美不卡在线视频| 另类调教123区| 日韩欧美国产综合| 奇米亚洲午夜久久精品| 这里只有精品电影| 丝袜亚洲另类欧美综合| 欧美另类久久久品| 男人的天堂久久精品|