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

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

?? at45.c

?? at91sam9260-ek library file
?? 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 "at45.h"
#include <board.h>
#include <utility/assert.h>

#include <string.h>

//------------------------------------------------------------------------------
//         Internal definitions
//------------------------------------------------------------------------------

/// Number of dataflash which can be recognized.
#define NUMDATAFLASH    (sizeof(at45Devices) / sizeof(At45Desc))

//------------------------------------------------------------------------------
//         Internal variables
//------------------------------------------------------------------------------

static const At45Desc at45Devices[] = {
    {  512,  264,  9, 0x0C, "AT45DB011B"},
    { 1024,  264,  9, 0x14, "AT45DB021B"},
    { 2048,  264,  9, 0x1C, "AT45DB041B"},
    { 4096,  264,  9, 0x24, "AT45DB081B"},
    { 4096,  528, 10, 0x2C, "AT45DB161B"},
    { 8192,  528, 10, 0x34, "AT45DB321B"},
    { 8192, 1056, 11, 0x3C, "AT45DB642D"},
    {16384, 1056, 11, 0x10, "AT45DB1282"},
    {16384, 2112, 12, 0x18, "AT45DB2562"},
    {32768, 2112, 12, 0x20, "AT45DB5122"}
};

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

//------------------------------------------------------------------------------
/// Initializes an AT45 instance and configures SPI chip select register.
/// Always returns 0.
/// \param pAt45  Pointer to the At45 instance to initialize.
/// \param pSpid  Pointer to the underlying SPI driver.
/// \param spiCs  Chip select value to connect to the At45.
//------------------------------------------------------------------------------
unsigned char AT45_Configure(At45 *pAt45, Spid *pSpid, unsigned char spiCs)
{
    SpidCmd *pCommand;

    // Sanity checks
    ASSERT(pSpid, "AT45_Configure: pSpid is 0.\n\r");
    ASSERT(pAt45, "AT45_Configure: pAt45 is 0.\n\r");

    // Initialize the At45 instance
    pAt45->pSpid = pSpid;
    pAt45->pDesc = 0;
    memset(pAt45->pCmdBuffer, 0, 8);

    // Initialize the spidCmd structure
    pCommand = &(pAt45->command);
    pCommand->pCmd = pAt45->pCmdBuffer;
    pCommand->callback = 0;
    pCommand->pArgument = 0;
    pCommand->spiCs = spiCs;

    return 0;
}

//------------------------------------------------------------------------------
/// This function returns 1 if the At45 driver is not executing any command;
/// otherwise it returns 0.
/// \param pAt45  Pointer to an At45 instance.
//------------------------------------------------------------------------------
unsigned char AT45_IsBusy(At45 *pAt45)
{
    return SPID_IsBusy(pAt45->pSpid);
}

//------------------------------------------------------------------------------
/// Sends a command to the dataflash through the SPI. The command is identified
/// by its command code and the number of bytes to transfer (1 + number of
/// address bytes + number of dummy bytes). If data needs to be received, then
/// a data buffer must be provided.
/// This function does not block; its optional callback will be invoked when
/// the transfer completes.
/// \param pAt45  Pointer to an At45 driver instance.
/// \param cmd  Command code.
/// \param cmdSize  Size of command code + address bytes + dummy bytes.
/// \param pData  Data buffer.
/// \param dataSize  Number of data bytes to send/receive.
/// \param address  Address at which the command is performed if meaningful.
/// \param callback  Optional callback to invoke at end of transfer.
/// \param pArgument  Optional parameter to the callback function.
//------------------------------------------------------------------------------
unsigned char AT45_SendCommand(
    At45 *pAt45,
    unsigned char cmd,
    unsigned char cmdSize,
    unsigned char *pData,
    unsigned int dataSize,
    unsigned int address,
    SpidCallback callback,
    void *pArgument)
{
    SpidCmd *pCommand;
    const At45Desc *pDesc = pAt45->pDesc;
    unsigned int dfAddress = 0;

    // Sanity checks
    ASSERT(pAt45, "AT45_Command: pAt45 is 0.\n\r");
    ASSERT(pDesc || (cmd == AT45_STATUS_READ),
           "AT45_Command: Device has no descriptor, only STATUS_READ command allowed\n\r");

    // Check if the SPI driver is available
    if (AT45_IsBusy(pAt45)) {

        return AT45_ERROR_LOCK;
    }

    // Compute command pattern
    pAt45->pCmdBuffer[0] = cmd;

    // Add address bytes if necessary
    if (cmdSize > 1) {

        ASSERT(pDesc, "AT45_Command: No descriptor for dataflash.\n\r");
        dfAddress =
            ((address / (pDesc->pageSize)) << pDesc->pageOffset)
             + (address % (pDesc->pageSize));

        // Write address bytes
        if (pDesc->pageNumber >= 16384) {

            pAt45->pCmdBuffer[1] = ((dfAddress & 0x0F000000) >> 24);
            pAt45->pCmdBuffer[2] = ((dfAddress & 0x00FF0000) >> 16);
            pAt45->pCmdBuffer[3] = ((dfAddress & 0x0000FF00) >> 8);
            pAt45->pCmdBuffer[4] = ((dfAddress & 0x000000FF) >> 0);
    
            if ((cmd != AT45_CONTINUOUS_READ) && (cmd != AT45_PAGE_READ)) {
    
                cmdSize++;
            }
        }
        else {

            pAt45->pCmdBuffer[1] = ((dfAddress & 0x00FF0000) >> 16);
            pAt45->pCmdBuffer[2] = ((dfAddress & 0x0000FF00) >> 8);
            pAt45->pCmdBuffer[3] = ((dfAddress & 0x000000FF) >> 0);
        }
    }

    // Update the SPI Transfer descriptors
    pCommand = &(pAt45->command);
    pCommand->cmdSize = cmdSize;
    pCommand->pData = pData;
    pCommand->dataSize = dataSize;
    pCommand->callback = callback;
    pCommand->pArgument = pArgument;

    // Send Command and data through the SPI
    if (SPID_SendCommand(pAt45->pSpid, pCommand)) {

        return AT45_ERROR_SPI;
    }

    return 0;
}

//------------------------------------------------------------------------------
/// This function returns the At45Desc structure corresponding to the device
/// connected
/// It automatically initializes pAt45->pDesc field structure.
/// This function shall be called by the application before AT45_SendCommand.
/// Returns 0 if successful; Otherwise, returns AT45_ERROR_LOCK if the At45
/// driver is in use or AT45_ERROR_SPI if there was an error with the SPI driver.
/// \param pAt45  Pointer to an AT45 driver instance.
/// \param status  Device status register value.
//------------------------------------------------------------------------------
const At45Desc * AT45_FindDevice(At45 *pAt45, unsigned char status)
{
    unsigned int i;
    unsigned char id = AT45_STATUS_ID(status);

    // Check if status is all one; in which case, it is assumed that no device
    // is connected
    if (status == 0xFF) {

        return 0;
    }

    // Look in device array
    i = 0;
    pAt45->pDesc = 0;
    while ((i < NUMDATAFLASH) && !(pAt45->pDesc)) {

        if (at45Devices[i].id == id) {

            pAt45->pDesc = &(at45Devices[i]);
        }
        i++;
    }

    return pAt45->pDesc;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色天使色偷偷av一区二区| 日日欢夜夜爽一区| 岛国精品在线播放| 久久久久久久久蜜桃| 久久免费精品国产久精品久久久久| 人人狠狠综合久久亚洲| 555www色欧美视频| 麻豆精品一区二区| 国产成人av一区二区三区在线| 国产日韩成人精品| 成人动漫一区二区在线| 亚洲尤物在线视频观看| 欧美日韩一区二区三区在线看 | 欧美精品一区二区三区久久久| 精彩视频一区二区三区| 日本韩国欧美在线| 蜜臀av在线播放一区二区三区| 久久久一区二区三区| 成人av中文字幕| 亚洲va天堂va国产va久| 日韩精品一区二区三区在线播放| 国产一区二区三区四区五区美女 | 欧亚洲嫩模精品一区三区| 亚洲综合成人在线视频| 欧美sm极限捆绑bd| 不卡免费追剧大全电视剧网站| 一区二区三区中文免费| 精品国产乱码久久久久久久久 | 91久久香蕉国产日韩欧美9色| 日韩精品一级二级| 国产精品久久久久永久免费观看| 欧美日韩电影一区| 国产一区91精品张津瑜| 一区二区三区在线免费视频| 欧美tickle裸体挠脚心vk| 99国产精品99久久久久久| 美女精品一区二区| 亚洲综合在线五月| 欧美精品一区二区在线播放 | 国产在线精品国自产拍免费| 亚洲欧洲www| 欧美不卡在线视频| 欧美午夜电影一区| youjizz国产精品| 久久99热狠狠色一区二区| 一区二区三区在线播| 久久免费美女视频| 欧美精品一二三区| 在线精品视频免费播放| 成人一级片在线观看| 日本不卡一二三| 亚洲一区二区在线观看视频| 国产色一区二区| 日韩欧美中文字幕制服| 欧美无人高清视频在线观看| 国产91色综合久久免费分享| 久久精品国产77777蜜臀| 午夜在线成人av| 依依成人精品视频| 国产精品传媒视频| 国产欧美一区二区三区在线看蜜臀| 欧美日韩精品一区二区三区四区 | 久久精品国产亚洲高清剧情介绍| 亚洲成人手机在线| 日本不卡高清视频| 日韩一区二区不卡| 欧美日韩免费观看一区三区| 色综合久久中文字幕综合网| 播五月开心婷婷综合| 国产精品亚洲午夜一区二区三区 | 在线免费观看一区| 色综合天天做天天爱| 99视频精品在线| 精品久久久久久久人人人人传媒| 激情图区综合网| 日日夜夜免费精品视频| 亚洲黄色在线视频| 亚洲六月丁香色婷婷综合久久| 欧美国产精品专区| 精品久久99ma| 精品三级在线观看| 日韩精品在线一区二区| 精品午夜一区二区三区在线观看 | 日韩精品亚洲一区| 欧美精品一区二区三区久久久| 成人一区二区三区| 国产精品1区2区3区| 国内外成人在线视频| 精品亚洲成av人在线观看| 国产精品一区二区久久精品爱涩| 国产自产v一区二区三区c| 精品一二三四区| 国产一区二区精品久久91| 国产成人丝袜美腿| www.欧美.com| 在线免费观看一区| 欧美一区二区视频网站| 91精品午夜视频| 精品欧美一区二区三区精品久久| 久久婷婷国产综合精品青草| 国产欧美精品区一区二区三区| 国产精品乱人伦| 亚洲女同ⅹxx女同tv| 午夜精品久久久久久不卡8050| 免费观看久久久4p| 国产成人精品一区二| 91免费小视频| 欧美一区二区在线看| 国产日韩欧美制服另类| 亚洲天堂av一区| 日韩精品一级二级| 高清在线不卡av| 色香蕉成人二区免费| 884aa四虎影成人精品一区| 国产人成一区二区三区影院| 亚洲网友自拍偷拍| 黄色精品一二区| 色婷婷激情一区二区三区| 日韩天堂在线观看| 国产精品初高中害羞小美女文| 日韩高清国产一区在线| 国产精品一卡二| 欧美日韩国产精品自在自线| 久久久久九九视频| 亚洲午夜一二三区视频| 高清在线成人网| 欧美一区二区三区白人| 亚洲日本免费电影| 国产在线不卡一区| 欧美日韩精品是欧美日韩精品| 国产香蕉久久精品综合网| 婷婷综合另类小说色区| 成人av先锋影音| 精品黑人一区二区三区久久| 一区二区三区中文字幕电影| 国产高清不卡二三区| 91.com视频| 亚洲精品视频自拍| 国产精品99久久久久久似苏梦涵| 欧美午夜不卡在线观看免费| 亚洲国产精华液网站w| 麻豆成人久久精品二区三区小说| 色综合久久88色综合天天免费| 精品福利二区三区| 日日摸夜夜添夜夜添国产精品| heyzo一本久久综合| 欧美电视剧在线观看完整版| 亚洲va天堂va国产va久| 91丝袜国产在线播放| 久久综合五月天婷婷伊人| 亚洲大片精品永久免费| 色视频欧美一区二区三区| 中文在线资源观看网站视频免费不卡| 美女网站色91| 欧美一级二级在线观看| 亚洲成av人片在线观看| 色综合视频在线观看| 亚洲欧洲一区二区三区| 成人精品免费网站| 国产欧美日韩在线观看| 国产一区二区三区在线观看精品| 在线成人免费视频| 午夜精品一区在线观看| 欧美在线小视频| 亚洲美女偷拍久久| av网站免费线看精品| 国产精品网友自拍| 岛国一区二区三区| 国产精品福利一区二区三区| 国产一区二区三区四区在线观看| 日韩美女视频在线| 韩国精品主播一区二区在线观看 | 亚洲国产日韩av| 成人免费视频网站在线观看| 欧美精品一区二区三区在线 | 欧美日韩在线播放三区| 国产精品国产三级国产a| 成人久久18免费网站麻豆| 欧美国产精品中文字幕| av电影在线观看一区| 国产一区二区三区在线观看精品| 欧美日韩高清影院| 日韩国产精品大片| 欧美成人精品二区三区99精品| 国产在线视频一区二区三区| 亚洲精品一区二区三区四区高清| 丰满放荡岳乱妇91ww| 亚洲欧美偷拍三级| 91黄色免费网站| 日韩精品电影一区亚洲| 日韩免费在线观看| 国产麻豆精品视频| 国产精品盗摄一区二区三区| 欧美午夜精品免费| 美女任你摸久久| 欧美国产乱子伦| 欧美视频一区在线| 精品影视av免费| 欧美性欧美巨大黑白大战| 欧美aa在线视频|