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

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

?? at45.c

?? IAR5.2下 AT91SAM9260 ARM 對 MCP2515 控制源化碼
?? 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一区二区三区免费野_久草精品视频
日本亚洲三级在线| 欧美人xxxx| 日韩小视频在线观看专区| 国产三级精品在线| 日本色综合中文字幕| 91视视频在线直接观看在线看网页在线看| 欧美日韩免费观看一区三区| 国产亚洲精品福利| 美日韩黄色大片| 欧美性色黄大片| 亚洲欧美色一区| 成人开心网精品视频| 精品国产免费人成在线观看| 亚洲国产综合在线| 91久久精品一区二区| 中文一区一区三区高中清不卡| 日本最新不卡在线| 欧美日韩免费观看一区三区| 亚洲人成伊人成综合网小说| 成人一区二区三区| 久久精品亚洲麻豆av一区二区 | 日韩免费电影一区| 亚洲综合激情网| 一本久久精品一区二区| 中文字幕亚洲视频| 粉嫩av亚洲一区二区图片| 久久婷婷国产综合国色天香 | 一区二区三区在线观看视频| 国产露脸91国语对白| 精品日韩在线一区| 麻豆精品国产91久久久久久| 欧美一区二区三区在线电影 | 亚洲国产日韩一级| 成人av网在线| 国产精品电影一区二区三区| 99热99精品| 亚洲精品国产成人久久av盗摄 | 91免费视频观看| 亚洲视频中文字幕| 在线观看三级视频欧美| 亚洲综合丁香婷婷六月香| 欧美日韩精品系列| 天堂资源在线中文精品| 欧美美女黄视频| 美女一区二区在线观看| 久久午夜色播影院免费高清 | 国产一区二区三区最好精华液| 日韩欧美一区二区三区在线| 黑人精品欧美一区二区蜜桃 | 久久夜色精品国产噜噜av| 国产精品一区二区在线播放 | 蜜桃视频免费观看一区| www国产精品av| 91亚洲精品乱码久久久久久蜜桃| 亚洲激情自拍偷拍| 欧美一区二区三区免费大片| 精品一区二区在线观看| 国产精品传媒入口麻豆| 欧美日韩国产色站一区二区三区| 日本视频在线一区| 中文乱码免费一区二区| 欧美日韩色一区| 国产成人亚洲综合a∨婷婷| 亚洲欧美一区二区三区孕妇| 7799精品视频| av日韩在线网站| 天天综合天天做天天综合| 久久久久久99精品| 欧美日韩视频在线第一区| 国产98色在线|日韩| 亚洲国产成人av| 国产精品久久久久久久久免费樱桃 | 国产精品一区二区你懂的| 一区二区三区在线看| 91精品国产高清一区二区三区蜜臀 | 色婷婷综合视频在线观看| 日韩在线播放一区二区| 国产精品网曝门| 日韩欧美黄色影院| 91久久一区二区| 国产成人在线观看| 亚洲大型综合色站| 中文字幕日韩精品一区| 欧美成人乱码一区二区三区| 欧美性生活影院| 99视频国产精品| 国产一区 二区 三区一级| 视频一区中文字幕国产| 亚洲人成影院在线观看| 国产丝袜欧美中文另类| 日韩一区二区三区精品视频| 91福利小视频| 色综合久久综合网97色综合| 成人性生交大片免费看中文| 国产一区二区三区电影在线观看 | 欧美一级二级三级乱码| 99久久99久久久精品齐齐| 韩日av一区二区| 麻豆精品在线播放| 日本va欧美va瓶| 日韩va亚洲va欧美va久久| 性久久久久久久| 亚洲成av人片一区二区三区| 亚洲综合网站在线观看| 综合在线观看色| 自拍av一区二区三区| 1000部国产精品成人观看| 欧美国产综合一区二区| 中文字幕欧美日本乱码一线二线| 久久精品一区二区三区av| 久久久精品人体av艺术| 国产欧美一区二区三区在线老狼| 久久在线观看免费| 欧美激情一区在线| ...av二区三区久久精品| 亚洲视频中文字幕| 中文字幕一区二| 亚洲综合色区另类av| 亚洲午夜成aⅴ人片| 偷窥国产亚洲免费视频| 免费美女久久99| 精品一区二区免费| 国产剧情在线观看一区二区| 国产一区二区不卡老阿姨| 国产69精品久久久久777| www.日韩精品| 欧美在线三级电影| 日韩欧美一级二级| 国产亚洲欧美在线| 亚洲日本一区二区三区| 亚洲国产日韩综合久久精品| 蜜桃一区二区三区在线| 国产精品亚洲专一区二区三区 | 精品理论电影在线| 国产午夜精品福利| 亚洲三级在线免费观看| 亚洲成精国产精品女| 久久精品国产第一区二区三区| 国产伦精一区二区三区| 91蝌蚪porny| 91精品国产综合久久久蜜臀粉嫩| 欧美成人性福生活免费看| 国产精品嫩草影院com| 一区二区三区蜜桃| 精品亚洲欧美一区| 懂色av一区二区夜夜嗨| 欧美日韩一区二区不卡| 久久影院视频免费| 一区二区三区.www| 国产又黄又大久久| 精品污污网站免费看| 日本道色综合久久| 久久久久久久久久久久电影| 一区二区三区资源| 国内成人免费视频| 欧美日韩高清一区| 中文在线一区二区| 免费成人在线网站| 色哟哟亚洲精品| 久久亚洲精品国产精品紫薇| 亚洲主播在线观看| 成人午夜视频免费看| 日韩一区二区三区三四区视频在线观看| 国产精品亲子伦对白| 日韩av在线播放中文字幕| 99re热视频这里只精品| 精品捆绑美女sm三区| 亚洲国产精品久久艾草纯爱| 成人av一区二区三区| 精品国产欧美一区二区| 日韩电影在线看| 欧美手机在线视频| 亚洲天堂福利av| 从欧美一区二区三区| 日韩欧美国产一二三区| 丝袜亚洲另类欧美| 91猫先生在线| 中文字幕日韩精品一区| 成人免费视频视频| 国产亚洲欧美色| 国产综合久久久久久鬼色| 7878成人国产在线观看| 亚洲成a人片在线不卡一二三区| 91麻豆精品在线观看| 亚洲国产精品成人综合| 国产黄色精品视频| 国产午夜精品一区二区三区视频| 久99久精品视频免费观看| 日韩一区二区三区视频| 全国精品久久少妇| 欧美日韩国产首页| 日韩av电影一区| 欧美v日韩v国产v| 日韩av一区二| 欧美一级久久久| 精品亚洲porn| 久久久精品人体av艺术| 国产69精品久久久久毛片| 中文字幕国产一区二区| 成人av在线观|