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

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

?? at45.c

?? Dataflash example for ARM9 using KEIL.
?? C
字號(hào):
/* ----------------------------------------------------------------------------
 *         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))

//------------------------------------------------------------------------------
//         Local variables
//------------------------------------------------------------------------------

/// indicate if the device is configured as binary page or not.
static unsigned char configuredBinaryPage;

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

static const At45Desc at45Devices[] = {
    {  512,  1, 264,   9, 0x0C, "AT45DB011D"},
    { 1024,  1, 264,   9, 0x14, "AT45DB021D"},
    { 2048,  1, 264,   9, 0x1C, "AT45DB041D"},
    { 4096,  1, 264,   9, 0x24, "AT45DB081D"},
    { 4096,  1, 528,  10, 0x2C, "AT45DB161D"},
    { 8192,  1, 528,  10, 0x34, "AT45DB321D"},
    { 8192,  1, 1056, 11, 0x3C, "AT45DB642D"},
    {16384,  1, 1056, 11, 0x10, "AT45DB1282"},
    {16384,  1, 2112, 12, 0x18, "AT45DB2562"},
    {32768,  1, 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");
        if (!configuredBinaryPage) {
            dfAddress =
                ((address / (pDesc->pageSize)) << pDesc->pageOffset)
                 + (address % (pDesc->pageSize));
        }
        else {
            dfAddress = address;
        }
        // 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++;
    }
    configuredBinaryPage = AT45_STATUS_BINARY(status);
    return pAt45->pDesc;
}

//------------------------------------------------------------------------------
/// This function returns the pagesize corresponding to the device connected
/// \param pAt45  Pointer to an AT45 driver instance.
//------------------------------------------------------------------------------
unsigned int  AT45_PageSize(At45 *pAt45)
{
    unsigned int pagesize = pAt45->pDesc->pageSize;
    if(((pAt45->pDesc->hasBinaryPage) == 0) || !configuredBinaryPage){
        return pagesize;
    }
    return ((pagesize >> 8) << 8);
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕欧美日韩一区| 欧美在线制服丝袜| 成人三级伦理片| 亚洲欧美综合另类在线卡通| 一本大道综合伊人精品热热| 国产精品一区久久久久| 久久精品国产精品亚洲综合| 日韩精品一级二级 | 欧美影视一区二区三区| 精品少妇一区二区三区视频免付费| 欧美国产一区二区| 蜜桃一区二区三区在线观看| 老司机午夜精品| 蜜臀精品一区二区三区在线观看| 日韩电影在线观看网站| 美腿丝袜亚洲一区| 国产精品一区二区三区网站| 国产精品18久久久久| 国产91高潮流白浆在线麻豆| 91亚洲午夜精品久久久久久| 欧美色手机在线观看| 欧美一区二区在线播放| 欧美一级搡bbbb搡bbbb| 国产网红主播福利一区二区| 国产精品国模大尺度视频| 一区二区视频在线| 青青草国产成人av片免费| 九色porny丨国产精品| 成人av在线资源网| 欧美视频日韩视频| 久久综合给合久久狠狠狠97色69| 欧美tk丨vk视频| 国产片一区二区| 亚洲黄色小说网站| 久久精品国产精品青草| www.久久久久久久久| 欧美精品一二三| 亚洲国产精品ⅴa在线观看| 亚洲一区二区三区四区中文字幕| 日韩av高清在线观看| 不卡的av电影| 精品国产精品网麻豆系列| 亚洲三级小视频| 韩日欧美一区二区三区| 在线视频国产一区| 欧美极品aⅴ影院| 天天综合日日夜夜精品| 国产成a人亚洲精| 日韩无一区二区| 亚洲一区二区在线免费观看视频| 久久不见久久见免费视频7| 欧洲激情一区二区| 国产精品色哟哟| 蜜臀精品久久久久久蜜臀| 91麻豆福利精品推荐| www国产成人免费观看视频 深夜成人网| 亚洲美女视频在线观看| 国产精品亚洲一区二区三区在线| 欧美色网一区二区| 日韩一区在线免费观看| 国产在线精品一区二区不卡了 | 久久国产精品99久久人人澡| 色8久久精品久久久久久蜜| 久久毛片高清国产| 麻豆精品一二三| 91精品国产一区二区三区| 亚洲欧美一区二区三区极速播放| 国产精品亚洲视频| 精品免费国产二区三区| 日韩精品高清不卡| 欧美美女直播网站| 亚洲一区二区视频| 91小宝寻花一区二区三区| 国产精品毛片无遮挡高清| 国产精品99久久久久久久女警| 欧美夫妻性生活| 亚洲成人你懂的| 欧美日韩另类一区| 三级不卡在线观看| 日韩一区二区三区免费看| 视频在线观看一区二区三区| 欧美狂野另类xxxxoooo| 五月婷婷久久丁香| 日韩片之四级片| 国产精品一区三区| 国产精品久久久久久户外露出 | 日韩高清不卡在线| 欧美一区二区精品| 国产一区二区三区在线观看精品| 精品日产卡一卡二卡麻豆| 国产在线精品一区二区夜色| 久久久久99精品一区| 成人免费视频视频在线观看免费| 亚洲国产精品精华液ab| 91麻豆国产福利精品| 亚洲国产精品久久久男人的天堂 | 成人精品视频网站| 日韩理论片网站| 欧美日本视频在线| 国产制服丝袜一区| 国产精品久久午夜| 欧美日韩国产首页| 激情五月播播久久久精品| 国产喷白浆一区二区三区| 成人天堂资源www在线| 亚洲欧美另类小说视频| 欧美日韩不卡一区二区| 精品一区二区在线看| 国产精品无人区| 欧美色精品天天在线观看视频| 免费精品视频在线| 国产精品色噜噜| 99精品黄色片免费大全| 日日夜夜精品视频天天综合网| 精品国产三级电影在线观看| 91丝袜国产在线播放| 蜜桃在线一区二区三区| 亚洲免费av观看| 久久久综合网站| 欧美日韩精品一区二区三区四区 | 日韩一区二区电影在线| av成人免费在线| 日本中文字幕一区二区有限公司| 精品国产凹凸成av人导航| 色综合色狠狠天天综合色| 狠狠色综合日日| 午夜激情一区二区| 亚洲天天做日日做天天谢日日欢| 日韩欧美色综合| 在线精品亚洲一区二区不卡| 国产成人激情av| 麻豆成人91精品二区三区| 亚洲一区二区精品3399| 国产精品女同互慰在线看| 日韩精品一区二区三区swag| 欧美性大战久久| 91在线看国产| 成人激情校园春色| 国模冰冰炮一区二区| 视频一区视频二区在线观看| 亚洲香蕉伊在人在线观| 亚洲免费观看视频| 中文字幕精品一区二区精品绿巨人| 日韩欧美自拍偷拍| 91精品国产综合久久久久久漫画| 99精品欧美一区二区三区小说| 国产一区二区在线视频| 美女国产一区二区三区| 天天亚洲美女在线视频| 亚洲午夜久久久久久久久久久| 国产精品毛片久久久久久| 久久久久久免费毛片精品| 久久综合久久久久88| 26uuu精品一区二区三区四区在线| 在线日韩av片| 欧美三级韩国三级日本三斤| 欧美色爱综合网| 欧美日本国产视频| 欧美理论片在线| 欧美福利视频导航| 日韩免费高清视频| 亚洲精品在线网站| www国产成人| 国产精品嫩草99a| 日韩毛片精品高清免费| 亚洲精品福利视频网站| 午夜欧美视频在线观看| 蜜臀av性久久久久蜜臀aⅴ流畅 | 国产99精品国产| www.欧美日韩国产在线| 91伊人久久大香线蕉| 99久久精品免费精品国产| 成人理论电影网| 欧洲色大大久久| 欧美一区二区在线播放| 久久久噜噜噜久噜久久综合| 国产精品全国免费观看高清| 亚洲欧美综合在线精品| 亚洲gay无套男同| 久久精品国产色蜜蜜麻豆| 国产福利一区在线观看| 色综合久久六月婷婷中文字幕| 欧美日韩dvd在线观看| 777奇米四色成人影色区| 久久午夜老司机| 亚洲精品美腿丝袜| 乱一区二区av| 91香蕉视频污在线| 91精品欧美福利在线观看| 久久精品一区二区三区不卡| 一区二区三区在线观看国产| 久久99热狠狠色一区二区| 99久久伊人网影院| 91精品国产欧美一区二区18| 国产日本亚洲高清| 午夜私人影院久久久久| 国产成人99久久亚洲综合精品| 欧美日本在线播放| 中文字幕视频一区二区三区久| 午夜电影一区二区|