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

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

?? spid.c

?? Dataflash example for ARM9 using KEIL.
?? 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.
 * ----------------------------------------------------------------------------
 */

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

#include "spid.h"
#include <board.h>

//------------------------------------------------------------------------------
//         Macros
//------------------------------------------------------------------------------

/// Write PMC register
#define WRITE_PMC(pPmc, regName, value) pPmc->regName = (value)

/// Write SPI register
#define WRITE_SPI(pSpi, regName, value) pSpi->regName = (value)

/// Read SPI registers
#define READ_SPI(pSpi, regName) (pSpi->regName)

//------------------------------------------------------------------------------
//         Exported functions
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
/// Initializes the Spid structure and the corresponding SPI hardware.
/// Always returns 0.
/// \param pSpid  Pointer to a Spid instance.
/// \param pSpiHw  Associated SPI peripheral.
/// \param spiId  SPI peripheral identifier.
//------------------------------------------------------------------------------
unsigned char SPID_Configure(Spid *pSpid, AT91S_SPI *pSpiHw, unsigned char spiId)
{
    // Initialize the SPI structure
    pSpid->pSpiHw = pSpiHw;
    pSpid->spiId  = spiId;
    pSpid->semaphore = 1;
    pSpid->pCurrentCommand = 0;

    // Enable the SPI clock
    WRITE_PMC(AT91C_BASE_PMC, PMC_PCER, (1 << pSpid->spiId));
    
    // Execute a software reset of the SPI twice
    WRITE_SPI(pSpiHw, SPI_CR, AT91C_SPI_SWRST);
    WRITE_SPI(pSpiHw, SPI_CR, AT91C_SPI_SWRST);

    // Configure SPI in Master Mode with No CS selected !!!
    WRITE_SPI(pSpiHw, SPI_MR, AT91C_SPI_MSTR | AT91C_SPI_MODFDIS | AT91C_SPI_PCS);
     
    // Disable the PDC transfer    
    WRITE_SPI(pSpiHw, SPI_PTCR, AT91C_PDC_RXTDIS | AT91C_PDC_TXTDIS);

    // Enable the SPI
    WRITE_SPI(pSpiHw, SPI_CR, AT91C_SPI_SPIEN);

    // Enable the SPI clock
    WRITE_PMC(AT91C_BASE_PMC, PMC_PCDR, (1 << pSpid->spiId));
    
    return 0;
}

//------------------------------------------------------------------------------
/// Configures the parameters for the device corresponding to the cs.
/// \param pSpid  Pointer to a Spid instance.
/// \param cs  number corresponding to the SPI chip select.
/// \param csr  SPI_CSR value to setup.
//------------------------------------------------------------------------------
void SPID_ConfigureCS(Spid *pSpid, unsigned char cs, unsigned int csr)
{
    AT91S_SPI *pSpiHw = pSpid->pSpiHw;
    WRITE_SPI(pSpiHw, SPI_CSR[cs], csr);
}
    
//------------------------------------------------------------------------------
/// Starts a SPI master transfer. This is a non blocking function. It will
/// return as soon as the transfer is started.
/// Returns 0 if the transfer has been started successfully; otherwise returns
/// SPID_ERROR_LOCK is the driver is in use, or SPID_ERROR if the command is not
/// valid.
/// \param pSpid  Pointer to a Spid instance.
/// \param pCommand Pointer to the SPI command to execute.
//------------------------------------------------------------------------------
unsigned char SPID_SendCommand(Spid *pSpid, SpidCmd *pCommand)
{
    AT91S_SPI *pSpiHw = pSpid->pSpiHw;
     unsigned int spiMr;
         
     // Try to get the dataflash semaphore
     if (pSpid->semaphore == 0) {
    
         return SPID_ERROR_LOCK;
    }
     pSpid->semaphore--;

    // Enable the SPI clock
    WRITE_PMC(AT91C_BASE_PMC, PMC_PCER, (1 << pSpid->spiId));
    
    // Disable transmitter and receiver
    WRITE_SPI(pSpiHw, SPI_PTCR, AT91C_PDC_RXTDIS | AT91C_PDC_TXTDIS);

     // Write to the MR register
     spiMr = READ_SPI(pSpiHw, SPI_MR);
     spiMr |= AT91C_SPI_PCS;
     spiMr &= ~((1 << pCommand->spiCs) << 16);
    WRITE_SPI(pSpiHw, SPI_MR, spiMr);
        
    // Initialize the two SPI PDC buffer
    WRITE_SPI(pSpiHw, SPI_RPR, (int) pCommand->pCmd);
    WRITE_SPI(pSpiHw, SPI_RCR, pCommand->cmdSize);
    WRITE_SPI(pSpiHw, SPI_TPR, (int) pCommand->pCmd);
    WRITE_SPI(pSpiHw, SPI_TCR, pCommand->cmdSize);
    
    WRITE_SPI(pSpiHw, SPI_RNPR, (int) pCommand->pData);
    WRITE_SPI(pSpiHw, SPI_RNCR, pCommand->dataSize);
    WRITE_SPI(pSpiHw, SPI_TNPR, (int) pCommand->pData);
    WRITE_SPI(pSpiHw, SPI_TNCR, pCommand->dataSize);

    // Initialize the callback
    pSpid->pCurrentCommand = pCommand;
    
    // Enable transmitter and receiver
    WRITE_SPI(pSpiHw, SPI_PTCR, AT91C_PDC_RXTEN | AT91C_PDC_TXTEN);

    // Enable buffer complete interrupt
    WRITE_SPI(pSpiHw, SPI_IER, AT91C_SPI_RXBUFF);
    
    return 0;    
}

//------------------------------------------------------------------------------
/// The SPI_Handler must be called by the SPI Interrupt Service Routine with the
/// corresponding Spi instance.
/// The SPI_Handler will unlock the Spi semaphore and invoke the upper application 
/// callback.
/// \param pSpid  Pointer to a Spid instance.
//------------------------------------------------------------------------------
void SPID_Handler(Spid *pSpid)
{
    SpidCmd *pSpidCmd = pSpid->pCurrentCommand;
    AT91S_SPI *pSpiHw = pSpid->pSpiHw;
    volatile unsigned int spiSr;
    
    // Read the status register
    spiSr = READ_SPI(pSpiHw, SPI_SR);    
    if (spiSr & AT91C_SPI_RXBUFF) {

        // Disable transmitter and receiver
        WRITE_SPI(pSpiHw, SPI_PTCR, AT91C_PDC_RXTDIS | AT91C_PDC_TXTDIS);

        // Disable the SPI clock
        WRITE_PMC(AT91C_BASE_PMC, PMC_PCDR, (1 << pSpid->spiId));

        // Disable buffer complete interrupt
        WRITE_SPI(pSpiHw, SPI_IDR, AT91C_SPI_RXBUFF);

        // Release the dataflash semaphore
        pSpid->semaphore++;
            
        // Invoke the callback associated with the current command
        if (pSpidCmd && pSpidCmd->callback) {
        
            pSpidCmd->callback(0, pSpidCmd->pArgument);
        }
            
        // Nothing must be done after. A new DF operation may have been started
        // in the callback function.
    }
}

//------------------------------------------------------------------------------
/// Returns 1 if the SPI driver is currently busy executing a command; otherwise
/// returns 0.
/// \param pSpid  Pointer to a SPI driver instance.
//------------------------------------------------------------------------------
unsigned char SPID_IsBusy(const Spid *pSpid)
{
    if (pSpid->semaphore == 0) {

        return 1;
    }
    else {

        return 0;
    }
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
视频一区欧美日韩| 精品久久五月天| 色婷婷综合中文久久一本| 国产精品资源网| 99国产精品国产精品毛片| 色婷婷狠狠综合| 日韩一区二区三区视频在线观看| 欧美精品一区二区精品网| 日本一区二区三区dvd视频在线| 欧美极品少妇xxxxⅹ高跟鞋| 亚洲精品免费播放| 青青青伊人色综合久久| 成人教育av在线| 欧美一卡二卡在线观看| 亚洲欧洲日韩av| 国产麻豆视频一区| 欧美伦理电影网| 亚洲久草在线视频| 不卡av在线免费观看| 精品国产第一区二区三区观看体验 | 色婷婷狠狠综合| 国产婷婷色一区二区三区在线| 亚洲高清视频在线| 成人av资源网站| 中文字幕精品一区二区精品绿巨人| 亚洲激情综合网| www.欧美色图| 91在线码无精品| 日本一区二区不卡视频| 国产自产2019最新不卡| 久久午夜电影网| 国产一区二区免费看| 欧美精品一区二| 国产69精品一区二区亚洲孕妇| 国产日本亚洲高清| 91一区二区三区在线播放| 亚洲六月丁香色婷婷综合久久 | 日本不卡视频一二三区| 91在线免费看| 捆绑变态av一区二区三区| 久久中文字幕电影| 欧美在线一区二区| 美女性感视频久久| 亚洲黄色尤物视频| 欧美mv日韩mv国产网站app| 波多野结衣视频一区| 亚洲国产另类精品专区| 亚洲精品一区二区三区精华液 | 成人欧美一区二区三区视频网页| 在线免费不卡电影| av一二三不卡影片| 麻豆专区一区二区三区四区五区| 久久久91精品国产一区二区三区| 色婷婷综合激情| 国产精品77777| 麻豆精品在线播放| 蜜臀久久99精品久久久久宅男| 国产精品久久久久久一区二区三区 | 成人激情文学综合网| 免费成人美女在线观看| 亚洲欧美一区二区三区孕妇| 国产精品青草久久| 国产午夜精品一区二区三区嫩草| 欧美一级欧美三级| 欧美日韩一区不卡| 欧美精品 日韩| 91精品国模一区二区三区| 在线国产电影不卡| 欧美专区日韩专区| 日本乱码高清不卡字幕| 在线观看网站黄不卡| 欧美伊人精品成人久久综合97| 成人黄色免费短视频| 99久久er热在这里只有精品15 | av影院午夜一区| 欧洲视频一区二区| 精品国产123| 亚洲最快最全在线视频| 日本vs亚洲vs韩国一区三区 | 亚洲3atv精品一区二区三区| 亚洲一区日韩精品中文字幕| 亚洲一区在线电影| 亚洲第一会所有码转帖| 成人性色生活片| 一本大道av伊人久久综合| 日韩亚洲电影在线| 亚洲男人的天堂在线aⅴ视频 | 99re视频精品| 7777精品伊人久久久大香线蕉完整版 | 亚洲国产精品一区二区久久| 午夜免费久久看| 色嗨嗨av一区二区三区| 亚洲国产精品t66y| 国产精品综合久久| 日韩精品一区二区三区中文不卡| 亚洲综合在线五月| 色综合一区二区三区| 日韩毛片高清在线播放| 成人不卡免费av| 久久综合九色综合久久久精品综合 | 日韩区在线观看| 日韩电影在线一区| 欧美日韩国产精品自在自线| 中文字幕日本不卡| 91蝌蚪porny| 亚洲成人在线观看视频| 欧美人与性动xxxx| 日韩高清不卡在线| 91精品国产丝袜白色高跟鞋| 日韩国产一二三区| 欧美一区二区三区啪啪| 日韩av电影免费观看高清完整版| 91精品久久久久久久99蜜桃| 麻豆久久一区二区| 国产亚洲短视频| 日本久久一区二区| 激情综合色丁香一区二区| 欧美国产激情一区二区三区蜜月| 粉嫩在线一区二区三区视频| 亚洲美女视频在线观看| 欧美三级电影在线看| 天天爽夜夜爽夜夜爽精品视频| 欧美日韩性生活| 91亚洲精品久久久蜜桃| 麻豆一区二区三| 天堂蜜桃一区二区三区| 国产欧美视频一区二区| 91精品在线免费| 在线亚洲一区二区| 成人综合在线视频| 黑人巨大精品欧美黑白配亚洲| 日韩美女视频一区| 久久精品视频免费| 91麻豆精品91久久久久久清纯 | 国产精品一区二区你懂的| 亚洲综合激情网| 一区二区国产盗摄色噜噜| 国产精品毛片高清在线完整版| 欧美三片在线视频观看| 国产精品香蕉一区二区三区| 亚洲成人tv网| 亚洲一区二区精品久久av| 亚洲女厕所小便bbb| 亚洲人成亚洲人成在线观看图片| 国产精品久久久久aaaa| 一区二区三区不卡视频在线观看| 欧洲一区二区av| 欧美在线小视频| 欧美伦理视频网站| 欧美一二三四区在线| 久久天天做天天爱综合色| 91精品国产综合久久精品app | 亚洲制服丝袜av| 国产精品视频一二三区| 国产人伦精品一区二区| 国产精品福利在线播放| 国产精品女同一区二区三区| 樱桃国产成人精品视频| 亚洲高清不卡在线观看| 开心九九激情九九欧美日韩精美视频电影| 日本成人超碰在线观看| 99久久精品一区| 欧美日韩国产高清一区二区三区| 日韩精品一区二区三区四区| 亚洲国产精品精华液2区45| 亚洲欧美另类在线| 日本特黄久久久高潮| 91视频在线观看| 日韩写真欧美这视频| 国产精品视频在线看| 日韩黄色一级片| 91小视频在线| 国产精品丝袜一区| 五月天激情综合网| 欧美无乱码久久久免费午夜一区 | 日韩一级大片在线| 国产精品久久久久一区二区三区共| 亚洲乱码中文字幕| 国产成人av电影在线| 欧美精品一区二区三区高清aⅴ| 日韩电影在线免费| 欧美美女一区二区三区| 亚洲一区二区三区视频在线| 国产.精品.日韩.另类.中文.在线.播放| 8x福利精品第一导航| 亚洲精品五月天| 在线免费观看成人短视频| 丝袜美腿亚洲一区二区图片| 欧亚一区二区三区| 亚洲一区二区精品久久av| 成人黄动漫网站免费app| 日韩无一区二区| 性做久久久久久久免费看| 欧美va亚洲va香蕉在线| 成人精品视频网站| 亚洲美腿欧美偷拍| 在线亚洲+欧美+日本专区| 免费精品视频在线| 国产精品欧美一区喷水| 欧美视频一区二区三区在线观看 |