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

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

?? twid.c

?? at91sam9263 keilv3 一級啟動代碼,其中晶振頻率為16m
?? C
字號:
/* ----------------------------------------------------------------------------
 *         ATMEL Microcontroller Software Support 
 * ----------------------------------------------------------------------------
 * Copyright (c) 2008, Atmel Corporation
 *
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * - Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the disclaimer below.
 *
 * Atmel's name may not be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
 * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * ----------------------------------------------------------------------------
 */


#define TWITIMEOUTMAX 50000

//------------------------------------------------------------------------------
//         Headers
//------------------------------------------------------------------------------

#include "twid.h"
#include <twi/twi.h>
#include <utility/assert.h>
#include <utility/trace.h>

//------------------------------------------------------------------------------
//         Local types
//------------------------------------------------------------------------------

/// TWI driver callback function.
typedef void (*TwiCallback)(Async *);

//------------------------------------------------------------------------------
/// TWI asynchronous transfer descriptor.
//------------------------------------------------------------------------------
typedef struct _AsyncTwi {

    /// Asynchronous transfer status.
    volatile unsigned char status;
    // Callback function to invoke when transfer completes or fails.
    TwiCallback callback;
    /// Pointer to the data buffer.
    unsigned char *pData;
    /// Total number of bytes to transfer.
    unsigned int num;
    /// Number of already transferred bytes.
    unsigned int transferred;

} AsyncTwi;

//------------------------------------------------------------------------------
//         Global functions
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
/// Initializes a TWI driver instance, using the given TWI peripheral. The
/// peripheral must have been initialized properly before calling this function.
/// \param pTwid  Pointer to the Twid instance to initialize.
/// \param pTwi  Pointer to the TWI peripheral to use.
//------------------------------------------------------------------------------
void TWID_Initialize(Twid *pTwid, AT91S_TWI *pTwi)
{
    TRACE_DEBUG("TWID_Initialize()\n\r");
    SANITY_CHECK(pTwid);
    SANITY_CHECK(pTwi);

    // Initialize driver
    pTwid->pTwi = pTwi;
    pTwid->pTransfer = 0;
}

//------------------------------------------------------------------------------
/// Interrupt handler for a TWI peripheral. Manages asynchronous transfer
/// occuring on the bus. This function MUST be called by the interrupt service
/// routine of the TWI peripheral if asynchronous read/write are needed.
/// \param pTwid  Pointer to a Twid instance.
//------------------------------------------------------------------------------
void TWID_Handler(Twid *pTwid)
{
    unsigned char status;
    AsyncTwi *pTransfer = (AsyncTwi *) pTwid->pTransfer;
    AT91S_TWI *pTwi = pTwid->pTwi;

    SANITY_CHECK(pTwid);

    // Retrieve interrupt status
    status = TWI_GetMaskedStatus(pTwi);

    // Byte received
    if (TWI_STATUS_RXRDY(status)) {

        pTransfer->pData[pTransfer->transferred] = TWI_ReadByte(pTwi);
        pTransfer->transferred++;

        // Transfer finished ?
        if (pTransfer->transferred == pTransfer->num) {

            TWI_DisableIt(pTwi, AT91C_TWI_RXRDY);
            TWI_EnableIt(pTwi, AT91C_TWI_TXCOMP);
        }
        // Last byte ?
        else if (pTransfer->transferred == (pTransfer->num - 1)) {

            TWI_Stop(pTwi);
        }
    }
    // Byte sent
    else if (TWI_STATUS_TXRDY(status)) {

        // Transfer finished ?
        if (pTransfer->transferred == pTransfer->num) {

            TWI_DisableIt(pTwi, AT91C_TWI_TXRDY);
            TWI_EnableIt(pTwi, AT91C_TWI_TXCOMP);
        }
        // Bytes remaining
        else {

            TWI_WriteByte(pTwi, pTransfer->pData[pTransfer->transferred]);
            pTransfer->transferred++;
        }
    }
    // Transfer complete
    else if (TWI_STATUS_TXCOMP(status)) {

        TWI_DisableIt(pTwi, AT91C_TWI_TXCOMP);
        pTransfer->status = 0;
        if (pTransfer->callback) {
            
            pTransfer->callback((Async *) pTransfer);
        }
        pTwid->pTransfer = 0;
    }
}

//-----------------------------------------------------------------------------
/// Asynchronously reads data from a slave on the TWI bus. An optional
/// callback function is triggered when the transfer is complete.
/// Returns 0 if the transfer has been started; otherwise returns a TWI error
/// code.
/// \param pTwid  Pointer to a Twid instance.
/// \param address  TWI slave address.
/// \param iaddress  Optional slave internal address.
/// \param isize  Internal address size in bytes.
/// \param pData  Data buffer for storing received bytes.
/// \param num  Number of bytes to read.
/// \param pAsync  Asynchronous transfer descriptor.
//-----------------------------------------------------------------------------
unsigned char TWID_Read(
    Twid *pTwid,
    unsigned char address,
    unsigned int iaddress,
    unsigned char isize,
    unsigned char *pData,
    unsigned int num,
    Async *pAsync)
{
    AT91S_TWI *pTwi = pTwid->pTwi;
    AsyncTwi *pTransfer = (AsyncTwi *) pTwid->pTransfer;
    unsigned int timeout;

    //TRACE_DEBUG("TWID_Read()\n\r");
    SANITY_CHECK(pTwid);
    SANITY_CHECK((address & 0x80) == 0);
    SANITY_CHECK((iaddress & 0xFF000000) == 0);
    SANITY_CHECK(isize < 4);

    // Check that no transfer is already pending
    if (pTransfer) {

        TRACE_ERROR("TWID_Read: A transfer is already pending\n\r");
        return TWID_ERROR_BUSY;
    }

    // Set STOP signal if only one byte is sent
    if (num == 1) {

        TWI_Stop(pTwi);
    }

    // Asynchronous transfer
    if (pAsync) {
    
        // Update the transfer descriptor
        pTwid->pTransfer = pAsync;
        pTransfer = (AsyncTwi *) pAsync;
        pTransfer->status = ASYNC_STATUS_PENDING;
        pTransfer->pData = pData;
        pTransfer->num = num;
        pTransfer->transferred = 0;
        
        // Enable read interrupt and start the transfer
        TWI_EnableIt(pTwi, AT91C_TWI_RXRDY);
        TWI_StartRead(pTwi, address, iaddress, isize);
    }
    // Synchronous transfer
    else {

        // Start read
        TWI_StartRead(pTwi, address, iaddress, isize);

        // Read all bytes, setting STOP before the last byte
        while (num > 0) {

            // Last byte
            if (num == 1) {

                TWI_Stop(pTwi);
            }

            // Wait for byte then read and store it
            timeout = 0;
            while( !TWI_ByteReceived(pTwi) && (++timeout<TWITIMEOUTMAX) );
            if (timeout == TWITIMEOUTMAX) {
                TRACE_ERROR("TWID Timeout BR\n\r");
            }
            *pData++ = TWI_ReadByte(pTwi);
            num--;
        }

        // Wait for transfer to be complete
        timeout = 0;
        while( !TWI_TransferComplete(pTwi) && (++timeout<TWITIMEOUTMAX) );
        if (timeout == TWITIMEOUTMAX) {
            TRACE_ERROR("TWID Timeout TC\n\r");
        }
    }

    return 0;
}

//------------------------------------------------------------------------------
/// Asynchronously sends data to a slave on the TWI bus. An optional callback
/// function is invoked whenever the transfer is complete.
/// \param pTwid  Pointer to a Twid instance.
/// \param address  Slave address.
/// \param iaddress  Optional slave internal address.
/// \param isize  Number of internal address bytes.
/// \param pData  Data buffer to send.
/// \param num  Number of bytes to send.
/// \param pAsync  Pointer to an Asynchronous transfer descriptor.
//------------------------------------------------------------------------------
unsigned char TWID_Write(
    Twid *pTwid,
    unsigned char address,
    unsigned int iaddress,
    unsigned char isize,
    unsigned char *pData,
    unsigned int num,
    Async *pAsync)
{
    AT91S_TWI *pTwi = pTwid->pTwi;
    AsyncTwi *pTransfer = (AsyncTwi *) pTwid->pTransfer;
    unsigned int timeout;

    //TRACE_DEBUG("TWID_Write()\n\r");
    //TRACE_DEBUG("0x%X\n\r", pData[0]);
    SANITY_CHECK(pTwi);
    SANITY_CHECK((address & 0x80) == 0);
    SANITY_CHECK((iaddress & 0xFF000000) == 0);
    SANITY_CHECK(isize < 4);

    // Check that no transfer is already pending
    if (pTransfer) {

        TRACE_ERROR("TWI_Write: A transfer is already pending\n\r");
        return TWID_ERROR_BUSY;
    }

    // Asynchronous transfer
    if (pAsync) {
    
        // Update the transfer descriptor
        pTwid->pTransfer = pAsync;
        pTransfer = (AsyncTwi *) pAsync;
        pTransfer->status = ASYNC_STATUS_PENDING;
        pTransfer->pData = pData;
        pTransfer->num = num;
        pTransfer->transferred = 1;
    
        // Enable write interrupt and start the transfer
        TWI_StartWrite(pTwi, address, iaddress, isize, *pData);
        TWI_EnableIt(pTwi, AT91C_TWI_TXRDY);
    }
    // Synchronous transfer
    else {

        // Start write
        TWI_StartWrite(pTwi, address, iaddress, isize, *pData++);
        num--;

        // Send all bytes
        while (num > 0) {
        
            // Wait before sending the next byte
            timeout = 0;
            while( !TWI_ByteSent(pTwi) && (++timeout<TWITIMEOUTMAX) );
            if (timeout == TWITIMEOUTMAX) {
                TRACE_ERROR("TWID Timeout BS\n\r");
            }

            TWI_WriteByte(pTwi, *pData++);
            num--;
        }

        // Wait for actual end of transfer
        timeout = 0;

#ifdef TWI_V3XX
        // Send a STOP condition
        TWI_SendSTOPCondition(pTwi);
#endif

        while( !TWI_TransferComplete(pTwi) && (++timeout<TWITIMEOUTMAX) );
        if (timeout == TWITIMEOUTMAX) {
            TRACE_ERROR("TWID Timeout TC2\n\r");
        }

    }
    
    return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本午夜精品视频在线观看| 日韩一区二区三区三四区视频在线观看 | 成人免费高清视频在线观看| 天天综合日日夜夜精品| 亚洲一区二区在线免费观看视频| 亚洲欧洲一区二区在线播放| 国产精品成人一区二区三区夜夜夜| 久久久久99精品一区| 久久久久久久久久电影| 国产香蕉久久精品综合网| www亚洲一区| 国产精品麻豆久久久| 亚洲伦在线观看| 亚洲午夜激情av| 久国产精品韩国三级视频| 国产麻豆午夜三级精品| 国产成人免费视频网站| 波多野结衣一区二区三区| 91色porny在线视频| 欧美军同video69gay| 欧美大片国产精品| 国产精品你懂的在线| 亚洲自拍另类综合| 麻豆精品新av中文字幕| 高清成人免费视频| 欧美综合天天夜夜久久| 欧美区一区二区三区| 久久蜜桃一区二区| 亚洲男人的天堂av| 肉色丝袜一区二区| 成人免费看的视频| 在线电影国产精品| 国产精品视频一区二区三区不卡| 一区二区三区欧美日| 秋霞午夜鲁丝一区二区老狼| 国产精品一级片| 日本丶国产丶欧美色综合| 日韩欧美在线一区二区三区| 欧美国产1区2区| 日韩中文字幕区一区有砖一区| 国产专区综合网| 欧美日韩国产精品自在自线| 国产欧美日韩卡一| 日韩国产欧美三级| 91小视频免费观看| 精品盗摄一区二区三区| 亚洲午夜精品一区二区三区他趣| 极品少妇xxxx精品少妇偷拍| 91成人免费网站| 国产精品免费网站在线观看| 青娱乐精品在线视频| 色欲综合视频天天天| 久久九九99视频| 天涯成人国产亚洲精品一区av| 成人丝袜18视频在线观看| 69成人精品免费视频| 亚洲视频中文字幕| 成人午夜av影视| 国产视频不卡一区| 韩国理伦片一区二区三区在线播放| 色欧美日韩亚洲| 国产精品网站在线播放| 国产一区二区看久久| 欧美一区二区三区播放老司机| 亚洲综合一区二区三区| 成人免费视频一区| 国产性天天综合网| 国产白丝网站精品污在线入口| 精品人在线二区三区| 日韩va亚洲va欧美va久久| 99久久免费精品| 中文字幕视频一区二区三区久| 国产精华液一区二区三区| 精品久久国产97色综合| 首页综合国产亚洲丝袜| 欧美精品日韩一区| 水野朝阳av一区二区三区| 欧美日韩免费不卡视频一区二区三区| 亚洲男人的天堂在线观看| 91丨porny丨首页| 中文字幕日本乱码精品影院| www.66久久| 一区二区三区欧美在线观看| 欧洲一区在线观看| 亚洲国产日韩综合久久精品| 欧美午夜电影一区| 日韩和欧美一区二区三区| 欧美一区二区视频免费观看| 日本欧美久久久久免费播放网| 欧美亚洲动漫制服丝袜| 手机精品视频在线观看| 日韩欧美中文一区| 国产成人av资源| 亚洲色欲色欲www| 欧洲人成人精品| 蜜乳av一区二区| 国产精品久久久久久久岛一牛影视 | 欧美一级久久久| 国产一区二区不卡| 1024成人网| 欧美精品丝袜久久久中文字幕| 久久99精品国产麻豆婷婷| 久久精品视频一区二区| 91在线精品一区二区| 亚洲国产综合人成综合网站| 51精品视频一区二区三区| 国内精品视频666| 亚洲图片你懂的| 日韩一区二区三区三四区视频在线观看 | 91豆麻精品91久久久久久| 日韩不卡一区二区三区| 国产欧美精品一区二区色综合朱莉| 色欧美88888久久久久久影院| 视频在线在亚洲| 国产精品国产成人国产三级| 精品视频免费看| 懂色av一区二区夜夜嗨| 亚洲成人精品一区| 国产精品久久久久久久久免费樱桃| 欧美日韩中文字幕一区| 国产经典欧美精品| 轻轻草成人在线| 亚洲日本在线a| 久久久久久**毛片大全| 91久久一区二区| 成人免费观看男女羞羞视频| 秋霞电影网一区二区| 一区二区成人在线| 欧美激情艳妇裸体舞| 91精品在线观看入口| 91浏览器入口在线观看| 国产精品亚洲人在线观看| 天天av天天翘天天综合网色鬼国产| 国产精品乱人伦| 久久婷婷色综合| 日韩免费性生活视频播放| 欧美午夜影院一区| 91天堂素人约啪| 成人黄色电影在线| 国产福利视频一区二区三区| 日日夜夜免费精品| 一区二区三区日韩在线观看| 最新欧美精品一区二区三区| 国产亚洲综合性久久久影院| 日韩精品一区二区三区三区免费| 欧美日韩中文字幕一区| 91免费版在线| 99re免费视频精品全部| www.色精品| 高清不卡在线观看| 国产999精品久久| 国产·精品毛片| 国产一区不卡在线| 国产精品一二二区| 国产精品一区二区在线看| 国产真实乱子伦精品视频| 美女性感视频久久| 久久99精品久久久久久国产越南 | 国产精品二区一区二区aⅴ污介绍| 日韩精品一区在线| 精品国产青草久久久久福利| 欧美一级专区免费大片| 日韩欧美一二三| 26uuu久久综合| 国产精品―色哟哟| ●精品国产综合乱码久久久久| 亚洲人成在线播放网站岛国| 亚洲精品老司机| 天天操天天色综合| 久久超碰97人人做人人爱| 国内精品国产三级国产a久久| 国内精品伊人久久久久av影院| 国产麻豆欧美日韩一区| 成人av集中营| 欧美在线观看禁18| 日韩欧美久久久| 国产精品福利影院| 亚洲精品日产精品乱码不卡| 午夜日韩在线观看| 国产精品原创巨作av| 99riav一区二区三区| 欧美人与z0zoxxxx视频| 日韩美女一区二区三区四区| 日本一区二区三区国色天香| 亚洲欧美日本在线| 日本三级韩国三级欧美三级| 国产成人自拍在线| 欧美性videosxxxxx| 久久久综合网站| 亚洲午夜一区二区三区| 国产精品1区2区3区| 欧美吞精做爰啪啪高潮| 久久新电视剧免费观看| 亚洲精品网站在线观看| 久久精品99国产精品日本| 91麻豆精品一区二区三区| 日韩免费观看高清完整版| 亚洲欧美日韩中文字幕一区二区三区| 日本欧洲一区二区| 91久久精品午夜一区二区|