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

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

?? sd.c

?? 增強型51單片機fs7821sd卡、mmc卡讀寫程序
?? C
?? 第 1 頁 / 共 3 頁
字號:
                continue;
        }
        else
            return STATUS_SUCCESS;
    }
    return STATUS_FLASH_ERROR;
}

STATUS SdSendAppCmd(BYTE AppCmdIndex, PBYTE AppCmdBuf)
{
    STATUS Status;
    int RetryCount;
    BYTE CmdBuf55[MAX_CMD_LEN]; // for APP_CMD (CMD55)
    
    for(RetryCount = 0; RetryCount < 3; RetryCount++)
    {
        *((UINT32 *)(&CmdBuf55[1])) = RCA;
        
        Status = SdSendCmd(APP_CMD, CmdBuf55);
        
        if(Status != STATUS_SUCCESS)
            continue;
        
        Status = SdSendCmd(AppCmdIndex, AppCmdBuf);
        
        if(Status != STATUS_SUCCESS)
            continue;
        else
            return STATUS_SUCCESS;
    }
    return STATUS_FLASH_ERROR;
}

//----------------------------------------------------------------------------
STATUS SdChangeBusWidth()
{
    STATUS Status;
    BYTE RegValue;
  
    *((UINT32 *)(&SdCmdBuf[1])) = RCA | BUS_WIDTH_4BIT;

    Status = SdSendAppCmd(SET_BUS_WIDTH, SdCmdBuf);
    
    if(Status == STATUS_SUCCESS)
    {
        RegValue = CSRRead(SD_BASE + SD_CLK_CTRL);
		//RegValue |= SD_CLK_NIBBLE;
		RegValue |= 0x10;
        CSRWrite(SD_BASE + SD_CLK_CTRL, RegValue);
    }
    return Status;   
}	

//----------------------------------------------------------------------------
STATUS SdReset()
{
    STATUS Status;
    int i;

    RCA = 0;
    
    SdLoClk();
    Delay(5);  // Wait 5ms for stable clock
    for(i = 1; i <= 4; i++)
        SdCmdBuf[i] = 0;
    Status = SdSendCmd(GO_IDLE_STATE, SdCmdBuf);
    return Status;
}

//----------------------------------------------------------------------------
STATUS SdDetect()
{
    STATUS Status;
    UINT16 RetryCount;

    *((UINT32 *)(&SdCmdBuf[1])) = OPERATION_VOL_RANGE;
    
    Status = SdSendAppCmd(SD_SEND_OP_COND, SdCmdBuf);
    
    if(Status == STATUS_SUCCESS)
    {
        CardType = CARD_SD;	
 
        // Check if card power-up operation finished
        if(SdRespBuf[1] & CARD_PWRUP_FINISH)
            return STATUS_SUCCESS;

        // Wait until card power-up operation finished
        for(RetryCount = 0; RetryCount < 500; RetryCount++)
        {
            *((UINT32 *)(&SdCmdBuf[1])) = OPERATION_VOL_RANGE;
            
            Status = SdSendAppCmd(SD_SEND_OP_COND, SdCmdBuf);
            
            if(Status != STATUS_SUCCESS)
                continue;
                
            if(SdRespBuf[1] & CARD_PWRUP_FINISH)
                return STATUS_SUCCESS;           
        }
        return STATUS_FLASH_ERROR;
    }
    else
    {
        CardType = CARD_MMC;   	
        
        // Wait until card power-up operation finished
        for(RetryCount = 0; RetryCount < 500; RetryCount++)
        {
            *((UINT32 *)(&SdCmdBuf[1])) = OPERATION_VOL_RANGE;
    
            Status = SdSendCmd(SEND_OP_COND, SdCmdBuf);

            if(Status != STATUS_SUCCESS)
                continue;
                
            if(SdRespBuf[1] & CARD_PWRUP_FINISH)
                return STATUS_SUCCESS;           
        }
        return STATUS_FLASH_ERROR;
    }
}	


//----------------------------------------------------------------------------
STATUS SdGoIdentifyState()
{
    STATUS Status;
    int i;

    for(i = 1; i <= 4; i++)
        SdCmdBuf[i] = 0;
    Status = SdSendCmd(ALL_SEND_CID, SdCmdBuf);
    return Status;
}

//--------------------------------------------------------------------
STATUS SdGoStandbyState()
{
    STATUS Status;
    int i;
  	
    if(CardType == CARD_SD)
    {
        for(i = 1; i <= 4; i++)
            SdCmdBuf[i] = 0;
    }
    else
    {
        RCA = 0x00010000;	
        *((UINT32 *)(&SdCmdBuf[1])) = RCA;
    }

    Status = SdSendCmd(SEND_RELATIVE_ADDR, SdCmdBuf);

    if(CardType == CARD_SD)
        RCA = *((UINT32 *)(&SdRespBuf[1])) & 0xffff0000;

    return STATUS_SUCCESS;
    
    // SD and MMC adopt different ways to set their relative card 
    // address. That is, they have different response to CMD3 
    // (SEND_RELATIVE_ADDR).
    //
    // According to SD Standard Version 1.01 page 25:
    //     the host issues CMD3 (SEND_RELATIVE_ADDR) asks the 
    //     card to publish a new relative card address (RCA).
    //
    // According to MMC Standard Version 3.1 page 24:
    //     the host issues CMD3 (SEND_RELATIVE_ADDR) to assign
    //     to this card a relative card address (RCA).
    //
    // This means : when host send CMD3 to SD, it is SD telling host
    // its new address, that is, SD is the one giving the new address
    // (and host decides whether to accept it). Meanwhile, when host 
    // sends CMD3 to MMC, it is host assigning the card a new address,
    // that is, host is the one decides the address (and MMC must 
    // accept it).
    // 
    // For SD, CMD3 has a response of type R6, which contains address
    // value returns by SD. For MMC, CMD3 has a response of type R1, 
    // which tells host if MMC accepts the address or error happens.
}

//--------------------------------------------------------------------
STATUS SdReadCSD()			
{
    STATUS Status;	
    BYTE READ_BL_LEN;
    BYTE C_SIZE_MUTI;
    UINT32 C_SIZE;
     
    *((UINT32 *)(&SdCmdBuf[1])) = RCA;
    
    Status = SdSendCmd(SEND_CSD, SdCmdBuf);
    if(Status != STATUS_SUCCESS)
        return Status;  

    READ_BL_LEN = SdRespBuf[6] & 0xf;
    C_SIZE = SdRespBuf[7] & 0x3;
    C_SIZE <<= 8;
    C_SIZE |= SdRespBuf[8];
    C_SIZE <<= 2;
    C_SIZE |= (SdRespBuf[9] >> 6);
    C_SIZE_MUTI = SdRespBuf[10] & 0x3;
    C_SIZE_MUTI <<= 1;
    C_SIZE_MUTI |= (SdRespBuf[11] >> 7);
  
    SdAvailableBlocks = (UINT32)((C_SIZE + 1) << (C_SIZE_MUTI + 2 + 
                             (READ_BL_LEN - BYTES_PER_SECTOR_SHIFT)));
    SdAvailableBlocks -= 1;  

    return STATUS_SUCCESS;
}	

//----------------------------------------------------------------------------
STATUS SdGoTransferState()
{
    STATUS Status;
    BYTE CurrentState , RegValue;
  	
    *((UINT32 *)(&SdCmdBuf[1])) = RCA;
    Status = SdSendCmd(SELECT_CARD, SdCmdBuf);
    if(Status != STATUS_SUCCESS)
        return Status;  

    *((UINT32 *)(&SdCmdBuf[1])) = RCA;
    Status = SdSendCmd(SEND_STATUS, SdCmdBuf);
    if(Status != STATUS_SUCCESS)
        return Status;  

    CurrentState = (SdRespBuf[3] >> 1) & 0x0F;
    if(CurrentState == TRANSFER_STATE)
    {
        SdHiClk();
        if(CardType == CARD_SD)
        {
            Status = SdChangeBusWidth();
            if(Status != STATUS_SUCCESS)
                return Status;
        }
        else // MMC 3.1
        {
            RegValue = CSRRead(SD_BASE + SD_CLK_CTRL);
            RegValue &= ~SD_CLK_NIBBLE;
            CSRWrite(SD_BASE + SD_CLK_CTRL, RegValue);
        }
    }   
    else
        return STATUS_FLASH_ERROR;
    
    return STATUS_SUCCESS;
}	

//----------------------------------------------------------------------------
//  Description:
//    Stop the read or write command
//----------------------------------------------------------------------------
STATUS SdStopCmd()
{
    STATUS Status;
    BYTE RegValue;
    int i;

    RegValue = CSRRead(SD_BASE + SD_CLK_CTRL);
    RegValue &= ~SD_CLK_AUTO_DIS;
    CSRWrite(SD_BASE + SD_CLK_CTRL, RegValue);

    for(i = 1; i <= 4; i++)
        SdCmdBuf[i] = 0;
    Status = SdSendCmd(STOP_TRANS, SdCmdBuf);
    if(Status != STATUS_SUCCESS)
        return Status;
 
    SdWaitCard();
      
    return STATUS_SUCCESS; 
}
//----------------------------------------------------------------------------
STATUS SdWaitCmd()
{
  CmdTimer = SD_CMD_TIMEOUT;	
  while ((!(CSRRead(SD_BASE + SD_IE) & SD_COMPLETE)) && CmdTimer);
  // Clear command complete INT.	
  CSRWrite(SD_BASE + SD_IE, ~SD_COMPLETE);

  if (CmdTimer)
    return STATUS_SUCCESS;
  else 
  {
    //DebugShow("<SD> Wait TimeOut! Cmd = %02bx\r\n", CmdBuf[0]);
    SdCtrlReset();
    return STATUS_FLASH_ERROR;
  }
}	
//--------------------------------------------------------------------
// Read first sector of data from SD/MMC
//--------------------------------------------------------------------
STATUS SdReadOneSector()
{
    STATUS Status;
    int RetryCount1 , RetryCount2;
    bool ReadyForData;

    if(SectorStart > SdAvailableBlocks)
        return STATUS_PARAM_ERROR;

    SdWaitCard();
  
    for(RetryCount1 = 0; RetryCount1 < 5; RetryCount1++)
    {
        ReadyForData = false;
        for(RetryCount2 = 0; RetryCount2 < 20; RetryCount2++)  //讀取SD/MMC卡的狀態,SD/MMC卡沒準備好發送數據則循環重試20次
        {
            *((UINT32 *)(&SdCmdBuf[1])) = RCA;
            Status = SdSendCmd(SEND_STATUS, SdCmdBuf);	//發送帶一個response的命令,以得到當前SD/MMC卡的狀態
            if(Status != STATUS_SUCCESS)
                continue;  
            if(SdRespBuf[3] & 0x01) // READY_FOR_DATA in Card Status
            {
                ReadyForData = true;
                break;
            }
        }        

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品久久久久一区二区三区共| 精品88久久久久88久久久| 日本欧美韩国一区三区| 久久久久久免费毛片精品| 91久久线看在观草草青青| 麻豆91免费看| 亚洲国产日韩综合久久精品| 国产亚洲欧美一区在线观看| 欧美日韩一区高清| 国产 欧美在线| 日本伊人色综合网| 一区二区三区 在线观看视频| 久久亚洲综合色一区二区三区| 91国产福利在线| 国产高清视频一区| 久久精品国产精品亚洲红杏| 夜夜精品浪潮av一区二区三区| 久久精品欧美日韩| 欧美一区二区精美| 欧美日韩一区二区欧美激情| 91捆绑美女网站| 国产成人免费xxxxxxxx| 激情欧美一区二区| 蜜臀av在线播放一区二区三区| 一区二区三区四区在线免费观看| 国产精品家庭影院| 日本一区二区三区四区在线视频| 欧美大片拔萝卜| 9191成人精品久久| 欧美精品一卡二卡| 911精品国产一区二区在线| 欧美日精品一区视频| 色偷偷久久人人79超碰人人澡| 高清在线成人网| 国产不卡在线视频| 国产精品综合网| 国产一区视频在线看| 蜜臀久久99精品久久久画质超高清 | 欧美一区二区成人| 欧美日韩亚洲高清一区二区| 在线成人小视频| 777久久久精品| 666欧美在线视频| 69堂国产成人免费视频| 欧美久久久久久久久| 欧美高清一级片在线| 欧美疯狂做受xxxx富婆| 欧美日韩国产精选| 欧美一级精品大片| 日韩精品一区在线| 久久久欧美精品sm网站| 国产片一区二区| 国产精品对白交换视频| 亚洲欧美日韩国产综合在线| 1区2区3区国产精品| 国产精品传媒视频| 亚洲国产欧美在线| 奇米色一区二区| 国产精品一级黄| 97久久精品人人澡人人爽| 91猫先生在线| 欧美日韩在线观看一区二区 | 99久久婷婷国产| 色婷婷久久一区二区三区麻豆| 色成人在线视频| 欧美丰满一区二区免费视频| 欧美一级淫片007| 国产欧美日韩亚州综合| 亚洲人成影院在线观看| 亚洲午夜精品网| 蜜臀国产一区二区三区在线播放| 国产另类ts人妖一区二区| 91在线视频播放地址| 在线综合+亚洲+欧美中文字幕| 精品久久久久久亚洲综合网 | 亚洲欧美日韩在线| 日韩在线卡一卡二| 国产一区二区福利| 日本福利一区二区| 日韩你懂的在线播放| 综合久久给合久久狠狠狠97色 | 久久精品视频网| 一区二区三区欧美视频| 精品一区二区三区在线视频| av一区二区三区四区| 制服视频三区第一页精品| 欧美高清在线精品一区| 午夜久久久久久电影| 国产成人精品在线看| 欧美日韩国产中文| 国产蜜臀av在线一区二区三区| 亚洲一区免费在线观看| 激情图区综合网| 欧美三级在线播放| 国产精品丝袜91| 免费高清成人在线| 色婷婷av久久久久久久| 久久久久国色av免费看影院| 亚洲gay无套男同| 粉嫩在线一区二区三区视频| 欧美日本一道本在线视频| 国产精品护士白丝一区av| 九色|91porny| 在线成人小视频| 亚洲精选免费视频| 国产91精品在线观看| 日韩一级大片在线| 一区二区三区欧美日| 成人动漫一区二区三区| 日韩欧美的一区二区| 亚洲精品日日夜夜| 成人国产精品免费| 精品电影一区二区三区| 日韩av一区二| 欧美亚洲综合色| 亚洲色图制服诱惑| 从欧美一区二区三区| 精品av综合导航| 麻豆成人久久精品二区三区红| 欧美亚洲日本国产| 亚洲精品成人悠悠色影视| 成人性生交大合| 久久女同性恋中文字幕| 老司机精品视频一区二区三区| 欧美日韩国产美| 亚洲精品少妇30p| 91亚洲精品乱码久久久久久蜜桃| 国产欧美在线观看一区| 国产福利一区在线观看| 精品国产91亚洲一区二区三区婷婷 | 国产欧美精品一区| 激情五月激情综合网| 日韩欧美一区二区三区在线| 亚洲成人综合在线| 欧美日韩专区在线| 婷婷一区二区三区| 欧美日韩卡一卡二| 亚洲不卡一区二区三区| 欧美亚洲一区三区| 天堂蜜桃一区二区三区| 欧美日韩国产综合视频在线观看| 亚洲一区二区中文在线| 欧美在线免费播放| 亚洲不卡在线观看| 欧美一区二区三区婷婷月色| 免费高清在线一区| 亚洲精品在线免费播放| 国产在线观看免费一区| 久久久精品免费免费| 成人激情免费网站| 亚洲日韩欧美一区二区在线| 色偷偷久久一区二区三区| 亚洲福利视频一区二区| 欧美精选午夜久久久乱码6080| 日韩电影一二三区| 久久久国产精华| 99久久久久免费精品国产| 亚洲男同1069视频| 欧美高清视频不卡网| 免费av成人在线| 久久亚洲一区二区三区四区| 成人黄色777网| 一区二区日韩av| 日韩欧美高清在线| 懂色av一区二区三区蜜臀| 亚洲精品乱码久久久久久黑人 | 日韩三级av在线播放| 国产麻豆精品久久一二三| 中文字幕在线一区二区三区| 在线视频欧美精品| 久久国产综合精品| 亚洲欧洲无码一区二区三区| 欧美中文字幕不卡| 精品一区二区三区免费毛片爱| 国产精品美女久久久久久久 | 91亚洲国产成人精品一区二三| 亚洲丶国产丶欧美一区二区三区| 91精品福利在线一区二区三区| 国产九色sp调教91| 亚洲一线二线三线久久久| www日韩大片| 色88888久久久久久影院按摩 | 欧美一区二区免费观在线| 国产大片一区二区| 亚洲一卡二卡三卡四卡 | 久久久精品免费免费| 91福利国产精品| 寂寞少妇一区二区三区| 亚洲品质自拍视频| 日韩女优av电影在线观看| 色综合久久久久久久久久久| 久久99国产精品免费网站| 亚洲欧美视频一区| 久久久久久久性| 在线播放一区二区三区| 色先锋资源久久综合| 国产福利不卡视频| 日本中文一区二区三区| 尤物在线观看一区| 国产色婷婷亚洲99精品小说|