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

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

?? sdcard.c

?? ARM_CORTEX-M3應用實例開發詳解光盤
?? C
?? 第 1 頁 / 共 5 頁
字號:
  errorstatus = IsCardProgramming(&cardstate);

  while ((errorstatus == SD_OK) && ((cardstate == SD_CARD_PROGRAMMING) || (cardstate == SD_CARD_RECEIVING)))
  {
    errorstatus = IsCardProgramming(&cardstate);
  }

  return(errorstatus);
}

/*******************************************************************************
* 函數名  : SD_GetTransferState
* 功能描述    : Gets the cuurent data transfer state.
* 輸入          : None
* 輸出         : None
* Return         : SDTransferState: Data Transfer state.
*                  This value can be: 
*                   - SD_NO_TRANSFER: No data transfer is acting
*                   - SD_TRANSFER_IN_PROGRESS: Data transfer is acting
*******************************************************************************/
SDTransferState SD_GetTransferState(void)
{
  if (SDIO->STA & (SDIO_FLAG_TXACT | SDIO_FLAG_RXACT))
  {
    return(SD_TRANSFER_IN_PROGRESS);
  }
  else
  {
    return(SD_NO_TRANSFER);
  }
}

/*******************************************************************************
* 函數名  : SD_StopTransfer
* 功能描述    : Aborts an ongoing data transfer.
* 輸入          : None
* 輸出         : None
* Return         : SD_Error: SD Card Error code.
*******************************************************************************/
SD_Error SD_StopTransfer(void)
{
  SD_Error errorstatus = SD_OK;

  /* Send CMD12 STOP_TRANSMISSION  */
  SDIO_CmdInitStructure.SDIO_Argument = 0x0;
  SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_STOP_TRANSMISSION;
  SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  SDIO_SendCommand(&SDIO_CmdInitStructure);

  errorstatus = CmdResp1Error(SDIO_STOP_TRANSMISSION);

  return(errorstatus);
}

/*******************************************************************************
* 函數名  : SD_Erase
* 功能描述    : Allows to erase memory area specified for the given card.
* 輸入          : - startaddr: the start address.
*                  - endaddr: the end address.
* 輸出         : None
* Return         : SD_Error: SD Card Error code.
*******************************************************************************/
SD_Error SD_Erase(u32 startaddr, u32 endaddr)
{
  SD_Error errorstatus = SD_OK;
  u32 delay = 0;
  vu32 maxdelay = 0;
  u8 cardstate = 0;

  /* Check if the card coomnd class supports erase command */
  if (((CSD_Tab[1] >> 20) & SD_CCCC_ERASE) == 0)
  {
    errorstatus = SD_REQUEST_NOT_APPLICABLE;
    return(errorstatus);
  }

  maxdelay = 72000 / ((SDIO->CLKCR & 0xFF) + 2);

  if (SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED)
  {
    errorstatus = SD_LOCK_UNLOCK_FAILED;
    return(errorstatus);
  }

  /* According to sd-card spec 1.0 ERASE_GROUP_START (CMD32) and erase_group_end(CMD33) */
  if ((SDIO_SECURE_DIGITAL_CARD == CardType) ||  (SDIO_HIGH_CAPACITY_SD_CARD == CardType))
  {
    /* Send CMD32 SD_ERASE_GRP_START with argument as addr  */
    SDIO_CmdInitStructure.SDIO_Argument = startaddr;
    SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SD_ERASE_GRP_START;
    SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
    SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
    SDIO_SendCommand(&SDIO_CmdInitStructure);

    errorstatus = CmdResp1Error(SDIO_SD_ERASE_GRP_START);
    if (errorstatus != SD_OK)
    {
      return(errorstatus);
    }

    /* Send CMD33 SD_ERASE_GRP_END with argument as addr  */
    SDIO_CmdInitStructure.SDIO_Argument = endaddr;
    SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SD_ERASE_GRP_END;
    SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
    SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
    SDIO_SendCommand(&SDIO_CmdInitStructure);

    errorstatus = CmdResp1Error(SDIO_SD_ERASE_GRP_END);
    if (errorstatus != SD_OK)
    {
      return(errorstatus);
    }
  }

  /* Send CMD38 ERASE */
  SDIO_CmdInitStructure.SDIO_Argument = 0;
  SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_ERASE;
  SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  SDIO_SendCommand(&SDIO_CmdInitStructure);

  errorstatus = CmdResp1Error(SDIO_ERASE);

  if (errorstatus != SD_OK)
  {
    return(errorstatus);
  }

  for (delay = 0; delay < maxdelay; delay++)
  {}

  /* Wait till the card is in programming state */
  errorstatus = IsCardProgramming(&cardstate);

  while ((errorstatus == SD_OK) && ((SD_CARD_PROGRAMMING == cardstate) || (SD_CARD_RECEIVING == cardstate)))
  {
    errorstatus = IsCardProgramming(&cardstate);
  }

  return(errorstatus);
}

/*******************************************************************************
* 函數名  : SD_SendStatus
* 功能描述    : Returns the current card's status.
* 輸入          : pcardstatus: pointer to the buffer that will contain the SD 
*                  card status (Card Status register).
* 輸出         : None
* Return         : SD_Error: SD Card Error code.
*******************************************************************************/
SD_Error SD_SendStatus(u32 *pcardstatus)
{
  SD_Error errorstatus = SD_OK;

  if (pcardstatus == NULL)
  {
    errorstatus = SD_INVALID_PARAMETER;
    return(errorstatus);
  }

  SDIO_CmdInitStructure.SDIO_Argument = (u32) RCA << 16;
  SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SEND_STATUS;
  SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  SDIO_SendCommand(&SDIO_CmdInitStructure);


  errorstatus = CmdResp1Error(SDIO_SEND_STATUS);

  if (errorstatus != SD_OK)
  {
    return(errorstatus);
  }

  *pcardstatus = SDIO_GetResponse(SDIO_RESP1);

  return(errorstatus);
}

/*******************************************************************************
* 函數名  : SD_SendSDStatus
* 功能描述    : Returns the current SD card's status.
* 輸入          : psdstatus: pointer to the buffer that will contain the SD 
*                  card status (SD Status register).
* 輸出         : None
* Return         : SD_Error: SD Card Error code.
*******************************************************************************/
SD_Error SD_SendSDStatus(u32 *psdstatus)
{
  SD_Error errorstatus = SD_OK;
  u32 count = 0;

  if (SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED)
  {
    errorstatus = SD_LOCK_UNLOCK_FAILED;
    return(errorstatus);
  }

  /* Set block size for card if it is not equal to current block size for card. */
  SDIO_CmdInitStructure.SDIO_Argument = 64;
  SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SET_BLOCKLEN;
  SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  SDIO_SendCommand(&SDIO_CmdInitStructure);

  errorstatus = CmdResp1Error(SDIO_SET_BLOCKLEN);

  if (errorstatus != SD_OK)
  {
    return(errorstatus);
  }

  /* CMD55 */
  SDIO_CmdInitStructure.SDIO_Argument = (u32) RCA << 16;
  SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_APP_CMD;
  SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  SDIO_SendCommand(&SDIO_CmdInitStructure);
  errorstatus = CmdResp1Error(SDIO_APP_CMD);

  if (errorstatus != SD_OK)
  {
    return(errorstatus);
  }

  SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT;
  SDIO_DataInitStructure.SDIO_DataLength = 64;
  SDIO_DataInitStructure.SDIO_DataBlockSize = SDIO_DataBlockSize_64b;
  SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToSDIO;
  SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block;
  SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Enable;
  SDIO_DataConfig(&SDIO_DataInitStructure);


  /* Send ACMD13 SD_APP_STAUS  with argument as card's RCA.*/
  SDIO_CmdInitStructure.SDIO_Argument = 0;
  SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SD_APP_STAUS;
  SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  SDIO_SendCommand(&SDIO_CmdInitStructure);
  errorstatus = CmdResp1Error(SDIO_SD_APP_STAUS);

  if (errorstatus != SD_OK)
  {
    return(errorstatus);
  }

  while (!(SDIO->STA &(SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR)))
  {
    if (SDIO_GetFlagStatus(SDIO_FLAG_RXFIFOHF) != RESET)
    {
      for (count = 0; count < 8; count++)
      {
        *(psdstatus + count) = SDIO_ReadData();
      }
      psdstatus += 8;
    }
  }

  if (SDIO_GetFlagStatus(SDIO_FLAG_DTIMEOUT) != RESET)
  {
    SDIO_ClearFlag(SDIO_FLAG_DTIMEOUT);
    errorstatus = SD_DATA_TIMEOUT;
    return(errorstatus);
  }
  else if (SDIO_GetFlagStatus(SDIO_FLAG_DCRCFAIL) != RESET)
  {
    SDIO_ClearFlag(SDIO_FLAG_DCRCFAIL);
    errorstatus = SD_DATA_CRC_FAIL;
    return(errorstatus);
  }
  else if (SDIO_GetFlagStatus(SDIO_FLAG_RXOVERR) != RESET)
  {
    SDIO_ClearFlag(SDIO_FLAG_RXOVERR);
    errorstatus = SD_RX_OVERRUN;
    return(errorstatus);
  }
  else if (SDIO_GetFlagStatus(SDIO_FLAG_STBITERR) != RESET)
  {
    SDIO_ClearFlag(SDIO_FLAG_STBITERR);
    errorstatus = SD_START_BIT_ERR;
    return(errorstatus);
  }

  while (SDIO_GetFlagStatus(SDIO_FLAG_RXDAVL) != RESET)
  {
    *psdstatus = SDIO_ReadData();
    psdstatus++;
  }

  /* Clear all the static status flags*/
  SDIO_ClearFlag(SDIO_STATIC_FLAGS);
  psdstatus -= 16;
  for (count = 0; count < 16; count++)
  {
    psdstatus[count] = ((psdstatus[count] & SD_0TO7BITS) << 24) |((psdstatus[count] & SD_8TO15BITS) << 8) |
                       ((psdstatus[count] & SD_16TO23BITS) >> 8) |((psdstatus[count] & SD_24TO31BITS) >> 24);
  }
  return(errorstatus);
}

/*******************************************************************************
* 函數名  : SD_ProcessIRQSrc
* 功能描述    : Allows to process all the interrupts that are high.
* 輸入          : None
* 輸出         : None
* Return         : SD_Error: SD Card Error code.
*******************************************************************************/
SD_Error SD_ProcessIRQSrc(void)
{
  u32 count = 0, restwords = 0;

  if (DeviceMode == SD_INTERRUPT_MODE)
  {
    if (SDIO_GetITStatus(SDIO_IT_RXFIFOHF) != RESET)
    {
      for (count = 0; count < SD_HALFFIFO; count++)
      {
        *(DestBuffer + count) = SDIO_ReadData();
      }
      DestBuffer += SD_HALFFIFO;
      NumberOfBytes += SD_HALFFIFOBYTES;
    }
    else if (SDIO_GetITStatus(SDIO_IT_TXFIFOHE) != RESET)
    {
      if ((TotalNumberOfBytes - NumberOfBytes) < SD_HALFFIFOBYTES)
      {
        restwords = ((TotalNumberOfBytes - NumberOfBytes) %  4 == 0) ?
                    ((TotalNumberOfBytes - NumberOfBytes) / 4) :
                    ((TotalNumberOfBytes - NumberOfBytes) / 4 + 1);

        for (count = 0; count < restwords;  count++, SrcBuffer++, NumberOfBytes += 4)
        {
          SDIO_WriteData(*SrcBuffer);
        }
      }
      else
      {
        for (count = 0; count < SD_HALFFIFO; count++)
        {
          SDIO_WriteData(*(SrcBuffer + count));
        }

        SrcBuffer += SD_HALFFIFO;
        NumberOfBytes += SD_HALFFIFOBYTES;
      }
    }
  }

  if (SDIO_GetITStatus(SDIO_IT_DATAEND) != RESET)
  {
    if (DeviceMode != SD_DMA_MODE)
    {
      while ((SDIO_GetFlagStatus(SDIO_FLAG_RXDAVL) != RESET)  &&  (NumberOfBytes < TotalNumberOfBytes))
      {
        *DestBuffer = SDIO_ReadData();
        DestBuffer++;
        NumberOfBytes += 4;
      }
    }

    if (StopCondition == 1)
    {
      TransferError = SD_StopTransfer();
    }
    else
    {
      TransferError = SD_OK;
    }
    SDIO_ClearITPendingBit(SDIO_IT_DATAEND);
    SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |
                  SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR |
                  SDIO_IT_RXOVERR | SDIO_IT_STBITERR, DISAB

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲麻豆国产自偷在线| 久久99国内精品| 国产精品一区二区在线观看网站 | 亚洲国产精品传媒在线观看| 日本人妖一区二区| 欧美色视频在线| 亚洲欧美日韩综合aⅴ视频| 国产成人精品免费视频网站| 国产精品伦理在线| 捆绑紧缚一区二区三区视频| 91精品国产综合久久国产大片| 亚洲自拍欧美精品| 欧美日韩国产另类不卡| 麻豆一区二区三区| 亚洲欧洲日韩女同| 日韩一区二区三区观看| 国产麻豆午夜三级精品| 午夜国产精品一区| 国产精品久久毛片| 欧美日韩第一区日日骚| 久久国产精品免费| 亚洲精品视频在线观看免费| 欧美一级二级三级蜜桃| 成人精品视频一区| 婷婷中文字幕综合| 国产精品毛片大码女人| 91麻豆精品国产自产在线| 国产成人精品亚洲午夜麻豆| 亚洲综合精品久久| 亚洲国产成人在线| 久久亚洲综合色| 欧美撒尿777hd撒尿| aaa欧美日韩| 91免费国产视频网站| 日韩电影在线一区二区三区| 亚洲天堂精品视频| 国产日韩亚洲欧美综合| 精品国产百合女同互慰| 欧美蜜桃一区二区三区 | 国产午夜精品久久| 精品免费一区二区三区| 制服丝袜中文字幕一区| 制服丝袜亚洲网站| 欧美女孩性生活视频| 在线中文字幕一区| 色噜噜狠狠色综合欧洲selulu| 91免费版在线看| 日本高清无吗v一区| 99re视频精品| 91丝袜高跟美女视频| 色哟哟一区二区| 欧美日韩国产一二三| 欧美久久久久久久久中文字幕| 色综合久久综合网| 日本久久电影网| 制服丝袜中文字幕一区| 欧美一级xxx| 国产欧美日韩在线观看| 亚洲免费高清视频在线| 日韩精品乱码免费| 国产成人超碰人人澡人人澡| 日韩精品一区在线| 日韩欧美一级片| 国产欧美精品在线观看| 夜夜操天天操亚洲| 日韩激情在线观看| 国产精品一级在线| 欧美怡红院视频| 国产欧美日韩精品在线| 天天操天天干天天综合网| 激情久久久久久久久久久久久久久久| 国产 日韩 欧美大片| 欧美日韩免费电影| 国产精品三级电影| 青椒成人免费视频| 91视频免费播放| 久久综合狠狠综合久久激情| 亚洲自拍偷拍九九九| 91精品国产色综合久久不卡电影| 欧美经典一区二区| 国产在线精品一区二区夜色| 欧美日韩视频在线第一区| 亚洲欧美在线高清| 国产高清不卡一区| 日韩免费高清电影| 亚洲综合丁香婷婷六月香| 99久久综合国产精品| 日本一区二区三区免费乱视频 | 一区二区三区日韩精品视频| 欧美日韩电影一区| 亚洲欧洲日韩一区二区三区| 91精品国产综合久久福利软件 | 五月激情丁香一区二区三区| 99久精品国产| 国产精品拍天天在线| 成人一区二区三区视频在线观看| 欧美国产欧美综合| 99国产精品国产精品久久| 国产精品久久久久久久裸模| 成人黄色一级视频| 中文字幕一区二区三区精华液 | 日韩免费在线观看| 国产在线视频不卡二| 国产欧美日韩在线视频| 色94色欧美sute亚洲线路一久| 亚洲欧美日韩中文字幕一区二区三区 | 国产日韩欧美高清在线| 成人免费毛片片v| 亚洲国产一区二区三区| 7777女厕盗摄久久久| 国产精品夜夜嗨| 一区二区在线观看视频| 欧美军同video69gay| 国产98色在线|日韩| 亚洲永久免费av| 久久日韩粉嫩一区二区三区 | 精品在线观看免费| 国产精品成人午夜| 91精品国产免费| 99久久综合国产精品| 麻豆国产精品一区二区三区| 亚洲天堂a在线| 欧美精品一区二区三区高清aⅴ| 91视频.com| 国产精品99久久久久久久女警| 一区二区三区蜜桃网| 久久久久久久久久久99999| 欧美久久久一区| 在线观看免费一区| 高清av一区二区| 日韩精品亚洲专区| 亚洲一区二区三区国产| 国产精品久久久久久久久久久免费看 | 亚洲综合在线电影| 亚洲婷婷综合久久一本伊一区| 欧美mv和日韩mv国产网站| 91精品国产综合久久精品| 欧美影视一区二区三区| 欧美唯美清纯偷拍| 日本精品视频一区二区| 99视频一区二区三区| 成人av午夜电影| eeuss鲁片一区二区三区在线看| 国产99久久久精品| 国产一区二区三区香蕉| 91丨九色丨黑人外教| 国产丶欧美丶日本不卡视频| 国产一区二区视频在线| 国产精品18久久久| 99在线热播精品免费| 91丨porny丨首页| 欧美在线影院一区二区| 欧美人妇做爰xxxⅹ性高电影 | 欧美日本乱大交xxxxx| 欧美精品黑人性xxxx| 欧美va亚洲va国产综合| 久久久99精品久久| 国产精品污网站| 亚洲一区二区在线播放相泽 | 免播放器亚洲一区| 国产精一区二区三区| 99re视频精品| 欧美成人综合网站| √…a在线天堂一区| 日韩成人dvd| 色综合中文字幕国产 | 夜夜嗨av一区二区三区四季av| 青娱乐精品视频在线| 91视频.com| 久久蜜臀精品av| 亚洲成人av电影| 成人av电影观看| 欧美成人午夜电影| 亚洲第一二三四区| 成人性生交大片免费看在线播放| 欧美三片在线视频观看| 国产精品福利一区| 国产在线看一区| 91精品国产一区二区| 亚洲影院久久精品| 成人午夜免费视频| 久久综合狠狠综合久久激情 | 一本色道久久综合亚洲91| 国产精品亲子伦对白| 福利一区二区在线观看| 精品av久久707| 国产精品资源站在线| 精品国免费一区二区三区| 丝袜美腿成人在线| 538在线一区二区精品国产| 亚洲一区二区三区三| 欧美精品一级二级三级| 日韩va欧美va亚洲va久久| 欧美三区免费完整视频在线观看| 亚洲女同ⅹxx女同tv| 欧洲av一区二区嗯嗯嗯啊| 亚洲在线成人精品| 337p亚洲精品色噜噜狠狠| 日本中文字幕一区二区视频| 91精品午夜视频|