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

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

?? sd.c

?? 增強型51單片機fs7821sd卡、mmc卡讀寫程序
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*
**********************************************************************************************
* Project:	TK7821
* File:		sd.c
* Contents: 
*          The SD access module 
*
* $Date: 02/25/05    Jason    v0.1
*        05/12/05    Mingo    v0.2   www.fameg.com
*
* Copyright (c) 2005 Fameg, Inc. All rights reserved
***********************************************************************************************
*/

#include <reg51.h>
#include <stdio.h>
#include <string.h>
#include "Device.h"
#include "UsbDisk.h"
#include "Storage.h"

#define MAX_CMD_LEN          6
#define MAX_RESP_LEN         17 // Max response length = 136 bits
#define RSP_LEN              6     
#define LONG_RSP_LEN         17
#define CARD_CMD_START       0x40
#define CARD_PWRUP_FINISH    0x80
#define OPERATION_VOL_RANGE  0x00FF0000
#define GOOD_CRC16_STS       0x02

/* SD_COMMAND */
#define SD_CMD_ONLY         1
#define SD_CMD_SHORT_RSP    2 
#define SD_CMD_LONG_RSP     3
#define SD_CMD_TX_DATA      4
#define SD_CMD_TX_DATA_ONLY 5 
#define SD_CMD_RX_DATA      6
#define SD_CMD_RX_DATA_ONLY 7 

#define IDLE_STATE          0  
#define READY_STATE         1
#define IDENTIFY_STATE      2
#define STANDBY_STATE       3
#define TRANSFER_STATE      4  
#define DATA_STATE          5
#define RECEIVE_STATE       6
#define PRGROGAM_STATE      7
#define DISCONNECT_STATE    8  

#define BUS_WIDTH_1BIT      0x00
#define BUS_WIDTH_4BIT      0x02

//      Command Name      Index   MMC-3.1 MMC-4.0 SD-1.01  Resp
#define GO_IDLE_STATE        0    //  V      V      V      -
#define SEND_OP_COND         1    //  V      V             R3 (OCR)
#define ALL_SEND_CID         2    //  V      V      V      R2
#define SEND_RELATIVE_ADDR   3    //  R1     R1     R6     See SdGetRespType()
#define SET_DSR              4    //  V      V      V      - 
#define SWITCH               6    //         V             R1
#define SELECT_CARD          7    //  V      V      V      R1
#define SEND_EXT_CSD         8    //         V             R1
#define SEND_CSD             9    //  V      V      V      R2
#define SEND_CID             10   //  V      V      V      R2
#define READ_DAT_UNTIL_STOP  11   //  V      V             R1
#define STOP_TRANS           12   //  V      V      V      R1
#define SEND_STATUS          13   //  V      V      V      R1
#define GO_INACTIVE_STATE    15   //  V      V      V      - 
#define SET_BLOCKLEN         16   //  V      V      V      R1
#define READ_BLOCK           17   //  V      V      V      R1
#define READ_MUL_BLOCK       18   //  V      V      V      R1
#define WRITE_DAT_UNTIL_STOP 20   //  V      V             R1
#define SET_BLOCK_COUNT      23   //  V      V             R1
#define WRITE_BLOCK          24   //  V      V      V      R1
#define WRITE_MUL_BLOCK      25   //  V      V      V      R1
#define PROGRAM_CID          26   //  V      V             R1
#define PROGRAM_CSD          27   //  V      V      V      R1
#define SET_WRITE_PROT       28   //  V      V      V      R1
#define CLR_WRITE_PROT       29   //  V      V      V      R1
#define SEND_WRITE_PROT      30   //  V      V      V      R1
#define ERASE_WR_BLK_START   32   //                V      R1
#define ERASE_WR_BLK_END     33   //                V      R1
#define ERASE_GROUP_START    35   //  V      V             R1
#define ERASE_GROUP_END      36   //  V      V             R1
#define ERASE                38   //  V      V      V      R1
#define FAST_IO              39   //  V      V             R4
#define GO_IRQ_STATE         40   //  V      V             R5
#define LOCK_UNLOCK          42   //  V      V      V      R1
#define APP_CMD              55   //  V      V      V      R1
#define GEN_CMD              56   //  V      V      V      R1

//      ACMD Name         Index   MMC-3.1 MMC-4.0 SD-1.01  Resp
#define SET_BUS_WIDTH        6    //                V      R1
#define SEND_SD_STATUS       13   //                V      R1
#define SEND_NUM_WR_BLOCKS   22   //                V      R1
#define SET_WR_BLK_ERASE_CNT 23   //                V      R1
#define SD_SEND_OP_COND      41   //                V      R3 (OCR)
#define SET_CLR_CARD_DETECT  42   //                V      R1
#define SEND_SCR             51   //                V      R1

// ??? According to Spec of MMC3.1, MultiMediaCard returns response of
//     type R1 to APP_CMD (CMD55). But, according to Spec of SD1.01 
//     page 23, MultiMediaCard will not respond to APP_CMD - CMD55. 
//     Is this a confliction ? 


#define SdHiClk() CSRWrite(SD_BASE + SD_CLK_CTRL, \
                     (CSRRead(SD_BASE + SD_CLK_CTRL) | SD_CLK_SEL) | SD_CLK_EN);
#define SdLoClk()  CSRWrite(SD_BASE + SD_CLK_CTRL, \
                     (CSRRead(SD_BASE + SD_CLK_CTRL) & ~SD_CLK_SEL) | SD_CLK_EN); 
#define SdStopClk() CSRWrite(SD_BASE + SD_CLK_CTRL, \
                     CSRRead(SD_BASE + SD_CLK_CTRL) & ~SD_CLK_EN);                      
#define IsCardBusy() (CSRRead(SD_BASE + SD_STATUS) & SD_BUSY)     
#define SdWriteProtect() (!(CSRRead(SD_BASE + SD_STATUS) & SD_WPD))
#define SdCardExist() (CSRRead(SD_BASE + SD_STATUS) & SD_CARD_STS)
#define SdCtrlReset() CSRWrite(SD_BASE + SD_CLK_CTRL, SD_RESET | SD_CLK_EN)
#define SdWaitCard()\
{\
  CmdTimer = SD_CMD_TIMEOUT;\
  while (IsCardBusy() && CmdTimer);\
}

#ifdef PMOS
  #define SdPowerOn() {SD_POWER_CTRL = 0; Delay(50);}
  #define SdPowerOff() SD_POWER_CTRL = 1
#else
  #define SdPowerOn()
  #define SdPowerOff()
#endif

typedef enum {CARD_SD, CARD_MMC} TCARD_TYPE;

/*************************************************
   Global Variables
*************************************************/
xdata BYTE SdGetFlashInfoTimer = 0;

/*************************************************
   Local Variables
*************************************************/
static xdata UINT32 SdAvailableBlocks = 0;
static xdata TCARD_TYPE CardType = CARD_SD;
static idata BYTE SdCmdBuf[MAX_CMD_LEN];
static xdata BYTE SdRespBuf[MAX_RESP_LEN]; 
static idata UINT32 RCA = 0;

#define TYPE_RESP_NO      0
#define TYPE_RESP_R1      1
#define TYPE_RESP_R2      2
#define TYPE_RESP_R3      3
#define TYPE_RESP_R4      4
#define TYPE_RESP_R5      5
#define TYPE_RESP_R6      6

xdata bool IsAppCmd = false;

BYTE SdGetRespType(BYTE CmdIndex)
{
    if(CmdIndex == SEND_RELATIVE_ADDR)
    {
        if(CardType == CARD_SD)
            return TYPE_RESP_R6;
        else
            return TYPE_RESP_R1;
    }
    switch(CmdIndex)
    {
        case GO_IDLE_STATE        : return TYPE_RESP_NO; break;
        case SEND_OP_COND         : return TYPE_RESP_R3; break;
        case ALL_SEND_CID         : return TYPE_RESP_R2; break;
        case SET_DSR              : return TYPE_RESP_NO; break;
        case SWITCH               : return TYPE_RESP_R1; break;
        case SELECT_CARD          : return TYPE_RESP_R1; break;
        case SEND_EXT_CSD         : return TYPE_RESP_R1; break;
        case SEND_CSD             : return TYPE_RESP_R2; break;
        case SEND_CID             : return TYPE_RESP_R2; break;
        case READ_DAT_UNTIL_STOP  : return TYPE_RESP_R1; break;
        case STOP_TRANS           : return TYPE_RESP_R1; break;
        case SEND_STATUS          : return TYPE_RESP_R1; break;
        case GO_INACTIVE_STATE    : return TYPE_RESP_NO; break;
        case SET_BLOCKLEN         : return TYPE_RESP_R1; break;
        case READ_BLOCK           : return TYPE_RESP_R1; break;
        case READ_MUL_BLOCK       : return TYPE_RESP_R1; break;
        case WRITE_DAT_UNTIL_STOP : return TYPE_RESP_R1; break;
        case SET_BLOCK_COUNT      : return TYPE_RESP_R1; break;
        case WRITE_BLOCK          : return TYPE_RESP_R1; break;
        case WRITE_MUL_BLOCK      : return TYPE_RESP_R1; break;
        case PROGRAM_CID          : return TYPE_RESP_R1; break;
        case PROGRAM_CSD          : return TYPE_RESP_R1; break;
        case SET_WRITE_PROT       : return TYPE_RESP_R1; break;
        case CLR_WRITE_PROT       : return TYPE_RESP_R1; break;
        case SEND_WRITE_PROT      : return TYPE_RESP_R1; break;
        case ERASE_WR_BLK_START   : return TYPE_RESP_R1; break;
        case ERASE_WR_BLK_END     : return TYPE_RESP_R1; break;
        case ERASE_GROUP_START    : return TYPE_RESP_R1; break;
        case ERASE_GROUP_END      : return TYPE_RESP_R1; break;
        case ERASE                : return TYPE_RESP_R1; break;
        case FAST_IO              : return TYPE_RESP_R4; break;
        case GO_IRQ_STATE         : return TYPE_RESP_R5; break;
        case LOCK_UNLOCK          : return TYPE_RESP_R1; break;
        case APP_CMD              : return TYPE_RESP_R1; break;
        case GEN_CMD              : return TYPE_RESP_R1; break;
        // APP_CMDs
        case SEND_NUM_WR_BLOCKS   : return TYPE_RESP_R1; break;
        case SD_SEND_OP_COND      : return TYPE_RESP_R3; break;
        case SEND_SCR             : return TYPE_RESP_R1; break;
        default                   : return TYPE_RESP_NO; break;
    }
    // Following commands are with identical index and response type:
    //   1. SET_BUS_WIDTH        (ACMD6)    Response R1
    //      SWITCH               (CMD6)     Response R1
    //   2. SEND_SD_STATUS       (ACMD13)   Response R1
    //      SEND_STATUS          (CMD13)    Response R1
    //   3. SET_WR_BLK_ERASE_CNT (ACMD23)   Response R1
    //      SET_BLOCK_COUNT      (CMD23)    Response R1
    //   4. SET_CLR_CARD_DETECT  (ACMD42)   Response R1
    //      LOCK_UNLOCK          (CMD42)    Response R1
}

STATUS SdSendCmd(BYTE CmdIndex, PBYTE CmdBuf)
{
    BYTE RespType , RespLen , CmdType;
    BYTE Status;
    BYTE i;
    BYTE RetryCount = 0;

    RespType = SdGetRespType(CmdIndex);

    if((CmdIndex == READ_BLOCK)||
       (CmdIndex == READ_MUL_BLOCK))
    {
        RespLen = 6;
        CmdType = SD_CMD_RX_DATA;
    }
    else if((CmdIndex == WRITE_BLOCK)||
            (CmdIndex == WRITE_MUL_BLOCK))
    {
        RespLen = 6;
        CmdType = SD_CMD_TX_DATA;
    }
    else if(RespType == TYPE_RESP_NO)
    {
        RespLen = 0;
        CmdType = SD_CMD_ONLY;
    }
    else if(RespType == TYPE_RESP_R2)
    {
        RespLen = 17;
        CmdType = SD_CMD_LONG_RSP;
    }
    else    
    {
        RespLen = 6;
        CmdType = SD_CMD_SHORT_RSP;
    }

    for( ; RetryCount < 3; RetryCount++)
    {
        CmdBuf[0] = CARD_CMD_START | CmdIndex;
        for(i = 0; i < 5; i++)
            CSRWrite(SD_BASE + SD_CMDBUF_BASE + i, CmdBuf[i]);

        CSRWrite(SD_BASE + SD_COMMAND, CmdType);

        //CmdTimer = SD_CMD_TIMEOUT;
        CmdTimer = 5; // 50ms
        while(CmdTimer > 0)
        {
            Status = CSRRead(SD_BASE + SD_IE);
            if(Status & SD_COMPLETE)
            {
                CSRWrite(SD_BASE + SD_IE, ~SD_COMPLETE); // Clear INT
                break;
            }
        }
        if(CmdTimer == 0) // Timeout
        {
            SdCtrlReset(); // ???
            continue;
        }

        if(RespType == TYPE_RESP_NO)
            return STATUS_SUCCESS;

        if(RespType == TYPE_RESP_R3)
        {
            // The response type of SD_SEND_OP_COND (ACMD41) and 
            // SEND_OP_COND (CMD1) are both R3, which is not protected
            // by CRC7. But hardware could still report CRC7 error for
            // these command's response. So, to prevent from affecting 
            // next command, we clear CRC7-ERR INT bit here.
            CSRWrite(SD_BASE + SD_IE, ~SD_CRC7_ERR);
            for(i = 0; i < RespLen; i++)
                SdRespBuf[i] = CSRRead(SD_BASE + SD_RESPBUF_BASE + i);
            return STATUS_SUCCESS;
        }

        if(CSRRead(SD_BASE + SD_IE) & SD_CRC7_ERR) // CRC7 Error
        {
            CSRWrite(SD_BASE + SD_IE, ~SD_CRC7_ERR); // Clear INT
            continue;
        }

        for(i = 0; i < RespLen; i++)
            SdRespBuf[i] = CSRRead(SD_BASE + SD_RESPBUF_BASE + i);

        if(RespType == TYPE_RESP_R1)
        {
            // Check following error bits in Card Status:
            //   31 OUT_OF_RANGE         SdRespBuf[1].7
            //   30 ADDRESS_ERROR        SdRespBuf[1].6
            //   29 BLOCK_LEN_ERROR      SdRespBuf[1].5
            //   28 ERASE_SEQ_ERROR      SdRespBuf[1].4
            //   27 ERASE_PARAM          SdRespBuf[1].3
            //   26 WP_VIOLATION         SdRespBuf[1].2
            //   24 LOCK_UNLOCK_FAILED   SdRespBuf[1].0
            //   23 COM_CRC_ERR          SdRespBuf[2].7
            //   22 ILLEGAL_COMMAND      SdRespBuf[2].6
            //   21 CARD_ECC_FAILED      SdRespBuf[2].5
            //   20 CC_ERROR             SdRespBuf[2].4
            //   19 ERROR                SdRespBuf[2].3
            if( ( (SdRespBuf[1] & 0xFD) == 0 ) && // 8'b1111_1101
                ( (SdRespBuf[2] & 0xF8) == 0 )  ) // 8'b1111_1000
                return STATUS_SUCCESS;            // No error
            else

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人精品亚洲777人妖| 成人av影视在线观看| 欧美一级搡bbbb搡bbbb| 青青青伊人色综合久久| 日韩片之四级片| 国产麻豆成人传媒免费观看| 国产精品入口麻豆九色| 99免费精品视频| 亚洲一区二区三区四区的| 欧美亚洲免费在线一区| 日本中文一区二区三区| 久久综合色鬼综合色| 成人蜜臀av电影| 亚洲欧美日韩在线| 在线成人免费观看| 国产一区二区三区高清播放| 最新欧美精品一区二区三区| 欧美手机在线视频| 极品少妇xxxx精品少妇| 国产精品福利av| 欧美午夜一区二区三区免费大片| 青青草原综合久久大伊人精品优势 | 国产亚洲1区2区3区| 91网站最新网址| 天天影视色香欲综合网老头| 26uuu国产一区二区三区| heyzo一本久久综合| 午夜日韩在线电影| 欧美极品xxx| 欧美视频在线观看一区| 韩国av一区二区| 依依成人综合视频| 精品欧美一区二区在线观看| 91一区二区在线观看| 男女男精品网站| 中文字幕第一区二区| 7777精品伊人久久久大香线蕉最新版 | 91麻豆精品国产91久久久资源速度| 国产剧情一区二区| 亚洲图片一区二区| 久久久久国产免费免费| 色88888久久久久久影院野外| 视频一区二区三区中文字幕| 中文字幕欧美激情一区| 欧美一区二区黄| 91在线视频播放| 精品一二三四在线| 亚洲一区免费观看| 国产欧美日韩卡一| 538在线一区二区精品国产| 成人黄色在线视频| 免费观看日韩电影| 亚洲精品美国一| 久久精品欧美日韩精品| 欧美精品色一区二区三区| 亚洲第一福利视频在线| 日韩免费观看高清完整版| 色噜噜狠狠色综合欧洲selulu| 久久99精品一区二区三区| 亚洲自拍偷拍图区| 中文字幕免费观看一区| 日韩一区二区免费在线观看| 91麻豆自制传媒国产之光| 狠狠色综合色综合网络| 一区二区成人在线视频| 亚洲国产高清在线观看视频| 欧美一级片免费看| 欧美中文字幕久久| 成人中文字幕合集| 久久99精品国产麻豆不卡| 亚洲高清中文字幕| 中文字幕中文乱码欧美一区二区 | 久久伊人中文字幕| 欧美精品乱码久久久久久按摩| 91丝袜高跟美女视频| 国产成a人亚洲精| 激情伊人五月天久久综合| 亚洲aaa精品| 亚洲精品久久嫩草网站秘色| 国产精品国产三级国产三级人妇| 精品粉嫩aⅴ一区二区三区四区 | 日韩精品一区二区三区在线观看| 欧美性色aⅴ视频一区日韩精品| 成人a免费在线看| 国产一区二区三区日韩| 免费精品视频在线| 亚洲h动漫在线| 亚洲国产sm捆绑调教视频| 亚洲精品中文在线| 日韩毛片视频在线看| 欧美激情艳妇裸体舞| 久久综合色一综合色88| 精品久久国产老人久久综合| 91麻豆精品国产91久久久资源速度 | 成人不卡免费av| 国产风韵犹存在线视精品| 韩国在线一区二区| 精品一区二区av| 狠狠色狠狠色综合日日91app| 免费人成精品欧美精品| 青草国产精品久久久久久| 日韩中文字幕亚洲一区二区va在线 | 91小视频在线| 99久久综合色| 97精品电影院| 91首页免费视频| 99精品在线免费| 色婷婷av一区二区三区软件| 91小视频在线免费看| 色狠狠综合天天综合综合| 91在线播放网址| 99九九99九九九视频精品| 色综合久久六月婷婷中文字幕| 99久久婷婷国产综合精品| 99精品久久久久久| 日本精品一级二级| 色综合久久久网| 欧美日韩一级片网站| 欧美三区在线观看| 欧美日韩1234| 欧美一区在线视频| 欧美日韩一区二区不卡| 日韩三级视频中文字幕| 久久嫩草精品久久久久| 国产精品污污网站在线观看| 成人欧美一区二区三区白人| 一区二区在线观看不卡| 午夜伦欧美伦电影理论片| 美腿丝袜亚洲色图| 国产一区欧美一区| 成人h动漫精品一区二区 | 成人av免费观看| 在线亚洲一区二区| 在线看日本不卡| 51精品视频一区二区三区| 欧美α欧美αv大片| 国产欧美综合在线| 亚洲视频在线一区| 亚洲高清免费观看高清完整版在线观看 | 国产精品综合二区| 波多野结衣精品在线| 日本韩国一区二区三区| 91精品国产综合久久久久久久| 精品国产sm最大网站| 中文字幕一区日韩精品欧美| 亚洲激情av在线| 水野朝阳av一区二区三区| 国内不卡的二区三区中文字幕| 国产激情91久久精品导航 | 欧美日韩中字一区| 欧美电影精品一区二区| 中文字幕高清不卡| 香蕉成人伊视频在线观看| 国产专区欧美精品| 91在线观看美女| 欧美电影免费观看高清完整版在线观看 | 青青草97国产精品免费观看| 国产成人a级片| 欧美性猛片xxxx免费看久爱| 精品国免费一区二区三区| 亚洲人成在线观看一区二区| 日韩经典一区二区| 成人午夜又粗又硬又大| 欧美伦理影视网| 欧美国产97人人爽人人喊| 亚洲国产精品影院| 国产精品99久久久久久宅男| 在线国产电影不卡| 国产视频一区在线观看| 亚洲国产成人精品视频| 国产乱人伦偷精品视频不卡| 欧美色网一区二区| 久久精品视频一区二区| 亚洲成人高清在线| 国产999精品久久久久久| 欧美日本一区二区三区四区 | **欧美大码日韩| 免费人成精品欧美精品 | 欧美色综合网站| 国产欧美久久久精品影院| 午夜精品免费在线| 成人爱爱电影网址| 精品噜噜噜噜久久久久久久久试看| 亚洲激情欧美激情| 豆国产96在线|亚洲| 欧美一区二区在线看| 亚洲婷婷在线视频| 狠狠色丁香婷婷综合| 91黄视频在线观看| 国产欧美一区二区三区网站| 日韩国产欧美在线视频| 99精品国产一区二区三区不卡| www精品美女久久久tv| 亚洲成人久久影院| 91香蕉视频污| 亚洲国产高清在线观看视频| 久久国产精品第一页| 欧美在线不卡一区| 亚洲欧洲日韩女同| 国产麻豆精品在线观看|