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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? emac.c

?? IAR5.2下 AT91SAM9260 ARM 對 MCP2515 控制源化碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
{
    AT91C_BASE_EMAC->EMAC_MAN = (AT91C_EMAC_SOF & (0x01 << 30))
                              | (AT91C_EMAC_CODE & (2 << 16))
                              | (AT91C_EMAC_RW & (2 << 28))
                              | (AT91C_EMAC_PHYA & ((PhyAddress & 0x1f) << 23))
                              | (AT91C_EMAC_REGA & (Address << 18));

    if ( EMAC_WaitPhy(retry) == 0 ) {

        trace_LOG(trace_ERROR, "TimeOut EMAC_ReadPhy\n\r");
        return 0;
    }
    *pValue = ( AT91C_BASE_EMAC->EMAC_MAN & 0x0000ffff );
    return 1;
}

//-----------------------------------------------------------------------------
/// Write PHY register
/// Return 1 if successfully, 0 if timeout.
/// \param PhyAddress PHY Address
/// \param Address Register Address
/// \param Value Data to write ( Actually 16 bit data )
/// \param retry The retry times, 0 to wait forever until complete.
//-----------------------------------------------------------------------------
unsigned char EMAC_WritePhy(unsigned char PhyAddress,
                            unsigned char Address,
                            unsigned int  Value,
                            unsigned int  retry)
{
    AT91C_BASE_EMAC->EMAC_MAN = (AT91C_EMAC_SOF & (0x01 << 30))
                              | (AT91C_EMAC_CODE & (2 << 16))
                              | (AT91C_EMAC_RW & (1 << 28))
                              | (AT91C_EMAC_PHYA & ((PhyAddress & 0x1f) << 23))
                              | (AT91C_EMAC_REGA & (Address << 18))
                              | (AT91C_EMAC_DATA & Value) ;
    if ( EMAC_WaitPhy(retry) == 0 ) {

        trace_LOG(trace_ERROR, "TimeOut EMAC_WritePhy\n\r");
        return 0;
    }
    return 1;
}

//-----------------------------------------------------------------------------
/// Setup the EMAC for the link : speed 100M/10M and Full/Half duplex
/// \param speed        Link speed, 0 for 10M, 1 for 100M
/// \param fullduplex   1 for Full Duplex mode
//-----------------------------------------------------------------------------
void EMAC_SetLinkSpeed(unsigned char speed, unsigned char fullduplex)
{
    unsigned int ncfgr;

    ncfgr = AT91C_BASE_EMAC->EMAC_NCFGR;
    ncfgr &= ~(AT91C_EMAC_SPD | AT91C_EMAC_FD);
    if (speed) {

        ncfgr |= AT91C_EMAC_SPD;
    }
    if (fullduplex) {

        ncfgr |= AT91C_EMAC_FD;
    }
    AT91C_BASE_EMAC->EMAC_NCFGR = ncfgr;
}



//-----------------------------------------------------------------------------
//          EMAC functions
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
/// EMAC Interrupt handler
//-----------------------------------------------------------------------------
void EMAC_Handler(void)
{
    volatile EmacTxTDescriptor *pTxTd;
    volatile EMAC_TxCallback   *pTxCb;
    unsigned int isr;
    unsigned int rsr;
    unsigned int tsr;
    unsigned int rxStatusFlag;
    unsigned int txStatusFlag;

    //trace_LOG(trace_DEBUG, "EMAC_Handler\n\r");
    isr = AT91C_BASE_EMAC->EMAC_ISR & AT91C_BASE_EMAC->EMAC_IMR;
    rsr = AT91C_BASE_EMAC->EMAC_RSR;
    tsr = AT91C_BASE_EMAC->EMAC_TSR;

    // RX packet
    if ((isr & AT91C_EMAC_RCOMP) || (rsr & AT91C_EMAC_REC)) {
        rxStatusFlag = AT91C_EMAC_REC;

        // Frame received
        EmacStatistics.rx_packets++;

        // Check OVR
        if (rsr & AT91C_EMAC_OVR) {
            rxStatusFlag |= AT91C_EMAC_OVR;
            EmacStatistics.rx_ovrs++;
        }
        // Check BNA
        if (rsr & AT91C_EMAC_BNA) {
            rxStatusFlag |= AT91C_EMAC_BNA;
            EmacStatistics.rx_bnas++;
        }
        // Clear status
        AT91C_BASE_EMAC->EMAC_RSR |= rxStatusFlag;

        // Invoke callbacks
        if (rxTd.rxCb) {
            rxTd.rxCb(rxStatusFlag);
        }
    }

    // TX packet
    if ((isr & AT91C_EMAC_TCOMP) || (tsr & AT91C_EMAC_COMP)) {

        txStatusFlag = AT91C_EMAC_COMP;
        EmacStatistics.tx_comp ++;

        // A frame transmitted
        // Check RLE
        if (tsr & AT91C_EMAC_RLES) {
            txStatusFlag |= AT91C_EMAC_RLES;
            EmacStatistics.tx_errors++;
        }
        // Check COL
        if (tsr & AT91C_EMAC_COL) {
            txStatusFlag |= AT91C_EMAC_COL;
            EmacStatistics.collisions++;
        }
        // Check BEX
        if (tsr & AT91C_EMAC_BEX) {
            txStatusFlag |= AT91C_EMAC_BEX;
            EmacStatistics.tx_exausts++;
        }
        // Check UND
        if (tsr & AT91C_EMAC_UND) {
            txStatusFlag |= AT91C_EMAC_UND;
            EmacStatistics.tx_underruns++;
        }
        // Clear status
        AT91C_BASE_EMAC->EMAC_TSR |= txStatusFlag;

        // Sanity check: Tx buffers have to be scheduled
        ASSERT(!CIRC_EMPTY(&txTd),
            "-F- EMAC Tx interrupt received meanwhile no TX buffers has been scheduled\n\r");

        // Check the buffers
        while (CIRC_CNT(txTd.head, txTd.tail, TX_BUFFERS)) {
            pTxTd = txTd.td + txTd.tail;
            pTxCb = txTd.txCb + txTd.tail;

            // Exit if buffer has not been sent yet
            if ((pTxTd->status & EMAC_TX_USED_BIT) == 0) {
                break;
            }

            // Notify upper layer that packet has been sent
            if (*pTxCb) {
                (*pTxCb)(txStatusFlag);
            }

            CIRC_INC( txTd.tail, TX_BUFFERS );
        }

        // If a wakeup has been scheduled, notify upper layer that it can send
        // other packets, send will be successfull.
        if( (CIRC_SPACE(txTd.head, txTd.tail, TX_BUFFERS) >= txTd.wakeupThreshold)
         &&  txTd.wakeupCb) {
            txTd.wakeupCb();
        }
    }
}

//-----------------------------------------------------------------------------
/// Initialize the EMAC with the emac controller address
/// \param id     HW ID for power management
/// \param pTxWakeUpfct Thresold TX Wakeup Callback
/// \param pRxfct       RX Wakeup Callback
/// \param pMacAddress  Mac Address
/// \param enableCAF    enable AT91C_EMAC_CAF if needed by application
/// \param enableNBC    AT91C_EMAC_NBC if needed by application
//-----------------------------------------------------------------------------
void EMAC_Init( unsigned char id, const unsigned char *pMacAddress,
                unsigned char enableCAF, unsigned char enableNBC )
{
    int Index;
    unsigned int Address;

    // Check parameters
    ASSERT(RX_BUFFERS * EMAC_RX_UNITSIZE > EMAC_FRAME_LENTGH_MAX,
           "E: RX buffers too small\n\r");

    trace_LOG(trace_DEBUG, "EMAC_Init\n\r");

    // Power ON
    AT91C_BASE_PMC->PMC_PCER = 1 << id;

    // Disable TX & RX and more
    AT91C_BASE_EMAC->EMAC_NCR = 0;

    // disable
    AT91C_BASE_EMAC->EMAC_IDR = ~0;

    rxTd.idx = 0;
    CIRC_CLEAR(&txTd);

    // Setup the RX descriptors.
    for(Index = 0; Index < RX_BUFFERS; Index++) {

        Address = (unsigned int)(&(pRxBuffer[Index * EMAC_RX_UNITSIZE]));
        // Remove EMAC_RX_OWNERSHIP_BIT and EMAC_RX_WRAP_BIT
        rxTd.td[Index].addr = Address & EMAC_ADDRESS_MASK;
        rxTd.td[Index].status = 0;
    }
    rxTd.td[RX_BUFFERS - 1].addr |= EMAC_RX_WRAP_BIT;

    // Setup the TX descriptors.
    for(Index = 0; Index < TX_BUFFERS; Index++) {

        Address = (unsigned int)(&(pTxBuffer[Index * EMAC_TX_UNITSIZE]));
        txTd.td[Index].addr = Address;
        txTd.td[Index].status = EMAC_TX_USED_BIT;
    }
    txTd.td[TX_BUFFERS - 1].status = EMAC_TX_USED_BIT | EMAC_TX_WRAP_BIT;

    // Set the MAC address
    if( pMacAddress != (unsigned char *)0 ) {
        AT91C_BASE_EMAC->EMAC_SA1L = ( ((unsigned int)pMacAddress[3] << 24)
                                     | ((unsigned int)pMacAddress[2] << 16)
                                     | ((unsigned int)pMacAddress[1] << 8 )
                                     |                pMacAddress[0] );

        AT91C_BASE_EMAC->EMAC_SA1H = ( ((unsigned int)pMacAddress[5] << 8 )
                                     |                pMacAddress[4] );
    }
    // Now setup the descriptors
    // Receive Buffer Queue Pointer Register
    AT91C_BASE_EMAC->EMAC_RBQP = (unsigned int) (rxTd.td);
    // Transmit Buffer Queue Pointer Register
    AT91C_BASE_EMAC->EMAC_TBQP = (unsigned int) (txTd.td);

    AT91C_BASE_EMAC->EMAC_NCR = AT91C_EMAC_CLRSTAT;

    // Clear all status bits in the receive status register.
    AT91C_BASE_EMAC->EMAC_RSR = (AT91C_EMAC_OVR | AT91C_EMAC_REC | AT91C_EMAC_BNA);

    // Clear all status bits in the transmit status register
    AT91C_BASE_EMAC->EMAC_TSR = ( AT91C_EMAC_UBR | AT91C_EMAC_COL | AT91C_EMAC_RLES
                                | AT91C_EMAC_BEX | AT91C_EMAC_COMP
                                | AT91C_EMAC_UND );

    // Clear interrupts
    AT91C_BASE_EMAC->EMAC_ISR;

    // Enable the copy of data into the buffers
    // ignore broadcasts, and don't copy FCS.
    AT91C_BASE_EMAC->EMAC_NCFGR |= (AT91C_EMAC_DRFCS | AT91C_EMAC_PAE);

    if( enableCAF == EMAC_CAF_ENABLE ) {
        AT91C_BASE_EMAC->EMAC_NCFGR |= AT91C_EMAC_CAF;
    }
    if( enableNBC == EMAC_NBC_ENABLE ) {
        AT91C_BASE_EMAC->EMAC_NCFGR |= AT91C_EMAC_NBC;
    }

    // Enable Rx and Tx, plus the stats register.
    AT91C_BASE_EMAC->EMAC_NCR |= (AT91C_EMAC_TE | AT91C_EMAC_RE | AT91C_EMAC_WESTAT);

    // Setup the interrupts for TX (and errors)
    AT91C_BASE_EMAC->EMAC_IER = AT91C_EMAC_RXUBR
                              | AT91C_EMAC_TUNDR
                              | AT91C_EMAC_RLEX
                              | AT91C_EMAC_TXERR
                              | AT91C_EMAC_TCOMP
                              | AT91C_EMAC_ROVR

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜视频在线观看一区二区三区| 成人免费毛片aaaaa**| 激情综合五月天| 成人美女视频在线观看18| 欧美亚洲国产怡红院影院| 精品国一区二区三区| 中文字幕欧美一| 裸体歌舞表演一区二区| 色88888久久久久久影院野外| 欧美日韩国产高清一区二区 | 欧美日韩免费在线视频| 中文字幕乱码日本亚洲一区二区| 日日夜夜精品视频天天综合网| 成人高清视频免费观看| 久久久噜噜噜久噜久久综合| 天堂在线亚洲视频| 欧美亚洲国产一卡| 亚洲日本在线天堂| 成人高清视频免费观看| 国产欧美一区二区精品秋霞影院| 久久国产精品99久久久久久老狼| 在线电影一区二区三区| 亚洲国产视频直播| 欧美揉bbbbb揉bbbbb| 亚洲国产中文字幕在线视频综合 | 国产成人精品免费在线| 日韩欧美第一区| 免费高清在线视频一区·| 欧美日韩国产综合视频在线观看| 亚洲国产综合91精品麻豆| 欧美影视一区二区三区| 亚洲精品视频在线看| 色老头久久综合| 亚洲高清免费观看| 56国语精品自产拍在线观看| 视频一区二区不卡| 日韩欧美自拍偷拍| 国产美女在线精品| 亚洲国产激情av| 91视频免费播放| 午夜精品一区在线观看| 欧美日韩一区不卡| 日本 国产 欧美色综合| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 777久久久精品| 久久99久久99精品免视看婷婷 | 在线观看日韩精品| 亚洲成人三级小说| 精品欧美一区二区在线观看| 国产精品综合久久| 成人免费在线播放视频| 欧美三级电影网| 狠狠色狠狠色综合| 国产精品久久久久aaaa| 欧美专区日韩专区| 国产成人免费视频一区| 国产精品不卡在线观看| 在线观看亚洲精品视频| 看电影不卡的网站| 亚洲人一二三区| 91麻豆精品国产91久久久久久久久 | 欧美大片一区二区| 懂色av一区二区在线播放| 一区二区三区四区激情 | 美国毛片一区二区三区| 中国色在线观看另类| 欧美性生活影院| 国产精品乡下勾搭老头1| 亚洲视频在线一区观看| 欧美岛国在线观看| 日本精品一区二区三区四区的功能| 日韩精品国产精品| 亚洲欧洲性图库| 日韩精品一区二| 在线观看视频一区二区欧美日韩| 国产综合色视频| 一个色综合av| 国产精品每日更新| 欧美电视剧在线看免费| 欧美亚洲综合一区| av亚洲精华国产精华精华| 久久99蜜桃精品| 亚洲成人激情综合网| 国产精品全国免费观看高清| 欧美一区二区三区人| 91久久精品日日躁夜夜躁欧美| 国产乱码精品一区二区三区忘忧草 | 日本一区二区不卡视频| 91精品国产一区二区三区| www.66久久| 国产成人午夜精品影院观看视频 | 成人午夜在线视频| 另类小说视频一区二区| 亚洲一区在线视频观看| 国产精品国产自产拍在线| 久久久777精品电影网影网 | 欧美精品在欧美一区二区少妇| 97精品视频在线观看自产线路二| 国产麻豆视频精品| 精品无人区卡一卡二卡三乱码免费卡| 一二三区精品视频| 亚洲狼人国产精品| 一区在线观看免费| 国产日本亚洲高清| 久久久久久久久久久久久久久99 | 欧美日韩一区不卡| 在线观看亚洲a| 欧美三电影在线| 欧美日韩国产一级| 欧美老肥妇做.爰bbww| 欧美三区在线视频| 欧美在线观看一区| 欧美性生活大片视频| 欧美亚一区二区| 欧美日本一区二区| 欧美高清你懂得| 91精品国产福利| 欧美大片一区二区三区| www国产成人| 国产精品日韩成人| 1024国产精品| 亚洲高清视频在线| 全国精品久久少妇| 久久99精品国产麻豆不卡| 国内成+人亚洲+欧美+综合在线| 国产一区二区三区精品视频| 国产精品66部| 91丝袜美腿高跟国产极品老师| 91丝袜美女网| 欧美精品第1页| 精品国产欧美一区二区| 亚洲国产精品传媒在线观看| 亚洲欧美一区二区三区国产精品 | 精品亚洲国内自在自线福利| 国产在线播放一区二区三区| 成人一区二区在线观看| www.激情成人| 欧美剧情片在线观看| 2017欧美狠狠色| 亚洲女子a中天字幕| 午夜视黄欧洲亚洲| 国产精品综合二区| 在线看日韩精品电影| 精品免费国产二区三区| 国产精品欧美精品| 天天av天天翘天天综合网 | 日韩精品亚洲一区二区三区免费| 久久成人精品无人区| gogogo免费视频观看亚洲一| 欧美日韩一区高清| 久久久天堂av| 亚洲一区在线电影| 国产大陆精品国产| 91精品国产高清一区二区三区| 国产精品情趣视频| 日本中文字幕一区二区视频 | 在线观看亚洲一区| 久久伊人蜜桃av一区二区| 亚洲欧美国产毛片在线| 久久 天天综合| 欧美自拍偷拍午夜视频| 欧美激情艳妇裸体舞| 日韩精品一二三四| 91小宝寻花一区二区三区| 日韩三级免费观看| 亚洲精品国久久99热| 韩国女主播一区二区三区| 欧美午夜片在线看| 久久综合九色欧美综合狠狠| 亚洲国产va精品久久久不卡综合| 国产精品一区三区| 日韩一区二区免费电影| 亚洲精品写真福利| 成人动漫一区二区三区| 欧美成人aa大片| 午夜影院在线观看欧美| 91看片淫黄大片一级| 国产偷v国产偷v亚洲高清| 日本成人在线电影网| 在线观看亚洲精品视频| 亚洲靠逼com| 波多野结衣中文字幕一区二区三区| 337p亚洲精品色噜噜噜| 亚洲综合另类小说| 色婷婷综合久久久中文字幕| 国产欧美精品日韩区二区麻豆天美| 美女视频黄久久| 欧美福利视频一区| 亚洲国产精品久久久久秋霞影院| www.欧美精品一二区| 中文字幕 久热精品 视频在线| 国产成人啪免费观看软件| 亚洲精品一区二区三区在线观看| 麻豆国产精品777777在线| 欧美一区二区三区四区久久 | 4438亚洲最大| 日韩高清在线不卡| 欧美猛男超大videosgay| 午夜精品成人在线视频| 欧美久久一二区|