zoukankan      html  css  js  c++  java
  • stm32 sdio sdcard fatfs

    
    
      1 /****************************************Copyright (c)****************************************************
      2  **
      3  **                                 http://www.powermcu.com
      4  **
      5  **--------------File Info---------------------------------------------------------------------------------
      6  ** File name:               diskio.c
      7  ** Descriptions:            The FATFS Diskio
      8  **
      9  **--------------------------------------------------------------------------------------------------------
     10  ** Created by:              AVRman
     11  ** Created date:            2010-11-4
     12  ** Version:                 v1.0
     13  ** Descriptions:            The original version
     14  **
     15  **--------------------------------------------------------------------------------------------------------
     16  ** Modified by:
     17  ** Modified date:
     18  ** Version:
     19  ** Descriptions:
     20  **
     21  *********************************************************************************************************/
     22 
     23 /* Includes ------------------------------------------------------------------*/
     24 #include "diskio.h"
     25 #include "sdio_sd.h"
     26 
     27 /* Private variables ---------------------------------------------------------*/
     28 extern SD_CardInfo SDCardInfo;
     29 
     30 DSTATUS disk_initialize ( BYTE drv /* Physical drive nmuber (0..) */ )
     31 {
     32   SD_Error Status;
     33 
     34   switch ( drv )
     35   {
     36   case 0:
     37     Status = SD_Init ( ); ;
     38     if ( Status == SD_OK )
     39     {
     40       return 0;
     41     }
     42     else
     43     {
     44       return STA_NOINIT;
     45     }
     46 
     47   case 1:
     48     return STA_NOINIT;
     49 
     50   case 2:
     51     return STA_NOINIT;
     52   }
     53   return STA_NOINIT;
     54 }
     55 
     56 /*-----------------------------------------------------------------------*/
     57 /* Return Disk Status                                                    */
     58 
     59 DSTATUS disk_status ( BYTE drv /* Physical drive nmuber (0..) */ )
     60 {
     61   switch ( drv )
     62   {
     63   case 0:
     64 
     65     /* translate the reslut code here    */
     66 
     67     return 0;
     68 
     69   case 1:
     70 
     71     /* translate the reslut code here    */
     72 
     73     return 0;
     74 
     75   case 2:
     76 
     77     /* translate the reslut code here    */
     78 
     79     return 0;
     80 
     81   default:
     82 
     83     break;
     84   }
     85   return STA_NOINIT;
     86 }
     87 
     88 /*-----------------------------------------------------------------------*/
     89 /* Read Sector(s)                                                        */
     90 
     91 DRESULT disk_read ( BYTE drv, /* Physical drive nmuber (0..) */ BYTE * buff,
     92   /* Data buffer to store read data */ DWORD sector,
     93   /* Sector address (LBA) */ BYTE count
     94   /* Number of sectors to read (1..255) */ )
     95 {
     96   SD_Error Status;
     97   if ( !count )
     98   {
     99     return RES_PARERR; /* count不能等于0,否则返回参数错误 */
    100   }
    101 
    102   switch ( drv )
    103   {
    104 
    105   case 0:
    106     if ( count == 1 ) /* 1个sector的读操作 */
    107     {
    108       Status = SD_ReadBlock ( buff, sector << 9, SDCardInfo.CardBlockSize );
    109     }
    110     else /* 多个sector的读操作 */
    111     {
    112       Status = SD_ReadMultiBlocks ( buff, sector << 9, SDCardInfo.CardBlockSize,
    113         count );
    114     }
    115     if ( Status == SD_OK )
    116     {
    117       return RES_OK;
    118     }
    119     else
    120     {
    121       return RES_ERROR;
    122     }
    123 
    124   case 1:
    125     break;
    126 
    127   case 2:
    128     break;
    129 
    130   default:
    131     break;
    132 
    133   }
    134 
    135   return RES_ERROR;
    136 }
    137 
    138 /*-----------------------------------------------------------------------*/
    139 /* Write Sector(s)                                                       */
    140 
    141 #if _READONLY == 0
    142 
    143 DRESULT disk_write ( BYTE drv,
    144   /* Physical drive nmuber (0..) */ const BYTE * buff,
    145   /* Data to be written */ DWORD sector,
    146   /* Sector address (LBA) */ BYTE count
    147   /* Number of sectors to write (1..255) */ )
    148 {
    149   SD_Error Status;
    150   if ( !count )
    151   {
    152     return RES_PARERR; /* count不能等于0,否则返回参数错误 */
    153   }
    154 
    155   switch ( drv )
    156   {
    157   case 0:
    158     if ( count == 1 ) /* 1个sector的写操作 */
    159     {
    160       Status = SD_WriteBlock ( ( uint8_t* )( &buff[ 0 ] ), sector << 9,
    161         SDCardInfo.CardBlockSize );
    162     }
    163     else /* 多个sector的写操作 */
    164     {
    165       Status = SD_WriteMultiBlocks ( ( uint8_t* )( &buff[ 0 ] ), sector << 9,
    166         SDCardInfo.CardBlockSize, count );
    167     }
    168     if ( Status == SD_OK )
    169     {
    170       return RES_OK;
    171     }
    172     else
    173     {
    174       return RES_ERROR;
    175     }
    176   case 2:
    177     break;
    178   default:
    179     break;
    180   }
    181   return RES_ERROR;
    182 }
    183 #endif /* _READONLY */
    184 
    185 /*-----------------------------------------------------------------------*/
    186 /* Miscellaneous Functions                                               */
    187 
    188 DRESULT disk_ioctl ( BYTE drv, /* Physical drive nmuber (0..) */ BYTE ctrl,
    189   /* Control code */ void * buff /* Buffer to send/receive control data */ )
    190 {
    191   if ( drv )
    192   {
    193     return RES_PARERR; /* 仅支持单磁盘操作,否则返回参数错误 */
    194   }
    195   switch ( ctrl )
    196   {
    197   case CTRL_SYNC:
    198 
    199     return RES_OK;
    200 
    201   case GET_SECTOR_COUNT:
    202     *( DWORD* )buff = SDCardInfo.CardCapacity / SDCardInfo.CardBlockSize;
    203     return RES_OK;
    204 
    205   case GET_BLOCK_SIZE:
    206     *( WORD* )buff = SDCardInfo.CardBlockSize;
    207     return RES_OK;
    208 
    209   case CTRL_POWER:
    210     break;
    211 
    212   case CTRL_LOCK:
    213     break;
    214 
    215   case CTRL_EJECT:
    216     break;
    217 
    218     /* MMC/SDC command */
    219   case MMC_GET_TYPE:
    220     break;
    221 
    222   case MMC_GET_CSD:
    223     break;
    224 
    225   case MMC_GET_CID:
    226     break;
    227 
    228   case MMC_GET_OCR:
    229     break;
    230 
    231   case MMC_GET_SDSTAT:
    232     break;
    233   }
    234   return RES_PARERR;
    235 }
    236 
    237 /* 得到文件Calendar格式的建立日期,是DWORD get_fattime (void) 逆变换 */
    238 /*-----------------------------------------------------------------------*/
    239 /* User defined function to give a current time to fatfs module          */
    240 /* 31-25: Year(0-127 org.1980), 24-21: Month(1-12), 20-16: Day(1-31) */
    241 /* 15-11: Hour(0-23), 10-5: Minute(0-59), 4-0: Second(0-29 *2) */
    242 DWORD get_fattime ( void )
    243 {
    244 
    245   return 0;
    246 }
    247 
    248 /*********************************************************************************************************
    249  END FILE
    250  *********************************************************************************************************/
    
    
    
       1 /****************************************Copyright (c)****************************************************
       2  **
       3  **                                 http://www.powermcu.com
       4  **
       5  **--------------File Info---------------------------------------------------------------------------------
       6  ** File name:               sdio_sd.h
       7  ** Descriptions:            sdio sd卡操作函数
       8  **
       9  **--------------------------------------------------------------------------------------------------------
      10  ** Created by:              AVRman
      11  ** Created date:            2010-10-30
      12  ** Version:                 v1.0
      13  ** Descriptions:            The original version
      14  **
      15  **--------------------------------------------------------------------------------------------------------
      16  ** Modified by:
      17  ** Modified date:
      18  ** Version:
      19  ** Descriptions:
      20  **
      21  *********************************************************************************************************/
      22 
      23 /******************************************************************************
      24  *          +-----------------------------------------------------------+
      25  *          |                     Pin assignment                        |
      26  *          +-----------------------------+---------------+-------------+
      27  *          |  STM32 SDIO Pins            |     SD        |    Pin      |
      28  *          +-----------------------------+---------------+-------------+
      29  *          |      SDIO D2                |   D2          |    1        |
      30  *          |      SDIO D3                |   D3          |    2        |
      31  *          |      SDIO CMD               |   CMD         |    3        |
      32  *          |                             |   VCC         |    4 (3.3 V)|
      33  *          |      SDIO CK               |    CLK         |    5        |
      34  *          |                             |   GND         |    6 (0 V)  |
      35  *          |      SDIO D0                |   D0          |    7        |
      36  *          |      SDIO D1                |   D1          |    8        |
      37  *          +-----------------------------+---------------+-------------+
      38  *****************************************************************************/
      39 
      40 /* Includes ------------------------------------------------------------------*/
      41 #include "sdio_sd.h"
      42 
      43 /**
      44  * @brief  SDIO Static flags, TimeOut, FIFO Address
      45  */
      46 #define NULL 0
      47 #define SDIO_STATIC_FLAGS               ((uint32_t)0x000005FF)
      48 #define SDIO_CMD0TIMEOUT                ((uint32_t)0x00010000)
      49 
      50 /**
      51  * @brief  Mask for errors Card Status R1 (OCR Register)
      52  */
      53 #define SD_OCR_ADDR_OUT_OF_RANGE        ((uint32_t)0x80000000)
      54 #define SD_OCR_ADDR_MISALIGNED          ((uint32_t)0x40000000)
      55 #define SD_OCR_BLOCK_LEN_ERR            ((uint32_t)0x20000000)
      56 #define SD_OCR_ERASE_SEQ_ERR            ((uint32_t)0x10000000)
      57 #define SD_OCR_BAD_ERASE_PARAM          ((uint32_t)0x08000000)
      58 #define SD_OCR_WRITE_PROT_VIOLATION     ((uint32_t)0x04000000)
      59 #define SD_OCR_LOCK_UNLOCK_FAILED       ((uint32_t)0x01000000)
      60 #define SD_OCR_COM_CRC_FAILED           ((uint32_t)0x00800000)
      61 #define SD_OCR_ILLEGAL_CMD              ((uint32_t)0x00400000)
      62 #define SD_OCR_CARD_ECC_FAILED          ((uint32_t)0x00200000)
      63 #define SD_OCR_CC_ERROR                 ((uint32_t)0x00100000)
      64 #define SD_OCR_GENERAL_UNKNOWN_ERROR    ((uint32_t)0x00080000)
      65 #define SD_OCR_STREAM_READ_UNDERRUN     ((uint32_t)0x00040000)
      66 #define SD_OCR_STREAM_WRITE_OVERRUN     ((uint32_t)0x00020000)
      67 #define SD_OCR_CID_CSD_OVERWRIETE       ((uint32_t)0x00010000)
      68 #define SD_OCR_WP_ERASE_SKIP            ((uint32_t)0x00008000)
      69 #define SD_OCR_CARD_ECC_DISABLED        ((uint32_t)0x00004000)
      70 #define SD_OCR_ERASE_RESET              ((uint32_t)0x00002000)
      71 #define SD_OCR_AKE_SEQ_ERROR            ((uint32_t)0x00000008)
      72 #define SD_OCR_ERRORBITS                ((uint32_t)0xFDFFE008)
      73 
      74 /**
      75  * @brief  Masks for R6 Response
      76  */
      77 #define SD_R6_GENERAL_UNKNOWN_ERROR     ((uint32_t)0x00002000)
      78 #define SD_R6_ILLEGAL_CMD               ((uint32_t)0x00004000)
      79 #define SD_R6_COM_CRC_FAILED            ((uint32_t)0x00008000)
      80 
      81 #define SD_VOLTAGE_WINDOW_SD            ((uint32_t)0x80100000)
      82 #define SD_HIGH_CAPACITY                ((uint32_t)0x40000000)
      83 #define SD_STD_CAPACITY                 ((uint32_t)0x00000000)
      84 #define SD_CHECK_PATTERN                ((uint32_t)0x000001AA)
      85 
      86 #define SD_MAX_VOLT_TRIAL               ((uint32_t)0x0000FFFF)
      87 #define SD_ALLZERO                      ((uint32_t)0x00000000)
      88 
      89 #define SD_WIDE_BUS_SUPPORT             ((uint32_t)0x00040000)
      90 #define SD_SINGLE_BUS_SUPPORT           ((uint32_t)0x00010000)
      91 #define SD_CARD_LOCKED                  ((uint32_t)0x02000000)
      92 
      93 #define SD_DATATIMEOUT                  ((uint32_t)0x000FFFFF)
      94 #define SD_0TO7BITS                     ((uint32_t)0x000000FF)
      95 #define SD_8TO15BITS                    ((uint32_t)0x0000FF00)
      96 #define SD_16TO23BITS                   ((uint32_t)0x00FF0000)
      97 #define SD_24TO31BITS                   ((uint32_t)0xFF000000)
      98 #define SD_MAX_DATA_LENGTH              ((uint32_t)0x01FFFFFF)
      99 
     100 #define SD_HALFFIFO                     ((uint32_t)0x00000008)
     101 #define SD_HALFFIFOBYTES                ((uint32_t)0x00000020)
     102 
     103 /**
     104  * @brief  Command Class Supported
     105  */
     106 #define SD_CCCC_LOCK_UNLOCK             ((uint32_t)0x00000080)
     107 #define SD_CCCC_WRITE_PROT              ((uint32_t)0x00000040)
     108 #define SD_CCCC_ERASE                   ((uint32_t)0x00000020)
     109 
     110 /**
     111  * @brief  Following commands are SD Card Specific commands.
     112  *         SDIO_APP_CMD should be sent before sending these commands.
     113  */
     114 #define SDIO_SEND_IF_COND               ((uint32_t)0x00000008)
     115 
     116 /**
     117  * @}
     118  */
     119 
     120 /** @defgroup STM32_EVAL_SDIO_SD_Private_Macros
     121  * @{
     122  */
     123 /**
     124  * @}
     125  */
     126 
     127 /** @defgroup STM32_EVAL_SDIO_SD_Private_Variables
     128  * @{
     129  */
     130 static uint32_t CardType = SDIO_STD_CAPACITY_SD_CARD_V1_1;
     131 static uint32_t CSD_Tab[ 4 ], CID_Tab[ 4 ], RCA = 0;
     132 static uint32_t DeviceMode         = SD_POLLING_MODE;
     133 static uint32_t TotalNumberOfBytes = 0, StopCondition = 0;
     134 uint32_t * SrcBuffer, *DestBuffer;
     135 __IO SD_Error TransferError = SD_OK;
     136 __IO uint32_t TransferEnd   = 0;
     137 __IO uint32_t NumberOfBytes = 0;
     138 SD_CardInfo SDCardInfo;
     139 SDIO_InitTypeDef SDIO_InitStructure;
     140 SDIO_CmdInitTypeDef SDIO_CmdInitStructure;
     141 SDIO_DataInitTypeDef SDIO_DataInitStructure;
     142 /**
     143  * @}
     144  */
     145 
     146 /** @defgroup STM32_EVAL_SDIO_SD_Private_Function_Prototypes
     147  * @{
     148  */
     149 static SD_Error CmdError ( void );
     150 static SD_Error CmdResp1Error ( uint8_t cmd );
     151 static SD_Error CmdResp7Error ( void );
     152 static SD_Error CmdResp3Error ( void );
     153 static SD_Error CmdResp2Error ( void );
     154 static SD_Error CmdResp6Error ( uint8_t cmd, uint16_t * prca );
     155 static SD_Error SDEnWideBus ( FunctionalState NewState );
     156 static SD_Error IsCardProgramming ( uint8_t * pstatus );
     157 static SD_Error FindSCR ( uint16_t rca, uint32_t * pscr );
     158 static uint8_t convert_from_bytes_to_power_of_two ( uint16_t NumberOfBytes );
     159 
     160 /**
     161  * @}
     162  */
     163 
     164 /** @defgroup STM32_EVAL_SDIO_SD_Private_Functions
     165  * @{
     166  */
     167 
     168 /**
     169  * @brief  DeInitializes the SDIO interface.
     170  * @param  None
     171  * @retval None
     172  */
     173 void SD_DeInit ( void )
     174 {
     175 
     176 }
     177 
     178 /**
     179  * @brief  Initializes the SD Card and put it into StandBy State (Ready for
     180  *         data transfer).
     181  * @param  None
     182  * @retval None
     183  */
     184 void SD_LowLevel_Init ( void )
     185 {
     186   GPIO_InitTypeDef GPIO_InitStructure;
     187 
     188   /*!< GPIOC and GPIOD Periph clock enable */
     189   RCC_APB2PeriphClockCmd ( RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD |
     190     SD_DETECT_GPIO_CLK, ENABLE );
     191 
     192   /*!< Configure PC.08, PC.09, PC.10, PC.11, PC.12 pin: D0, D1, D2, D3, CLK pin */
     193   GPIO_InitStructure.GPIO_Pin =
     194     GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12;
     195   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     196   GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
     197   GPIO_Init ( GPIOC, & GPIO_InitStructure );
     198 
     199   /*!< Configure PD.02 CMD line */
     200   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
     201   GPIO_Init ( GPIOD, & GPIO_InitStructure );
     202 
     203   /*!< Configure SD_CD pin: SD Card detect pin */
     204   GPIO_InitStructure.GPIO_Pin  = SD_DETECT_PIN;
     205   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
     206   GPIO_Init ( SD_DETECT_GPIO_PORT, & GPIO_InitStructure );
     207 
     208   /*!< Enable the SDIO AHB Clock */
     209   RCC_AHBPeriphClockCmd ( RCC_AHBPeriph_SDIO, ENABLE );
     210 
     211   /*!< Enable the DMA2 Clock */
     212   RCC_AHBPeriphClockCmd ( RCC_AHBPeriph_DMA2, ENABLE );
     213 }
     214 
     215 uint32_t SD_DMAEndOfTransferStatus ( void )
     216 {
     217   return ( uint32_t )DMA_GetFlagStatus ( DMA2_FLAG_TC4 );
     218 }
     219 
     220 /**
     221  * @brief  Configures the DMA2 Channel4 for SDIO Rx request.
     222  * @param  BufferDST: pointer to the destination buffer
     223  * @param  BufferSize: buffer size
     224  * @retval None
     225  */
     226 void SD_LowLevel_DMA_RxConfig ( uint32_t * BufferDST, uint32_t BufferSize )
     227 {
     228   DMA_InitTypeDef DMA_InitStructure;
     229 
     230   DMA_ClearFlag ( DMA2_FLAG_TC4 | DMA2_FLAG_TE4 | DMA2_FLAG_HT4 |
     231     DMA2_FLAG_GL4 );
     232 
     233   /*!< DMA2 Channel4 disable */
     234   DMA_Cmd ( DMA2_Channel4, DISABLE );
     235 
     236   /*!< DMA2 Channel4 Config */
     237   DMA_InitStructure.DMA_PeripheralBaseAddr = ( uint32_t )SDIO_FIFO_ADDRESS;
     238   DMA_InitStructure.DMA_MemoryBaseAddr     = ( uint32_t )BufferDST;
     239   DMA_InitStructure.DMA_DIR                = DMA_DIR_PeripheralSRC;
     240   DMA_InitStructure.DMA_BufferSize         = BufferSize / 4;
     241   DMA_InitStructure.DMA_PeripheralInc      = DMA_PeripheralInc_Disable;
     242   DMA_InitStructure.DMA_MemoryInc          = DMA_MemoryInc_Enable;
     243   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
     244   DMA_InitStructure.DMA_MemoryDataSize     = DMA_MemoryDataSize_Word;
     245   DMA_InitStructure.DMA_Mode               = DMA_Mode_Normal;
     246   DMA_InitStructure.DMA_Priority           = DMA_Priority_High;
     247   DMA_InitStructure.DMA_M2M                = DMA_M2M_Disable;
     248   DMA_Init ( DMA2_Channel4, & DMA_InitStructure );
     249 
     250   /*!< DMA2 Channel4 enable */
     251   DMA_Cmd ( DMA2_Channel4, ENABLE );
     252 }
     253 
     254 /**
     255  * @brief  Configures the DMA2 Channel4 for SDIO Tx request.
     256  * @param  BufferSRC: pointer to the source buffer
     257  * @param  BufferSize: buffer size
     258  * @retval None
     259  */
     260 void SD_LowLevel_DMA_TxConfig ( uint32_t * BufferSRC, uint32_t BufferSize )
     261 {
     262 
     263   DMA_InitTypeDef DMA_InitStructure;
     264 
     265   DMA_ClearFlag ( DMA2_FLAG_TC4 | DMA2_FLAG_TE4 | DMA2_FLAG_HT4 |
     266     DMA2_FLAG_GL4 );
     267 
     268   /*!< DMA2 Channel4 disable */
     269   DMA_Cmd ( DMA2_Channel4, DISABLE );
     270 
     271   /*!< DMA2 Channel4 Config */
     272   DMA_InitStructure.DMA_PeripheralBaseAddr = ( uint32_t )SDIO_FIFO_ADDRESS;
     273   DMA_InitStructure.DMA_MemoryBaseAddr     = ( uint32_t )BufferSRC;
     274   DMA_InitStructure.DMA_DIR                = DMA_DIR_PeripheralDST;
     275   DMA_InitStructure.DMA_BufferSize         = BufferSize / 4;
     276   DMA_InitStructure.DMA_PeripheralInc      = DMA_PeripheralInc_Disable;
     277   DMA_InitStructure.DMA_MemoryInc          = DMA_MemoryInc_Enable;
     278   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
     279   DMA_InitStructure.DMA_MemoryDataSize     = DMA_MemoryDataSize_Word;
     280   DMA_InitStructure.DMA_Mode               = DMA_Mode_Normal;
     281   DMA_InitStructure.DMA_Priority           = DMA_Priority_High;
     282   DMA_InitStructure.DMA_M2M                = DMA_M2M_Disable;
     283   DMA_Init ( DMA2_Channel4, & DMA_InitStructure );
     284 
     285   /*!< DMA2 Channel4 enable */
     286   DMA_Cmd ( DMA2_Channel4, ENABLE );
     287 }
     288 
     289 /**
     290  * @brief  Initializes the SD Card and put it into StandBy State (Ready for data
     291  *         transfer).
     292  * @param  None
     293  * @retval SD_Error: SD Card Error code.
     294  */
     295 SD_Error SD_Init ( void )
     296 {
     297   SD_Error errorstatus = SD_OK;
     298 
     299   /* SDIO Peripheral Low Level Init */
     300   SD_LowLevel_Init ( );
     301 
     302   SDIO_DeInit ( );
     303 
     304   errorstatus = SD_PowerON ( );
     305 
     306   if ( errorstatus != SD_OK )
     307   {
     308     /*!< CMD Response TimeOut (wait for CMDSENT flag) */
     309     return ( errorstatus );
     310   }
     311 
     312   errorstatus = SD_InitializeCards ( );
     313 
     314   if ( errorstatus != SD_OK )
     315   {
     316     /*!< CMD Response TimeOut (wait for CMDSENT flag) */
     317     return ( errorstatus );
     318   }
     319 
     320   /*!< Configure the SDIO peripheral */
     321   /*!< SDIOCLK = HCLK, SDIO_CK = HCLK/(2 + SDIO_TRANSFER_CLK_DIV) */
     322   SDIO_InitStructure.SDIO_ClockDiv = SDIO_TRANSFER_CLK_DIV;
     323   SDIO_InitStructure.SDIO_ClockEdge           = SDIO_ClockEdge_Rising;
     324   SDIO_InitStructure.SDIO_ClockBypass         = SDIO_ClockBypass_Disable;
     325   SDIO_InitStructure.SDIO_ClockPowerSave      = SDIO_ClockPowerSave_Disable;
     326   SDIO_InitStructure.SDIO_BusWide             = SDIO_BusWide_1b;
     327   SDIO_InitStructure.SDIO_HardwareFlowControl =
     328     SDIO_HardwareFlowControl_Disable;
     329   SDIO_Init ( & SDIO_InitStructure );
     330 
     331   if ( errorstatus == SD_OK )
     332   {
     333     /*----------------- Read CSD/CID MSD registers ------------------*/
     334     errorstatus = SD_GetCardInfo ( &SDCardInfo );
     335   }
     336 
     337   if ( errorstatus == SD_OK )
     338   {
     339     /*----------------- Select Card --------------------------------*/
     340     errorstatus = SD_SelectDeselect ( ( uint32_t )( SDCardInfo.RCA << 16 ) );
     341   }
     342 
     343   if ( errorstatus == SD_OK )
     344   {
     345     errorstatus = SD_EnableWideBusOperation ( SDIO_BusWide_4b );
     346   }
     347 
     348   /* Set Device Transfer Mode to DMA */
     349   if ( errorstatus == SD_OK )
     350   {
     351     errorstatus = SD_SetDeviceMode ( SD_DMA_MODE );
     352   }
     353 
     354   return ( errorstatus );
     355 }
     356 
     357 /**
     358  * @brief  Gets the cuurent sd card data transfer status.
     359  * @param  None
     360  * @retval SDTransferState: Data Transfer state.
     361  *   This value can be:
     362  *        - SD_TRANSFER_OK: No data transfer is acting
     363  *        - SD_TRANSFER_BUSY: Data transfer is acting
     364  */
     365 SDTransferState SD_GetStatus ( void )
     366 {
     367   SDCardState cardstate = SD_CARD_TRANSFER;
     368 
     369   cardstate = SD_GetState ( );
     370 
     371   if ( cardstate == SD_CARD_TRANSFER )
     372   {
     373     return ( SD_TRANSFER_OK );
     374   }
     375   else if ( cardstate == SD_CARD_ERROR )
     376   {
     377     return ( SD_TRANSFER_ERROR );
     378   }
     379   else
     380   {
     381     return ( SD_TRANSFER_BUSY );
     382   }
     383 }
     384 
     385 /**
     386  * @brief  Returns the current card's state.
     387  * @param  None
     388  * @retval SDCardState: SD Card Error or SD Card Current State.
     389  */
     390 SDCardState SD_GetState ( void )
     391 {
     392   uint32_t resp1 = 0;
     393 
     394   if ( SD_Detect( ) == SD_PRESENT )
     395   {
     396     if ( SD_SendStatus( &resp1 ) != SD_OK )
     397     {
     398       return SD_CARD_ERROR;
     399     }
     400     else
     401     {
     402       return ( SDCardState )( ( resp1 >> 9 ) & 0x0F );
     403     }
     404   }
     405   else
     406   {
     407     return SD_CARD_ERROR;
     408   }
     409 }
     410 
     411 /**
     412  * @brief  Detect if SD card is correctly plugged in the memory slot.
     413  * @param  None
     414  * @retval Return if SD is detected or not
     415  */
     416 uint8_t SD_Detect ( void )
     417 {
     418   __IO uint8_t status = SD_PRESENT;
     419 
     420   /*!< Check GPIO to detect SD */
     421   if ( GPIO_ReadInputDataBit( SD_DETECT_GPIO_PORT, SD_DETECT_PIN )
     422     != Bit_RESET )
     423   {
     424     status = SD_NOT_PRESENT;
     425   }
     426   return status;
     427 }
     428 
     429 /**
     430  * @brief  Enquires cards about their operating voltage and configures
     431  *   clock controls.
     432  * @param  None
     433  * @retval SD_Error: SD Card Error code.
     434  */
     435 SD_Error SD_PowerON ( void )
     436 {
     437   SD_Error errorstatus = SD_OK;
     438   uint32_t response    = 0, count = 0, validvoltage = 0;
     439   uint32_t SDType      = SD_STD_CAPACITY;
     440 
     441   /*!< Power ON Sequence -----------------------------------------------------*/
     442   /*!< Configure the SDIO peripheral */
     443   /*!< SDIOCLK = HCLK, SDIO_CK = HCLK/(2 + SDIO_INIT_CLK_DIV) */
     444   /*!< SDIO_CK for initialization should not exceed 400 KHz */
     445   SDIO_InitStructure.SDIO_ClockDiv            = SDIO_INIT_CLK_DIV;
     446   SDIO_InitStructure.SDIO_ClockEdge           = SDIO_ClockEdge_Rising;
     447   SDIO_InitStructure.SDIO_ClockBypass         = SDIO_ClockBypass_Disable;
     448   SDIO_InitStructure.SDIO_ClockPowerSave      = SDIO_ClockPowerSave_Disable;
     449   SDIO_InitStructure.SDIO_BusWide             = SDIO_BusWide_1b;
     450   SDIO_InitStructure.SDIO_HardwareFlowControl =
     451     SDIO_HardwareFlowControl_Disable;
     452   SDIO_Init ( & SDIO_InitStructure );
     453 
     454   /*!< Set Power State to ON */
     455   SDIO_SetPowerState ( SDIO_PowerState_ON );
     456 
     457   /*!< Enable SDIO Clock */
     458   SDIO_ClockCmd ( ENABLE );
     459 
     460   /*!< CMD0: GO_IDLE_STATE ---------------------------------------------------*/
     461   /*!< No CMD response required */
     462   SDIO_CmdInitStructure.SDIO_Argument = 0x0;
     463   SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_GO_IDLE_STATE;
     464   SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_No;
     465   SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
     466   SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
     467   SDIO_SendCommand ( & SDIO_CmdInitStructure );
     468 
     469   errorstatus = CmdError ( );
     470 
     471   if ( errorstatus != SD_OK )
     472   {
     473     /*!< CMD Response TimeOut (wait for CMDSENT flag) */
     474     return ( errorstatus );
     475   }
     476 
     477   /*!< CMD8: SEND_IF_COND ----------------------------------------------------*/
     478   /*!< Send CMD8 to verify SD card interface operating condition */
     479   /*!< Argument: - [31:12]: Reserved (shall be set to '0')
     480    - [11:8]: Supply Voltage (VHS) 0x1 (Range: 2.7-3.6 V)
     481    - [7:0]: Check Pattern (recommended 0xAA) */
     482   /*!< CMD Response: R7 */
     483   SDIO_CmdInitStructure.SDIO_Argument = SD_CHECK_PATTERN;
     484   SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SEND_IF_COND;
     485   SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
     486   SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
     487   SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
     488   SDIO_SendCommand ( & SDIO_CmdInitStructure );
     489 
     490   errorstatus = CmdResp7Error ( );
     491 
     492   if ( errorstatus == SD_OK )
     493   {
     494     CardType = SDIO_STD_CAPACITY_SD_CARD_V2_0; /*!< SD Card 2.0 */
     495     SDType   = SD_HIGH_CAPACITY;
     496   }
     497   else
     498   {
     499     /*!< CMD55 */
     500     SDIO_CmdInitStructure.SDIO_Argument = 0x00;
     501     SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_APP_CMD;
     502     SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
     503     SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
     504     SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
     505     SDIO_SendCommand ( & SDIO_CmdInitStructure );
     506     errorstatus = CmdResp1Error ( SD_CMD_APP_CMD );
     507   }
     508   /*!< CMD55 */
     509   SDIO_CmdInitStructure.SDIO_Argument = 0x00;
     510   SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_APP_CMD;
     511   SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
     512   SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
     513   SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
     514   SDIO_SendCommand ( & SDIO_CmdInitStructure );
     515   errorstatus = CmdResp1Error ( SD_CMD_APP_CMD );
     516 
     517   /*!< If errorstatus is Command TimeOut, it is a MMC card */
     518   /*!< If errorstatus is SD_OK it is a SD card: SD card 2.0 (voltage range mismatch)
     519    or SD card 1.x */
     520   if ( errorstatus == SD_OK )
     521   {
     522     /*!< SD CARD */
     523     /*!< Send ACMD41 SD_APP_OP_COND with Argument 0x80100000 */
     524     while ( ( !validvoltage ) && ( count < SD_MAX_VOLT_TRIAL ) )
     525     {
     526 
     527       /*!< SEND CMD55 APP_CMD with RCA as 0 */
     528       SDIO_CmdInitStructure.SDIO_Argument = 0x00;
     529       SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_APP_CMD;
     530       SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
     531       SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
     532       SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
     533       SDIO_SendCommand ( & SDIO_CmdInitStructure );
     534 
     535       errorstatus = CmdResp1Error ( SD_CMD_APP_CMD );
     536 
     537       if ( errorstatus != SD_OK )
     538       {
     539         return ( errorstatus );
     540       }
     541       SDIO_CmdInitStructure.SDIO_Argument = SD_VOLTAGE_WINDOW_SD | SDType;
     542       SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SD_APP_OP_COND;
     543       SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
     544       SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
     545       SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
     546       SDIO_SendCommand ( & SDIO_CmdInitStructure );
     547 
     548       errorstatus = CmdResp3Error ( );
     549       if ( errorstatus != SD_OK )
     550       {
     551         return ( errorstatus );
     552       }
     553 
     554       response = SDIO_GetResponse ( SDIO_RESP1 );
     555       validvoltage = ( ( ( response >> 31 ) == 1 ) ? 1 : 0 );
     556       count++;
     557     }
     558     if ( count >= SD_MAX_VOLT_TRIAL )
     559     {
     560       errorstatus = SD_INVALID_VOLTRANGE;
     561       return ( errorstatus );
     562     }
     563 
     564     if ( response &= SD_HIGH_CAPACITY )
     565     {
     566       CardType = SDIO_HIGH_CAPACITY_SD_CARD;
     567     }
     568 
     569   } /*!< else MMC Card */
     570 
     571   return ( errorstatus );
     572 }
     573 
     574 /**
     575  * @brief  Turns the SDIO output signals off.
     576  * @param  None
     577  * @retval SD_Error: SD Card Error code.
     578  */
     579 SD_Error SD_PowerOFF ( void )
     580 {
     581   SD_Error errorstatus = SD_OK;
     582 
     583   /*!< Set Power State to OFF */
     584   SDIO_SetPowerState ( SDIO_PowerState_OFF );
     585 
     586   return ( errorstatus );
     587 }
     588 
     589 /**
     590  * @brief  Intialises all cards or single card as the case may be Card(s) come
     591  *         into standby state.
     592  * @param  None
     593  * @retval SD_Error: SD Card Error code.
     594  */
     595 SD_Error SD_InitializeCards ( void )
     596 {
     597   SD_Error errorstatus = SD_OK;
     598   uint16_t rca         = 0x01;
     599 
     600   if ( SDIO_GetPowerState( ) == SDIO_PowerState_OFF )
     601   {
     602     errorstatus = SD_REQUEST_NOT_APPLICABLE;
     603     return ( errorstatus );
     604   }
     605 
     606   if ( SDIO_SECURE_DIGITAL_IO_CARD != CardType )
     607   {
     608     /*!< Send CMD2 ALL_SEND_CID */
     609     SDIO_CmdInitStructure.SDIO_Argument = 0x0;
     610     SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_ALL_SEND_CID;
     611     SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Long;
     612     SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
     613     SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
     614     SDIO_SendCommand ( & SDIO_CmdInitStructure );
     615 
     616     errorstatus = CmdResp2Error ( );
     617 
     618     if ( SD_OK != errorstatus )
     619     {
     620       return ( errorstatus );
     621     }
     622 
     623     CID_Tab[ 0 ] = SDIO_GetResponse ( SDIO_RESP1 );
     624     CID_Tab[ 1 ] = SDIO_GetResponse ( SDIO_RESP2 );
     625     CID_Tab[ 2 ] = SDIO_GetResponse ( SDIO_RESP3 );
     626     CID_Tab[ 3 ] = SDIO_GetResponse ( SDIO_RESP4 );
     627   }
     628   if ( ( SDIO_STD_CAPACITY_SD_CARD_V1_1 == CardType ) ||
     629     ( SDIO_STD_CAPACITY_SD_CARD_V2_0 == CardType ) ||
     630     ( SDIO_SECURE_DIGITAL_IO_COMBO_CARD == CardType ) ||
     631     ( SDIO_HIGH_CAPACITY_SD_CARD == CardType ) )
     632   {
     633     /*!< Send CMD3 SET_REL_ADDR with argument 0 */
     634     /*!< SD Card publishes its RCA. */
     635     SDIO_CmdInitStructure.SDIO_Argument = 0x00;
     636     SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SET_REL_ADDR;
     637     SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
     638     SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
     639     SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
     640     SDIO_SendCommand ( & SDIO_CmdInitStructure );
     641 
     642     errorstatus = CmdResp6Error ( SD_CMD_SET_REL_ADDR, &rca );
     643 
     644     if ( SD_OK != errorstatus )
     645     {
     646       return ( errorstatus );
     647     }
     648   }
     649 
     650   if ( SDIO_SECURE_DIGITAL_IO_CARD != CardType )
     651   {
     652     RCA = rca;
     653 
     654     /*!< Send CMD9 SEND_CSD with argument as card's RCA */
     655     SDIO_CmdInitStructure.SDIO_Argument = ( uint32_t )( rca << 16 );
     656     SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SEND_CSD;
     657     SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Long;
     658     SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
     659     SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
     660     SDIO_SendCommand ( & SDIO_CmdInitStructure );
     661 
     662     errorstatus = CmdResp2Error ( );
     663 
     664     if ( SD_OK != errorstatus )
     665     {
     666       return ( errorstatus );
     667     }
     668 
     669     CSD_Tab[ 0 ] = SDIO_GetResponse ( SDIO_RESP1 );
     670     CSD_Tab[ 1 ] = SDIO_GetResponse ( SDIO_RESP2 );
     671     CSD_Tab[ 2 ] = SDIO_GetResponse ( SDIO_RESP3 );
     672     CSD_Tab[ 3 ] = SDIO_GetResponse ( SDIO_RESP4 );
     673   }
     674 
     675   errorstatus = SD_OK; /*!< All cards get intialized */
     676 
     677   return ( errorstatus );
     678 }
     679 
     680 /**
     681  * @brief  Returns information about specific card.
     682  * @param  cardinfo: pointer to a SD_CardInfo structure that contains all SD card
     683  *         information.
     684  * @retval SD_Error: SD Card Error code.
     685  */
     686 SD_Error SD_GetCardInfo ( SD_CardInfo * cardinfo )
     687 {
     688   SD_Error errorstatus = SD_OK;
     689   uint8_t  tmp         = 0;
     690 
     691   cardinfo->CardType = ( uint8_t )CardType;
     692   cardinfo->RCA      = ( uint16_t )RCA;
     693 
     694   /*!< Byte 0 */
     695   tmp = ( uint8_t )( ( CSD_Tab[ 0 ] & 0xFF000000 ) >> 24 );
     696   cardinfo->SD_csd.CSDStruct = ( tmp & 0xC0 ) >> 6;
     697   cardinfo->SD_csd.SysSpecVersion = ( tmp & 0x3C ) >> 2;
     698   cardinfo->SD_csd.Reserved1      = tmp & 0x03;
     699 
     700   /*!< Byte 1 */
     701   tmp                   = ( uint8_t )( ( CSD_Tab[ 0 ] & 0x00FF0000 ) >> 16 );
     702   cardinfo->SD_csd.TAAC = tmp;
     703 
     704   /*!< Byte 2 */
     705   tmp                   = ( uint8_t )( ( CSD_Tab[ 0 ] & 0x0000FF00 ) >> 8 );
     706   cardinfo->SD_csd.NSAC = tmp;
     707 
     708   /*!< Byte 3 */
     709   tmp                            = ( uint8_t )( CSD_Tab[ 0 ] & 0x000000FF );
     710   cardinfo->SD_csd.MaxBusClkFrec = tmp;
     711 
     712   /*!< Byte 4 */
     713   tmp = ( uint8_t )( ( CSD_Tab[ 1 ] & 0xFF000000 ) >> 24 );
     714   cardinfo->SD_csd.CardComdClasses = tmp << 4;
     715 
     716   /*!< Byte 5 */
     717   tmp = ( uint8_t )( ( CSD_Tab[ 1 ] & 0x00FF0000 ) >> 16 );
     718   cardinfo->SD_csd.CardComdClasses |= ( tmp & 0xF0 ) >> 4;
     719   cardinfo->SD_csd.RdBlockLen = tmp & 0x0F;
     720 
     721   /*!< Byte 6 */
     722   tmp = ( uint8_t )( ( CSD_Tab[ 1 ] & 0x0000FF00 ) >> 8 );
     723   cardinfo->SD_csd.PartBlockRead = ( tmp & 0x80 ) >> 7;
     724   cardinfo->SD_csd.WrBlockMisalign = ( tmp & 0x40 ) >> 6;
     725   cardinfo->SD_csd.RdBlockMisalign = ( tmp & 0x20 ) >> 5;
     726   cardinfo->SD_csd.DSRImpl         = ( tmp & 0x10 ) >> 4;
     727   cardinfo->SD_csd.Reserved2       = 0; /*!< Reserved */
     728 
     729   if ( ( CardType == SDIO_STD_CAPACITY_SD_CARD_V1_1 ) ||
     730     ( CardType == SDIO_STD_CAPACITY_SD_CARD_V2_0 ) )
     731   {
     732     cardinfo->SD_csd.DeviceSize = ( tmp & 0x03 ) << 10;
     733 
     734     /*!< Byte 7 */
     735     tmp = ( uint8_t )( CSD_Tab[ 1 ] & 0x000000FF );
     736     cardinfo->SD_csd.DeviceSize |= ( tmp ) << 2;
     737 
     738     /*!< Byte 8 */
     739     tmp = ( uint8_t )( ( CSD_Tab[ 2 ] & 0xFF000000 ) >> 24 );
     740     cardinfo->SD_csd.DeviceSize |= ( tmp & 0xC0 ) >> 6;
     741 
     742     cardinfo->SD_csd.MaxRdCurrentVDDMin = ( tmp & 0x38 ) >> 3;
     743     cardinfo->SD_csd.MaxRdCurrentVDDMax = ( tmp & 0x07 );
     744 
     745     /*!< Byte 9 */
     746     tmp = ( uint8_t )( ( CSD_Tab[ 2 ] & 0x00FF0000 ) >> 16 );
     747     cardinfo->SD_csd.MaxWrCurrentVDDMin = ( tmp & 0xE0 ) >> 5;
     748     cardinfo->SD_csd.MaxWrCurrentVDDMax = ( tmp & 0x1C ) >> 2;
     749     cardinfo->SD_csd.DeviceSizeMul      = ( tmp & 0x03 ) << 1;
     750     /*!< Byte 10 */
     751     tmp = ( uint8_t )( ( CSD_Tab[ 2 ] & 0x0000FF00 ) >> 8 );
     752     cardinfo->SD_csd.DeviceSizeMul |= ( tmp & 0x80 ) >> 7;
     753 
     754     cardinfo->CardCapacity = ( cardinfo->SD_csd.DeviceSize + 1 );
     755     cardinfo->CardCapacity *= ( 1 << ( cardinfo->SD_csd.DeviceSizeMul + 2 ) );
     756     cardinfo->CardBlockSize = 1 << ( cardinfo->SD_csd.RdBlockLen );
     757     cardinfo->CardCapacity *= cardinfo->CardBlockSize;
     758   }
     759   else if ( CardType == SDIO_HIGH_CAPACITY_SD_CARD )
     760   {
     761     /*!< Byte 7 */
     762     tmp                         = ( uint8_t )( CSD_Tab[ 1 ] & 0x000000FF );
     763     cardinfo->SD_csd.DeviceSize = ( tmp & 0x3F ) << 16;
     764 
     765     /*!< Byte 8 */
     766     tmp = ( uint8_t )( ( CSD_Tab[ 2 ] & 0xFF000000 ) >> 24 );
     767 
     768     cardinfo->SD_csd.DeviceSize |= ( tmp << 8 );
     769 
     770     /*!< Byte 9 */
     771     tmp = ( uint8_t )( ( CSD_Tab[ 2 ] & 0x00FF0000 ) >> 16 );
     772 
     773     cardinfo->SD_csd.DeviceSize |= ( tmp );
     774 
     775     /*!< Byte 10 */
     776     tmp = ( uint8_t )( ( CSD_Tab[ 2 ] & 0x0000FF00 ) >> 8 );
     777 
     778     cardinfo->CardCapacity  = ( cardinfo->SD_csd.DeviceSize + 1 ) * 512 * 1024;
     779     cardinfo->CardBlockSize = 512;
     780   }
     781 
     782   cardinfo->SD_csd.EraseGrSize = ( tmp & 0x40 ) >> 6;
     783   cardinfo->SD_csd.EraseGrMul = ( tmp & 0x3F ) << 1;
     784 
     785   /*!< Byte 11 */
     786   tmp = ( uint8_t )( CSD_Tab[ 2 ] & 0x000000FF );
     787   cardinfo->SD_csd.EraseGrMul |= ( tmp & 0x80 ) >> 7;
     788   cardinfo->SD_csd.WrProtectGrSize = ( tmp & 0x7F );
     789 
     790   /*!< Byte 12 */
     791   tmp = ( uint8_t )( ( CSD_Tab[ 3 ] & 0xFF000000 ) >> 24 );
     792   cardinfo->SD_csd.WrProtectGrEnable = ( tmp & 0x80 ) >> 7;
     793   cardinfo->SD_csd.ManDeflECC    = ( tmp & 0x60 ) >> 5;
     794   cardinfo->SD_csd.WrSpeedFact   = ( tmp & 0x1C ) >> 2;
     795   cardinfo->SD_csd.MaxWrBlockLen = ( tmp & 0x03 ) << 2;
     796 
     797   /*!< Byte 13 */
     798   tmp = ( uint8_t )( ( CSD_Tab[ 3 ] & 0x00FF0000 ) >> 16 );
     799   cardinfo->SD_csd.MaxWrBlockLen |= ( tmp & 0xC0 ) >> 6;
     800   cardinfo->SD_csd.WriteBlockPaPartial = ( tmp & 0x20 ) >> 5;
     801   cardinfo->SD_csd.Reserved3           = 0;
     802   cardinfo->SD_csd.ContentProtectAppli = ( tmp & 0x01 );
     803 
     804   /*!< Byte 14 */
     805   tmp = ( uint8_t )( ( CSD_Tab[ 3 ] & 0x0000FF00 ) >> 8 );
     806   cardinfo->SD_csd.FileFormatGrouop = ( tmp & 0x80 ) >> 7;
     807   cardinfo->SD_csd.CopyFlag      = ( tmp & 0x40 ) >> 6;
     808   cardinfo->SD_csd.PermWrProtect = ( tmp & 0x20 ) >> 5;
     809   cardinfo->SD_csd.TempWrProtect = ( tmp & 0x10 ) >> 4;
     810   cardinfo->SD_csd.FileFormat    = ( tmp & 0x0C ) >> 2;
     811   cardinfo->SD_csd.ECC           = ( tmp & 0x03 );
     812 
     813   /*!< Byte 15 */
     814   tmp                        = ( uint8_t )( CSD_Tab[ 3 ] & 0x000000FF );
     815   cardinfo->SD_csd.CSD_CRC   = ( tmp & 0xFE ) >> 1;
     816   cardinfo->SD_csd.Reserved4 = 1;
     817 
     818   /*!< Byte 0 */
     819   tmp = ( uint8_t )( ( CID_Tab[ 0 ] & 0xFF000000 ) >> 24 );
     820   cardinfo->SD_cid.ManufacturerID = tmp;
     821 
     822   /*!< Byte 1 */
     823   tmp = ( uint8_t )( ( CID_Tab[ 0 ] & 0x00FF0000 ) >> 16 );
     824   cardinfo->SD_cid.OEM_AppliID = tmp << 8;
     825 
     826   /*!< Byte 2 */
     827   tmp = ( uint8_t )( ( CID_Tab[ 0 ] & 0x000000FF00 ) >> 8 );
     828   cardinfo->SD_cid.OEM_AppliID |= tmp;
     829 
     830   /*!< Byte 3 */
     831   tmp                        = ( uint8_t )( CID_Tab[ 0 ] & 0x000000FF );
     832   cardinfo->SD_cid.ProdName1 = tmp << 24;
     833 
     834   /*!< Byte 4 */
     835   tmp = ( uint8_t )( ( CID_Tab[ 1 ] & 0xFF000000 ) >> 24 );
     836   cardinfo->SD_cid.ProdName1 |= tmp << 16;
     837 
     838   /*!< Byte 5 */
     839   tmp = ( uint8_t )( ( CID_Tab[ 1 ] & 0x00FF0000 ) >> 16 );
     840   cardinfo->SD_cid.ProdName1 |= tmp << 8;
     841 
     842   /*!< Byte 6 */
     843   tmp = ( uint8_t )( ( CID_Tab[ 1 ] & 0x0000FF00 ) >> 8 );
     844   cardinfo->SD_cid.ProdName1 |= tmp;
     845 
     846   /*!< Byte 7 */
     847   tmp                        = ( uint8_t )( CID_Tab[ 1 ] & 0x000000FF );
     848   cardinfo->SD_cid.ProdName2 = tmp;
     849 
     850   /*!< Byte 8 */
     851   tmp = ( uint8_t )( ( CID_Tab[ 2 ] & 0xFF000000 ) >> 24 );
     852   cardinfo->SD_cid.ProdRev = tmp;
     853 
     854   /*!< Byte 9 */
     855   tmp                     = ( uint8_t )( ( CID_Tab[ 2 ] & 0x00FF0000 ) >> 16 );
     856   cardinfo->SD_cid.ProdSN = tmp << 24;
     857 
     858   /*!< Byte 10 */
     859   tmp = ( uint8_t )( ( CID_Tab[ 2 ] & 0x0000FF00 ) >> 8 );
     860   cardinfo->SD_cid.ProdSN |= tmp << 16;
     861 
     862   /*!< Byte 11 */
     863   tmp = ( uint8_t )( CID_Tab[ 2 ] & 0x000000FF );
     864   cardinfo->SD_cid.ProdSN |= tmp << 8;
     865 
     866   /*!< Byte 12 */
     867   tmp = ( uint8_t )( ( CID_Tab[ 3 ] & 0xFF000000 ) >> 24 );
     868   cardinfo->SD_cid.ProdSN |= tmp;
     869 
     870   /*!< Byte 13 */
     871   tmp = ( uint8_t )( ( CID_Tab[ 3 ] & 0x00FF0000 ) >> 16 );
     872   cardinfo->SD_cid.Reserved1 |= ( tmp & 0xF0 ) >> 4;
     873   cardinfo->SD_cid.ManufactDate = ( tmp & 0x0F ) << 8;
     874 
     875   /*!< Byte 14 */
     876   tmp = ( uint8_t )( ( CID_Tab[ 3 ] & 0x0000FF00 ) >> 8 );
     877   cardinfo->SD_cid.ManufactDate |= tmp;
     878 
     879   /*!< Byte 15 */
     880   tmp                        = ( uint8_t )( CID_Tab[ 3 ] & 0x000000FF );
     881   cardinfo->SD_cid.CID_CRC   = ( tmp & 0xFE ) >> 1;
     882   cardinfo->SD_cid.Reserved2 = 1;
     883 
     884   return ( errorstatus );
     885 }
     886 
     887 /**
     888  * @brief  Enables wide bus opeartion for the requeseted card if supported by
     889  *         card.
     890  * @param  WideMode: Specifies the SD card wide bus mode.
     891  *   This parameter can be one of the following values:
     892  *     @arg SDIO_BusWide_8b: 8-bit data transfer (Only for MMC)
     893  *     @arg SDIO_BusWide_4b: 4-bit data transfer
     894  *     @arg SDIO_BusWide_1b: 1-bit data transfer
     895  * @retval SD_Error: SD Card Error code.
     896  */
     897 SD_Error SD_EnableWideBusOperation ( uint32_t WideMode )
     898 {
     899   SD_Error errorstatus = SD_OK;
     900 
     901   /*!< MMC Card doesn't support this feature */
     902   if ( SDIO_MULTIMEDIA_CARD == CardType )
     903   {
     904     errorstatus = SD_UNSUPPORTED_FEATURE;
     905     return ( errorstatus );
     906   }
     907   else if ( ( SDIO_STD_CAPACITY_SD_CARD_V1_1 == CardType ) ||
     908     ( SDIO_STD_CAPACITY_SD_CARD_V2_0 == CardType ) ||
     909     ( SDIO_HIGH_CAPACITY_SD_CARD == CardType ) )
     910   {
     911     if ( SDIO_BusWide_8b == WideMode )
     912     {
     913       errorstatus = SD_UNSUPPORTED_FEATURE;
     914       return ( errorstatus );
     915     }
     916     else if ( SDIO_BusWide_4b == WideMode )
     917     {
     918       errorstatus = SDEnWideBus ( ENABLE );
     919 
     920       if ( SD_OK == errorstatus )
     921       {
     922         /*!< Configure the SDIO peripheral */
     923         SDIO_InitStructure.SDIO_ClockDiv       = SDIO_TRANSFER_CLK_DIV;
     924         SDIO_InitStructure.SDIO_ClockEdge      = SDIO_ClockEdge_Rising;
     925         SDIO_InitStructure.SDIO_ClockBypass    = SDIO_ClockBypass_Disable;
     926         SDIO_InitStructure.SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable;
     927         SDIO_InitStructure.SDIO_BusWide        = SDIO_BusWide_4b;
     928         SDIO_InitStructure.SDIO_HardwareFlowControl =
     929           SDIO_HardwareFlowControl_Disable;
     930         SDIO_Init ( & SDIO_InitStructure );
     931       }
     932     }
     933     else
     934     {
     935       errorstatus = SDEnWideBus ( DISABLE );
     936 
     937       if ( SD_OK == errorstatus )
     938       {
     939         /*!< Configure the SDIO peripheral */
     940         SDIO_InitStructure.SDIO_ClockDiv       = SDIO_TRANSFER_CLK_DIV;
     941         SDIO_InitStructure.SDIO_ClockEdge      = SDIO_ClockEdge_Rising;
     942         SDIO_InitStructure.SDIO_ClockBypass    = SDIO_ClockBypass_Disable;
     943         SDIO_InitStructure.SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable;
     944         SDIO_InitStructure.SDIO_BusWide        = SDIO_BusWide_1b;
     945         SDIO_InitStructure.SDIO_HardwareFlowControl =
     946           SDIO_HardwareFlowControl_Disable;
     947         SDIO_Init ( & SDIO_InitStructure );
     948       }
     949     }
     950   }
     951 
     952   return ( errorstatus );
     953 }
     954 
     955 /**
     956  * @brief  Sets device mode whether to operate in Polling, Interrupt or DMA mode.
     957  * @param  Mode: Specifies the Data Transfer mode.
     958  *   This parameter can be one of the following values:
     959  *     @arg SD_DMA_MODE: Data transfer using DMA.
     960  *     @arg SD_INTERRUPT_MODE: Data transfer using interrupts.
     961  *     @arg SD_POLLING_MODE: Data transfer using flags.
     962  * @retval SD_Error: SD Card Error code.
     963  */
     964 SD_Error SD_SetDeviceMode ( uint32_t Mode )
     965 {
     966   SD_Error errorstatus = SD_OK;
     967 
     968   if ( ( Mode == SD_DMA_MODE ) || ( Mode == SD_INTERRUPT_MODE ) ||
     969     ( Mode == SD_POLLING_MODE ) )
     970   {
     971     DeviceMode = Mode;
     972   }
     973   else
     974   {
     975     errorstatus = SD_INVALID_PARAMETER;
     976   }
     977   return ( errorstatus );
     978 
     979 }
     980 
     981 /**
     982  * @brief  Selects od Deselects the corresponding card.
     983  * @param  addr: Address of the Card to be selected.
     984  * @retval SD_Error: SD Card Error code.
     985  */
     986 SD_Error SD_SelectDeselect ( uint32_t addr )
     987 {
     988   SD_Error errorstatus = SD_OK;
     989 
     990   /*!< Send CMD7 SDIO_SEL_DESEL_CARD */
     991   SDIO_CmdInitStructure.SDIO_Argument = addr;
     992   SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SEL_DESEL_CARD;
     993   SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
     994   SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
     995   SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
     996   SDIO_SendCommand ( & SDIO_CmdInitStructure );
     997 
     998   errorstatus = CmdResp1Error ( SD_CMD_SEL_DESEL_CARD );
     999 
    1000   return ( errorstatus );
    1001 }
    1002 
    1003 /**
    1004  * @brief  Allows to read one block from a specified address in a card.
    1005  * @param  readbuff: pointer to the buffer that will contain the received data
    1006  * @param  ReadAddr: Address from where data are to be read.
    1007  * @param  BlockSize: the SD card Data block size.
    1008  * @retval SD_Error: SD Card Error code.
    1009  */
    1010 SD_Error SD_ReadBlock ( uint8_t * readbuff, uint32_t ReadAddr,
    1011   uint16_t BlockSize )
    1012 {
    1013   SD_Error errorstatus = SD_OK;
    1014   uint32_t count       = 0, *tempbuff = ( uint32_t* )readbuff;
    1015   uint8_t  power       = 0;
    1016 
    1017   if ( NULL == readbuff )
    1018   {
    1019     errorstatus = SD_INVALID_PARAMETER;
    1020     return ( errorstatus );
    1021   }
    1022 
    1023   TransferError = SD_OK;
    1024   TransferEnd        = 0;
    1025   TotalNumberOfBytes = 0;
    1026 
    1027   /*!< Clear all DPSM configuration */
    1028   SDIO_DataInitStructure.SDIO_DataTimeOut   = SD_DATATIMEOUT;
    1029   SDIO_DataInitStructure.SDIO_DataLength    = 0;
    1030   SDIO_DataInitStructure.SDIO_DataBlockSize = SDIO_DataBlockSize_1b;
    1031   SDIO_DataInitStructure.SDIO_TransferDir   = SDIO_TransferDir_ToCard;
    1032   SDIO_DataInitStructure.SDIO_TransferMode  = SDIO_TransferMode_Block;
    1033   SDIO_DataInitStructure.SDIO_DPSM          = SDIO_DPSM_Disable;
    1034   SDIO_DataConfig ( & SDIO_DataInitStructure );
    1035   SDIO_DMACmd ( DISABLE );
    1036 
    1037   if ( SDIO_GetResponse( SDIO_RESP1 ) & SD_CARD_LOCKED )
    1038   {
    1039     errorstatus = SD_LOCK_UNLOCK_FAILED;
    1040     return ( errorstatus );
    1041   }
    1042 
    1043   if ( CardType == SDIO_HIGH_CAPACITY_SD_CARD )
    1044   {
    1045     BlockSize = 512;
    1046     ReadAddr /= 512;
    1047   }
    1048   if ( ( BlockSize > 0 ) && ( BlockSize <= 2048 ) &&
    1049     ( ( BlockSize & ( BlockSize - 1 ) ) == 0 ) )
    1050   {
    1051     power = convert_from_bytes_to_power_of_two ( BlockSize );
    1052 
    1053     /*!< Set Block Size for Card */
    1054     SDIO_CmdInitStructure.SDIO_Argument = ( uint32_t ) BlockSize;
    1055     SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SET_BLOCKLEN;
    1056     SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    1057     SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
    1058     SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
    1059     SDIO_SendCommand ( & SDIO_CmdInitStructure );
    1060 
    1061     errorstatus = CmdResp1Error ( SD_CMD_SET_BLOCKLEN );
    1062 
    1063     if ( SD_OK != errorstatus )
    1064     {
    1065       return ( errorstatus );
    1066     }
    1067   }
    1068   else
    1069   {
    1070     errorstatus = SD_INVALID_PARAMETER;
    1071     return ( errorstatus );
    1072   }
    1073 
    1074   SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT;
    1075   SDIO_DataInitStructure.SDIO_DataLength    = BlockSize;
    1076   SDIO_DataInitStructure.SDIO_DataBlockSize = ( uint32_t ) power << 4;
    1077   SDIO_DataInitStructure.SDIO_TransferDir   = SDIO_TransferDir_ToSDIO;
    1078   SDIO_DataInitStructure.SDIO_TransferMode  = SDIO_TransferMode_Block;
    1079   SDIO_DataInitStructure.SDIO_DPSM          = SDIO_DPSM_Enable;
    1080   SDIO_DataConfig ( & SDIO_DataInitStructure );
    1081 
    1082   TotalNumberOfBytes = BlockSize;
    1083   StopCondition      = 0;
    1084   DestBuffer         = ( uint32_t* )readbuff;
    1085 
    1086   /*!< Send CMD17 READ_SINGLE_BLOCK */
    1087   SDIO_CmdInitStructure.SDIO_Argument = ( uint32_t )ReadAddr;
    1088   SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_READ_SINGLE_BLOCK;
    1089   SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    1090   SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
    1091   SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
    1092   SDIO_SendCommand ( & SDIO_CmdInitStructure );
    1093 
    1094   errorstatus = CmdResp1Error ( SD_CMD_READ_SINGLE_BLOCK );
    1095 
    1096   if ( errorstatus != SD_OK )
    1097   {
    1098     return ( errorstatus );
    1099   }
    1100   /*!< In case of single block transfer, no need of stop transfer at all.*/
    1101   if ( DeviceMode == SD_POLLING_MODE )
    1102   {
    1103     /*!< Polling mode */
    1104     while ( !( SDIO->STA & ( SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL |
    1105           SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR ) ) )
    1106     {
    1107       if ( SDIO_GetFlagStatus( SDIO_FLAG_RXFIFOHF ) != RESET )
    1108       {
    1109         for ( count = 0; count < 8; count++ )
    1110         {
    1111           *( tempbuff + count ) = SDIO_ReadData ( );
    1112         }
    1113         tempbuff += 8;
    1114       }
    1115     }
    1116 
    1117     if ( SDIO_GetFlagStatus( SDIO_FLAG_DTIMEOUT ) != RESET )
    1118     {
    1119       SDIO_ClearFlag ( SDIO_FLAG_DTIMEOUT );
    1120       errorstatus = SD_DATA_TIMEOUT;
    1121       return ( errorstatus );
    1122     }
    1123     else if ( SDIO_GetFlagStatus( SDIO_FLAG_DCRCFAIL ) != RESET )
    1124     {
    1125       SDIO_ClearFlag ( SDIO_FLAG_DCRCFAIL );
    1126       errorstatus = SD_DATA_CRC_FAIL;
    1127       return ( errorstatus );
    1128     }
    1129     else if ( SDIO_GetFlagStatus( SDIO_FLAG_RXOVERR ) != RESET )
    1130     {
    1131       SDIO_ClearFlag ( SDIO_FLAG_RXOVERR );
    1132       errorstatus = SD_RX_OVERRUN;
    1133       return ( errorstatus );
    1134     }
    1135     else if ( SDIO_GetFlagStatus( SDIO_FLAG_STBITERR ) != RESET )
    1136     {
    1137       SDIO_ClearFlag ( SDIO_FLAG_STBITERR );
    1138       errorstatus = SD_START_BIT_ERR;
    1139       return ( errorstatus );
    1140     }
    1141     while ( SDIO_GetFlagStatus( SDIO_FLAG_RXDAVL ) != RESET )
    1142     {
    1143       *tempbuff = SDIO_ReadData ( );
    1144       tempbuff++;
    1145     }
    1146 
    1147     /*!< Clear all the static flags */
    1148     SDIO_ClearFlag ( SDIO_STATIC_FLAGS );
    1149   }
    1150   else if ( DeviceMode == SD_INTERRUPT_MODE )
    1151   {
    1152     SDIO_ITConfig ( SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |
    1153       SDIO_IT_RXOVERR | SDIO_IT_RXFIFOHF | SDIO_IT_STBITERR, ENABLE );
    1154     while ( ( TransferEnd == 0 ) && ( TransferError == SD_OK ) )
    1155     {
    1156     }
    1157     if ( TransferError != SD_OK )
    1158     {
    1159       return ( TransferError );
    1160     }
    1161   }
    1162   else if ( DeviceMode == SD_DMA_MODE )
    1163   {
    1164     SDIO_ITConfig ( SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |
    1165       SDIO_IT_RXOVERR | SDIO_IT_STBITERR, ENABLE );
    1166     SDIO_DMACmd ( ENABLE );
    1167     SD_LowLevel_DMA_RxConfig ( ( uint32_t * )readbuff, BlockSize );
    1168     while ( ( SD_DMAEndOfTransferStatus( ) == RESET ) && ( TransferEnd == 0 ) &&
    1169       ( TransferError == SD_OK ) )
    1170     {
    1171     }
    1172     if ( TransferError != SD_OK )
    1173     {
    1174       return ( TransferError );
    1175     }
    1176   }
    1177   return ( errorstatus );
    1178 }
    1179 
    1180 /**
    1181  * @brief  Allows to read blocks from a specified address  in a card.
    1182  * @param  readbuff: pointer to the buffer that will contain the received data.
    1183  * @param  ReadAddr: Address from where data are to be read.
    1184  * @param  BlockSize: the SD card Data block size.
    1185  * @param  NumberOfBlocks: number of blocks to be read.
    1186  * @retval SD_Error: SD Card Error code.
    1187  */
    1188 SD_Error SD_ReadMultiBlocks ( uint8_t * readbuff, uint32_t ReadAddr,
    1189   uint16_t BlockSize, uint32_t NumberOfBlocks )
    1190 {
    1191   SD_Error errorstatus = SD_OK;
    1192   uint32_t count       = 0, *tempbuff = ( uint32_t* )readbuff;
    1193   uint8_t  power       = 0;
    1194 
    1195   if ( NULL == readbuff )
    1196   {
    1197     errorstatus = SD_INVALID_PARAMETER;
    1198     return ( errorstatus );
    1199   }
    1200 
    1201   TransferError = SD_OK;
    1202   TransferEnd        = 0;
    1203   TotalNumberOfBytes = 0;
    1204 
    1205   /*!< Clear all DPSM configuration */
    1206   SDIO_DataInitStructure.SDIO_DataTimeOut   = SD_DATATIMEOUT;
    1207   SDIO_DataInitStructure.SDIO_DataLength    = 0;
    1208   SDIO_DataInitStructure.SDIO_DataBlockSize = SDIO_DataBlockSize_1b;
    1209   SDIO_DataInitStructure.SDIO_TransferDir   = SDIO_TransferDir_ToCard;
    1210   SDIO_DataInitStructure.SDIO_TransferMode  = SDIO_TransferMode_Block;
    1211   SDIO_DataInitStructure.SDIO_DPSM          = SDIO_DPSM_Disable;
    1212   SDIO_DataConfig ( & SDIO_DataInitStructure );
    1213   SDIO_DMACmd ( DISABLE );
    1214 
    1215   if ( SDIO_GetResponse( SDIO_RESP1 ) & SD_CARD_LOCKED )
    1216   {
    1217     errorstatus = SD_LOCK_UNLOCK_FAILED;
    1218     return ( errorstatus );
    1219   }
    1220 
    1221   if ( CardType == SDIO_HIGH_CAPACITY_SD_CARD )
    1222   {
    1223     BlockSize = 512;
    1224     ReadAddr /= 512;
    1225   }
    1226 
    1227   if ( ( BlockSize > 0 ) && ( BlockSize <= 2048 ) &&
    1228     ( 0 == ( BlockSize & ( BlockSize - 1 ) ) ) )
    1229   {
    1230     power = convert_from_bytes_to_power_of_two ( BlockSize );
    1231 
    1232     /*!< Set Block Size for Card */
    1233     SDIO_CmdInitStructure.SDIO_Argument = ( uint32_t ) BlockSize;
    1234     SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SET_BLOCKLEN;
    1235     SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    1236     SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
    1237     SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
    1238     SDIO_SendCommand ( & SDIO_CmdInitStructure );
    1239 
    1240     errorstatus = CmdResp1Error ( SD_CMD_SET_BLOCKLEN );
    1241 
    1242     if ( SD_OK != errorstatus )
    1243     {
    1244       return ( errorstatus );
    1245     }
    1246   }
    1247   else
    1248   {
    1249     errorstatus = SD_INVALID_PARAMETER;
    1250     return ( errorstatus );
    1251   }
    1252 
    1253   if ( NumberOfBlocks > 1 )
    1254   {
    1255     /*!< Common to all modes */
    1256     if ( NumberOfBlocks * BlockSize > SD_MAX_DATA_LENGTH )
    1257     {
    1258       errorstatus = SD_INVALID_PARAMETER;
    1259       return ( errorstatus );
    1260     }
    1261 
    1262     TotalNumberOfBytes = NumberOfBlocks * BlockSize;
    1263     StopCondition = 1;
    1264     DestBuffer    = ( uint32_t* )readbuff;
    1265 
    1266     SDIO_DataInitStructure.SDIO_DataTimeOut   = SD_DATATIMEOUT;
    1267     SDIO_DataInitStructure.SDIO_DataLength    = NumberOfBlocks * BlockSize;
    1268     SDIO_DataInitStructure.SDIO_DataBlockSize = ( uint32_t ) power << 4;
    1269     SDIO_DataInitStructure.SDIO_TransferDir   = SDIO_TransferDir_ToSDIO;
    1270     SDIO_DataInitStructure.SDIO_TransferMode  = SDIO_TransferMode_Block;
    1271     SDIO_DataInitStructure.SDIO_DPSM          = SDIO_DPSM_Enable;
    1272     SDIO_DataConfig ( & SDIO_DataInitStructure );
    1273 
    1274     /*!< Send CMD18 READ_MULT_BLOCK with argument data address */
    1275     SDIO_CmdInitStructure.SDIO_Argument = ( uint32_t )ReadAddr;
    1276     SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_READ_MULT_BLOCK;
    1277     SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    1278     SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
    1279     SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
    1280     SDIO_SendCommand ( & SDIO_CmdInitStructure );
    1281 
    1282     errorstatus = CmdResp1Error ( SD_CMD_READ_MULT_BLOCK );
    1283 
    1284     if ( errorstatus != SD_OK )
    1285     {
    1286       return ( errorstatus );
    1287     }
    1288 
    1289     if ( DeviceMode == SD_POLLING_MODE )
    1290     {
    1291       /*!< Polling mode */
    1292       while ( !( SDIO->STA &
    1293           ( SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DATAEND |
    1294             SDIO_FLAG_DTIMEOUT | SDIO_FLAG_STBITERR ) ) )
    1295       {
    1296         if ( SDIO_GetFlagStatus( SDIO_FLAG_RXFIFOHF ) != RESET )
    1297         {
    1298           for ( count = 0; count < SD_HALFFIFO; count++ )
    1299           {
    1300             *( tempbuff + count ) = SDIO_ReadData ( );
    1301           }
    1302           tempbuff += SD_HALFFIFO;
    1303         }
    1304       }
    1305 
    1306       if ( SDIO_GetFlagStatus( SDIO_FLAG_DTIMEOUT ) != RESET )
    1307       {
    1308         SDIO_ClearFlag ( SDIO_FLAG_DTIMEOUT );
    1309         errorstatus = SD_DATA_TIMEOUT;
    1310         return ( errorstatus );
    1311       }
    1312       else if ( SDIO_GetFlagStatus( SDIO_FLAG_DCRCFAIL ) != RESET )
    1313       {
    1314         SDIO_ClearFlag ( SDIO_FLAG_DCRCFAIL );
    1315         errorstatus = SD_DATA_CRC_FAIL;
    1316         return ( errorstatus );
    1317       }
    1318       else if ( SDIO_GetFlagStatus( SDIO_FLAG_RXOVERR ) != RESET )
    1319       {
    1320         SDIO_ClearFlag ( SDIO_FLAG_RXOVERR );
    1321         errorstatus = SD_RX_OVERRUN;
    1322         return ( errorstatus );
    1323       }
    1324       else if ( SDIO_GetFlagStatus( SDIO_FLAG_STBITERR ) != RESET )
    1325       {
    1326         SDIO_ClearFlag ( SDIO_FLAG_STBITERR );
    1327         errorstatus = SD_START_BIT_ERR;
    1328         return ( errorstatus );
    1329       }
    1330       while ( SDIO_GetFlagStatus( SDIO_FLAG_RXDAVL ) != RESET )
    1331       {
    1332         *tempbuff = SDIO_ReadData ( );
    1333         tempbuff++;
    1334       }
    1335 
    1336       if ( SDIO_GetFlagStatus( SDIO_FLAG_DATAEND ) != RESET )
    1337       {
    1338         /*!< In Case Of SD-CARD Send Command STOP_TRANSMISSION */
    1339         if ( ( SDIO_STD_CAPACITY_SD_CARD_V1_1 == CardType ) ||
    1340           ( SDIO_HIGH_CAPACITY_SD_CARD == CardType ) ||
    1341           ( SDIO_STD_CAPACITY_SD_CARD_V2_0 == CardType ) )
    1342         {
    1343           /*!< Send CMD12 STOP_TRANSMISSION */
    1344           SDIO_CmdInitStructure.SDIO_Argument = 0x0;
    1345           SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_STOP_TRANSMISSION;
    1346           SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    1347           SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
    1348           SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
    1349           SDIO_SendCommand ( & SDIO_CmdInitStructure );
    1350 
    1351           errorstatus = CmdResp1Error ( SD_CMD_STOP_TRANSMISSION );
    1352 
    1353           if ( errorstatus != SD_OK )
    1354           {
    1355             return ( errorstatus );
    1356           }
    1357         }
    1358       }
    1359       /*!< Clear all the static flags */
    1360       SDIO_ClearFlag ( SDIO_STATIC_FLAGS );
    1361     }
    1362     else if ( DeviceMode == SD_INTERRUPT_MODE )
    1363     {
    1364       SDIO_ITConfig ( SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |
    1365         SDIO_IT_RXOVERR | SDIO_IT_RXFIFOHF | SDIO_IT_STBITERR, ENABLE );
    1366       while ( ( TransferEnd == 0 ) && ( TransferError == SD_OK ) )
    1367       {
    1368       }
    1369       if ( TransferError != SD_OK )
    1370       {
    1371         return ( TransferError );
    1372       }
    1373     }
    1374     else if ( DeviceMode == SD_DMA_MODE )
    1375     {
    1376       SDIO_ITConfig ( SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |
    1377         SDIO_IT_RXOVERR | SDIO_IT_STBITERR, ENABLE );
    1378       SDIO_DMACmd ( ENABLE );
    1379       SD_LowLevel_DMA_RxConfig ( ( uint32_t * )readbuff,
    1380         ( NumberOfBlocks * BlockSize ) );
    1381       while ( ( SD_DMAEndOfTransferStatus( ) == RESET ) && ( TransferEnd == 0 )
    1382         && ( TransferError == SD_OK ) )
    1383       {
    1384       }
    1385       if ( TransferError != SD_OK )
    1386       {
    1387         return ( TransferError );
    1388       }
    1389     }
    1390   }
    1391   return ( errorstatus );
    1392 }
    1393 
    1394 /**
    1395  * @brief  Allows to write one block starting from a specified address in a card.
    1396  * @param  writebuff: pointer to the buffer that contain the data to be transferred.
    1397  * @param  WriteAddr: Address from where data are to be read.
    1398  * @param  BlockSize: the SD card Data block size.
    1399  * @retval SD_Error: SD Card Error code.
    1400  */
    1401 SD_Error SD_WriteBlock ( uint8_t * writebuff, uint32_t WriteAddr,
    1402   uint16_t BlockSize )
    1403 {
    1404   SD_Error   errorstatus = SD_OK;
    1405   uint8_t    power       = 0, cardstate = 0;
    1406   uint32_t   timeout     = 0, bytestransferred = 0;
    1407   uint32_t   cardstatus  = 0, count = 0, restwords = 0;
    1408   uint32_t * tempbuff    = ( uint32_t* )writebuff;
    1409 
    1410   if ( writebuff == NULL )
    1411   {
    1412     errorstatus = SD_INVALID_PARAMETER;
    1413     return ( errorstatus );
    1414   }
    1415 
    1416   TransferError = SD_OK;
    1417   TransferEnd        = 0;
    1418   TotalNumberOfBytes = 0;
    1419 
    1420   SDIO_DataInitStructure.SDIO_DataTimeOut   = SD_DATATIMEOUT;
    1421   SDIO_DataInitStructure.SDIO_DataLength    = 0;
    1422   SDIO_DataInitStructure.SDIO_DataBlockSize = SDIO_DataBlockSize_1b;
    1423   SDIO_DataInitStructure.SDIO_TransferDir   = SDIO_TransferDir_ToCard;
    1424   SDIO_DataInitStructure.SDIO_TransferMode  = SDIO_TransferMode_Block;
    1425   SDIO_DataInitStructure.SDIO_DPSM          = SDIO_DPSM_Disable;
    1426   SDIO_DataConfig ( & SDIO_DataInitStructure );
    1427   SDIO_DMACmd ( DISABLE );
    1428 
    1429   if ( SDIO_GetResponse( SDIO_RESP1 ) & SD_CARD_LOCKED )
    1430   {
    1431     errorstatus = SD_LOCK_UNLOCK_FAILED;
    1432     return ( errorstatus );
    1433   }
    1434 
    1435   if ( CardType == SDIO_HIGH_CAPACITY_SD_CARD )
    1436   {
    1437     BlockSize = 512;
    1438     WriteAddr /= 512;
    1439   }
    1440 
    1441   /*!< Set the block size, both on controller and card */
    1442   if ( ( BlockSize > 0 ) && ( BlockSize <= 2048 ) &&
    1443     ( ( BlockSize & ( BlockSize - 1 ) ) == 0 ) )
    1444   {
    1445     power = convert_from_bytes_to_power_of_two ( BlockSize );
    1446 
    1447     SDIO_CmdInitStructure.SDIO_Argument = ( uint32_t ) BlockSize;
    1448     SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SET_BLOCKLEN;
    1449     SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    1450     SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
    1451     SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
    1452     SDIO_SendCommand ( & SDIO_CmdInitStructure );
    1453 
    1454     errorstatus = CmdResp1Error ( SD_CMD_SET_BLOCKLEN );
    1455 
    1456     if ( errorstatus != SD_OK )
    1457     {
    1458       return ( errorstatus );
    1459     }
    1460   }
    1461   else
    1462   {
    1463     errorstatus = SD_INVALID_PARAMETER;
    1464     return ( errorstatus );
    1465   }
    1466 
    1467   /*!< Wait till card is ready for data Added */
    1468   SDIO_CmdInitStructure.SDIO_Argument = ( uint32_t )( RCA << 16 );
    1469   SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SEND_STATUS;
    1470   SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    1471   SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
    1472   SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
    1473   SDIO_SendCommand ( & SDIO_CmdInitStructure );
    1474 
    1475   errorstatus = CmdResp1Error ( SD_CMD_SEND_STATUS );
    1476 
    1477   if ( errorstatus != SD_OK )
    1478   {
    1479     return ( errorstatus );
    1480   }
    1481 
    1482   cardstatus = SDIO_GetResponse ( SDIO_RESP1 );
    1483 
    1484   timeout = SD_DATATIMEOUT;
    1485 
    1486   while ( ( ( cardstatus & 0x00000100 ) == 0 ) && ( timeout > 0 ) )
    1487   {
    1488     timeout--;
    1489     SDIO_CmdInitStructure.SDIO_Argument = ( uint32_t )( RCA << 16 );
    1490     SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SEND_STATUS;
    1491     SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    1492     SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
    1493     SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
    1494     SDIO_SendCommand ( & SDIO_CmdInitStructure );
    1495 
    1496     errorstatus = CmdResp1Error ( SD_CMD_SEND_STATUS );
    1497 
    1498     if ( errorstatus != SD_OK )
    1499     {
    1500       return ( errorstatus );
    1501     }
    1502     cardstatus = SDIO_GetResponse ( SDIO_RESP1 );
    1503   }
    1504 
    1505   if ( timeout == 0 )
    1506   {
    1507     return ( SD_ERROR );
    1508   }
    1509 
    1510   /*!< Send CMD24 WRITE_SINGLE_BLOCK */
    1511   SDIO_CmdInitStructure.SDIO_Argument = WriteAddr;
    1512   SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_WRITE_SINGLE_BLOCK;
    1513   SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    1514   SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
    1515   SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
    1516   SDIO_SendCommand ( & SDIO_CmdInitStructure );
    1517 
    1518   errorstatus = CmdResp1Error ( SD_CMD_WRITE_SINGLE_BLOCK );
    1519 
    1520   if ( errorstatus != SD_OK )
    1521   {
    1522     return ( errorstatus );
    1523   }
    1524 
    1525   TotalNumberOfBytes = BlockSize;
    1526   StopCondition = 0;
    1527   SrcBuffer     = ( uint32_t* )writebuff;
    1528 
    1529   SDIO_DataInitStructure.SDIO_DataTimeOut   = SD_DATATIMEOUT;
    1530   SDIO_DataInitStructure.SDIO_DataLength    = BlockSize;
    1531   SDIO_DataInitStructure.SDIO_DataBlockSize = ( uint32_t ) power << 4;
    1532   SDIO_DataInitStructure.SDIO_TransferDir   = SDIO_TransferDir_ToCard;
    1533   SDIO_DataInitStructure.SDIO_TransferMode  = SDIO_TransferMode_Block;
    1534   SDIO_DataInitStructure.SDIO_DPSM          = SDIO_DPSM_Enable;
    1535   SDIO_DataConfig ( & SDIO_DataInitStructure );
    1536 
    1537   /*!< In case of single data block transfer no need of stop command at all */
    1538   if ( DeviceMode == SD_POLLING_MODE )
    1539   {
    1540     while ( !( SDIO->STA & ( SDIO_FLAG_DBCKEND | SDIO_FLAG_TXUNDERR |
    1541           SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_STBITERR ) ) )
    1542     {
    1543       if ( SDIO_GetFlagStatus( SDIO_FLAG_TXFIFOHE ) != RESET )
    1544       {
    1545         if ( ( TotalNumberOfBytes - bytestransferred ) < 32 )
    1546         {
    1547           restwords = ( ( TotalNumberOfBytes - bytestransferred ) % 4 == 0 ) ?
    1548             ( ( TotalNumberOfBytes - bytestransferred ) / 4 ) :
    1549             ( ( TotalNumberOfBytes - bytestransferred ) / 4 + 1 );
    1550 
    1551           for ( count = 0; count < restwords;
    1552             count++, tempbuff++, bytestransferred += 4 )
    1553           {
    1554             SDIO_WriteData ( * tempbuff );
    1555           }
    1556         }
    1557         else
    1558         {
    1559           for ( count = 0; count < 8; count++ )
    1560           {
    1561             SDIO_WriteData ( * ( tempbuff + count ) );
    1562           }
    1563           tempbuff += 8;
    1564           bytestransferred += 32;
    1565         }
    1566       }
    1567     }
    1568     if ( SDIO_GetFlagStatus( SDIO_FLAG_DTIMEOUT ) != RESET )
    1569     {
    1570       SDIO_ClearFlag ( SDIO_FLAG_DTIMEOUT );
    1571       errorstatus = SD_DATA_TIMEOUT;
    1572       return ( errorstatus );
    1573     }
    1574     else if ( SDIO_GetFlagStatus( SDIO_FLAG_DCRCFAIL ) != RESET )
    1575     {
    1576       SDIO_ClearFlag ( SDIO_FLAG_DCRCFAIL );
    1577       errorstatus = SD_DATA_CRC_FAIL;
    1578       return ( errorstatus );
    1579     }
    1580     else if ( SDIO_GetFlagStatus( SDIO_FLAG_TXUNDERR ) != RESET )
    1581     {
    1582       SDIO_ClearFlag ( SDIO_FLAG_TXUNDERR );
    1583       errorstatus = SD_TX_UNDERRUN;
    1584       return ( errorstatus );
    1585     }
    1586     else if ( SDIO_GetFlagStatus( SDIO_FLAG_STBITERR ) != RESET )
    1587     {
    1588       SDIO_ClearFlag ( SDIO_FLAG_STBITERR );
    1589       errorstatus = SD_START_BIT_ERR;
    1590       return ( errorstatus );
    1591     }
    1592   }
    1593   else if ( DeviceMode == SD_INTERRUPT_MODE )
    1594   {
    1595     SDIO_ITConfig ( SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |
    1596       SDIO_FLAG_TXFIFOHE | SDIO_IT_TXUNDERR | SDIO_IT_STBITERR, ENABLE );
    1597     while ( ( TransferEnd == 0 ) && ( TransferError == SD_OK ) )
    1598     {
    1599     }
    1600     if ( TransferError != SD_OK )
    1601     {
    1602       return ( TransferError );
    1603     }
    1604   }
    1605   else if ( DeviceMode == SD_DMA_MODE )
    1606   {
    1607     SDIO_ITConfig ( SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |
    1608       SDIO_IT_TXUNDERR | SDIO_IT_STBITERR, ENABLE );
    1609     SD_LowLevel_DMA_TxConfig ( ( uint32_t * )writebuff, BlockSize );
    1610     SDIO_DMACmd ( ENABLE );
    1611     while ( ( SD_DMAEndOfTransferStatus( ) == RESET ) && ( TransferEnd == 0 ) &&
    1612       ( TransferError == SD_OK ) )
    1613     {
    1614     }
    1615     if ( TransferError != SD_OK )
    1616     {
    1617       return ( TransferError );
    1618     }
    1619   }
    1620 
    1621   /*!< Clear all the static flags */
    1622   SDIO_ClearFlag ( SDIO_STATIC_FLAGS );
    1623 
    1624   /*!< Wait till the card is in programming state */
    1625   errorstatus = IsCardProgramming ( &cardstate );
    1626 
    1627   while ( ( errorstatus == SD_OK ) && ( ( cardstate == SD_CARD_PROGRAMMING ) ||
    1628       ( cardstate == SD_CARD_RECEIVING ) ) )
    1629   {
    1630     errorstatus = IsCardProgramming ( &cardstate );
    1631   }
    1632 
    1633   return ( errorstatus );
    1634 }
    1635 
    1636 /**
    1637  * @brief  Allows to write blocks starting from a specified address in a card.
    1638  * @param  WriteAddr: Address from where data are to be read.
    1639  * @param  writebuff: pointer to the buffer that contain the data to be transferred.
    1640  * @param  BlockSize: the SD card Data block size.
    1641  * @param  NumberOfBlocks: number of blocks to be written.
    1642  * @retval SD_Error: SD Card Error code.
    1643  */
    1644 SD_Error SD_WriteMultiBlocks ( uint8_t * writebuff, uint32_t WriteAddr,
    1645   uint16_t BlockSize, uint32_t NumberOfBlocks )
    1646 {
    1647   SD_Error      errorstatus      = SD_OK;
    1648   uint8_t       power            = 0, cardstate = 0;
    1649   uint32_t      bytestransferred = 0;
    1650   uint32_t      restwords        = 0;
    1651   uint32_t *    tempbuff         = ( uint32_t* )writebuff;
    1652   __IO uint32_t count            = 0;
    1653 
    1654   if ( writebuff == NULL )
    1655   {
    1656     errorstatus = SD_INVALID_PARAMETER;
    1657     return ( errorstatus );
    1658   }
    1659 
    1660   TransferError = SD_OK;
    1661   TransferEnd        = 0;
    1662   TotalNumberOfBytes = 0;
    1663 
    1664   SDIO_DataInitStructure.SDIO_DataTimeOut   = SD_DATATIMEOUT;
    1665   SDIO_DataInitStructure.SDIO_DataLength    = 0;
    1666   SDIO_DataInitStructure.SDIO_DataBlockSize = SDIO_DataBlockSize_1b;
    1667   SDIO_DataInitStructure.SDIO_TransferDir   = SDIO_TransferDir_ToCard;
    1668   SDIO_DataInitStructure.SDIO_TransferMode  = SDIO_TransferMode_Block;
    1669   SDIO_DataInitStructure.SDIO_DPSM          = SDIO_DPSM_Disable;
    1670   SDIO_DataConfig ( & SDIO_DataInitStructure );
    1671   SDIO_DMACmd ( DISABLE );
    1672 
    1673   if ( SDIO_GetResponse( SDIO_RESP1 ) & SD_CARD_LOCKED )
    1674   {
    1675     errorstatus = SD_LOCK_UNLOCK_FAILED;
    1676     return ( errorstatus );
    1677   }
    1678 
    1679   if ( CardType == SDIO_HIGH_CAPACITY_SD_CARD )
    1680   {
    1681     BlockSize = 512;
    1682     WriteAddr /= 512;
    1683   }
    1684 
    1685   /*!< Set the block size, both on controller and card */
    1686   if ( ( BlockSize > 0 ) && ( BlockSize <= 2048 ) &&
    1687     ( ( BlockSize & ( BlockSize - 1 ) ) == 0 ) )
    1688   {
    1689     power = convert_from_bytes_to_power_of_two ( BlockSize );
    1690 
    1691     SDIO_CmdInitStructure.SDIO_Argument = ( uint32_t ) BlockSize;
    1692     SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SET_BLOCKLEN;
    1693     SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    1694     SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
    1695     SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
    1696     SDIO_SendCommand ( & SDIO_CmdInitStructure );
    1697 
    1698     errorstatus = CmdResp1Error ( SD_CMD_SET_BLOCKLEN );
    1699 
    1700     if ( errorstatus != SD_OK )
    1701     {
    1702       return ( errorstatus );
    1703     }
    1704   }
    1705   else
    1706   {
    1707     errorstatus = SD_INVALID_PARAMETER;
    1708     return ( errorstatus );
    1709   }
    1710 
    1711   /*!< Wait till card is ready for data Added */
    1712   SDIO_CmdInitStructure.SDIO_Argument = ( uint32_t )( RCA << 16 );
    1713   SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SEND_STATUS;
    1714   SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    1715   SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
    1716   SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
    1717   SDIO_SendCommand ( & SDIO_CmdInitStructure );
    1718 
    1719   errorstatus = CmdResp1Error ( SD_CMD_SEND_STATUS );
    1720 
    1721   if ( errorstatus != SD_OK )
    1722   {
    1723     return ( errorstatus );
    1724   }
    1725 
    1726   if ( NumberOfBlocks > 1 )
    1727   {
    1728     /*!< Common to all modes */
    1729     if ( NumberOfBlocks * BlockSize > SD_MAX_DATA_LENGTH )
    1730     {
    1731       errorstatus = SD_INVALID_PARAMETER;
    1732       return ( errorstatus );
    1733     }
    1734 
    1735     if ( ( SDIO_STD_CAPACITY_SD_CARD_V1_1 == CardType ) ||
    1736       ( SDIO_STD_CAPACITY_SD_CARD_V2_0 == CardType ) ||
    1737       ( SDIO_HIGH_CAPACITY_SD_CARD == CardType ) )
    1738     {
    1739       /*!< To improve performance */
    1740       SDIO_CmdInitStructure.SDIO_Argument = ( uint32_t )( RCA << 16 );
    1741       SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_APP_CMD;
    1742       SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    1743       SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
    1744       SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
    1745       SDIO_SendCommand ( & SDIO_CmdInitStructure );
    1746 
    1747       errorstatus = CmdResp1Error ( SD_CMD_APP_CMD );
    1748 
    1749       if ( errorstatus != SD_OK )
    1750       {
    1751         return ( errorstatus );
    1752       }
    1753       /*!< To improve performance */
    1754       SDIO_CmdInitStructure.SDIO_Argument = ( uint32_t )NumberOfBlocks;
    1755       SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SET_BLOCK_COUNT;
    1756       SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    1757       SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
    1758       SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
    1759       SDIO_SendCommand ( & SDIO_CmdInitStructure );
    1760 
    1761       errorstatus = CmdResp1Error ( SD_CMD_SET_BLOCK_COUNT );
    1762 
    1763       if ( errorstatus != SD_OK )
    1764       {
    1765         return ( errorstatus );
    1766       }
    1767     }
    1768 
    1769     /*!< Send CMD25 WRITE_MULT_BLOCK with argument data address */
    1770     SDIO_CmdInitStructure.SDIO_Argument = ( uint32_t )WriteAddr;
    1771     SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_WRITE_MULT_BLOCK;
    1772     SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    1773     SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
    1774     SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
    1775     SDIO_SendCommand ( & SDIO_CmdInitStructure );
    1776 
    1777     errorstatus = CmdResp1Error ( SD_CMD_WRITE_MULT_BLOCK );
    1778 
    1779     if ( SD_OK != errorstatus )
    1780     {
    1781       return ( errorstatus );
    1782     }
    1783 
    1784     TotalNumberOfBytes = NumberOfBlocks * BlockSize;
    1785     StopCondition = 1;
    1786     SrcBuffer     = ( uint32_t* )writebuff;
    1787 
    1788     SDIO_DataInitStructure.SDIO_DataTimeOut   = SD_DATATIMEOUT;
    1789     SDIO_DataInitStructure.SDIO_DataLength    = NumberOfBlocks * BlockSize;
    1790     SDIO_DataInitStructure.SDIO_DataBlockSize = ( uint32_t ) power << 4;
    1791     SDIO_DataInitStructure.SDIO_TransferDir   = SDIO_TransferDir_ToCard;
    1792     SDIO_DataInitStructure.SDIO_TransferMode  = SDIO_TransferMode_Block;
    1793     SDIO_DataInitStructure.SDIO_DPSM          = SDIO_DPSM_Enable;
    1794     SDIO_DataConfig ( & SDIO_DataInitStructure );
    1795 
    1796     if ( DeviceMode == SD_POLLING_MODE )
    1797     {
    1798       while ( !( SDIO->STA &
    1799           ( SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DATAEND |
    1800             SDIO_FLAG_DTIMEOUT | SDIO_FLAG_STBITERR ) ) )
    1801       {
    1802         if ( SDIO_GetFlagStatus( SDIO_FLAG_TXFIFOHE ) != RESET )
    1803         {
    1804           if ( !( ( TotalNumberOfBytes - bytestransferred ) <
    1805               SD_HALFFIFOBYTES ) )
    1806           {
    1807             for ( count = 0; count < SD_HALFFIFO; count++ )
    1808             {
    1809               SDIO_WriteData ( * ( tempbuff + count ) );
    1810             }
    1811             tempbuff += SD_HALFFIFO;
    1812             bytestransferred += SD_HALFFIFOBYTES;
    1813           }
    1814           else
    1815           {
    1816             restwords = ( ( TotalNumberOfBytes - bytestransferred ) % 4 == 0 ) ?
    1817               ( ( TotalNumberOfBytes - bytestransferred ) / 4 ) :
    1818               ( ( TotalNumberOfBytes - bytestransferred ) / 4 + 1 );
    1819 
    1820             for ( count = 0; count < restwords;
    1821               count++, tempbuff++, bytestransferred += 4 )
    1822             {
    1823               SDIO_WriteData ( * tempbuff );
    1824             }
    1825           }
    1826         }
    1827       }
    1828 
    1829       if ( SDIO_GetFlagStatus( SDIO_FLAG_DTIMEOUT ) != RESET )
    1830       {
    1831         SDIO_ClearFlag ( SDIO_FLAG_DTIMEOUT );
    1832         errorstatus = SD_DATA_TIMEOUT;
    1833         return ( errorstatus );
    1834       }
    1835       else if ( SDIO_GetFlagStatus( SDIO_FLAG_DCRCFAIL ) != RESET )
    1836       {
    1837         SDIO_ClearFlag ( SDIO_FLAG_DCRCFAIL );
    1838         errorstatus = SD_DATA_CRC_FAIL;
    1839         return ( errorstatus );
    1840       }
    1841       else if ( SDIO_GetFlagStatus( SDIO_FLAG_TXUNDERR ) != RESET )
    1842       {
    1843         SDIO_ClearFlag ( SDIO_FLAG_TXUNDERR );
    1844         errorstatus = SD_TX_UNDERRUN;
    1845         return ( errorstatus );
    1846       }
    1847       else if ( SDIO_GetFlagStatus( SDIO_FLAG_STBITERR ) != RESET )
    1848       {
    1849         SDIO_ClearFlag ( SDIO_FLAG_STBITERR );
    1850         errorstatus = SD_START_BIT_ERR;
    1851         return ( errorstatus );
    1852       }
    1853 
    1854       if ( SDIO_GetFlagStatus( SDIO_FLAG_DATAEND ) != RESET )
    1855       {
    1856         if ( ( SDIO_STD_CAPACITY_SD_CARD_V1_1 == CardType ) ||
    1857           ( SDIO_STD_CAPACITY_SD_CARD_V2_0 == CardType ) ||
    1858           ( SDIO_HIGH_CAPACITY_SD_CARD == CardType ) )
    1859         {
    1860           /*!< Send CMD12 STOP_TRANSMISSION */
    1861           SDIO_CmdInitStructure.SDIO_Argument = 0x0;
    1862           SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_STOP_TRANSMISSION;
    1863           SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    1864           SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
    1865           SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
    1866           SDIO_SendCommand ( & SDIO_CmdInitStructure );
    1867 
    1868           errorstatus = CmdResp1Error ( SD_CMD_STOP_TRANSMISSION );
    1869 
    1870           if ( errorstatus != SD_OK )
    1871           {
    1872             return ( errorstatus );
    1873           }
    1874         }
    1875       }
    1876     }
    1877     else if ( DeviceMode == SD_INTERRUPT_MODE )
    1878     {
    1879       SDIO_ITConfig ( SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |
    1880         SDIO_IT_TXFIFOHE | SDIO_IT_TXUNDERR | SDIO_IT_STBITERR, ENABLE );
    1881       while ( ( TransferEnd == 0 ) && ( TransferError == SD_OK ) )
    1882       {
    1883       }
    1884       if ( TransferError != SD_OK )
    1885       {
    1886         return ( TransferError );
    1887       }
    1888     }
    1889     else if ( DeviceMode == SD_DMA_MODE )
    1890     {
    1891       SDIO_ITConfig ( SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |
    1892         SDIO_IT_TXUNDERR | SDIO_IT_STBITERR, ENABLE );
    1893       SDIO_DMACmd ( ENABLE );
    1894       SD_LowLevel_DMA_TxConfig ( ( uint32_t * )writebuff,
    1895         ( NumberOfBlocks * BlockSize ) );
    1896       while ( ( SD_DMAEndOfTransferStatus( ) == RESET ) && ( TransferEnd == 0 )
    1897         && ( TransferError == SD_OK ) )
    1898       {
    1899       }
    1900       if ( TransferError != SD_OK )
    1901       {
    1902         return ( TransferError );
    1903       }
    1904     }
    1905   }
    1906   /*!< Clear all the static flags */
    1907   SDIO_ClearFlag ( SDIO_STATIC_FLAGS );
    1908 
    1909   /*!< Add some delay before checking the Card Status */
    1910   for ( count = 0; count < 0xFFFF; count++ )
    1911   {
    1912   }
    1913   /*!< Wait till the card is in programming state */
    1914   errorstatus = IsCardProgramming ( &cardstate );
    1915 
    1916   while ( ( errorstatus == SD_OK ) && ( ( cardstate == SD_CARD_PROGRAMMING ) ||
    1917       ( cardstate == SD_CARD_RECEIVING ) ) )
    1918   {
    1919     errorstatus = IsCardProgramming ( &cardstate );
    1920   }
    1921 
    1922   return ( errorstatus );
    1923 }
    1924 
    1925 /**
    1926  * @brief  Gets the cuurent data transfer state.
    1927  * @param  None
    1928  * @retval SDTransferState: Data Transfer state.
    1929  *   This value can be:
    1930  *        - SD_TRANSFER_OK: No data transfer is acting
    1931  *        - SD_TRANSFER_BUSY: Data transfer is acting
    1932  */
    1933 SDTransferState SD_GetTransferState ( void )
    1934 {
    1935   if ( SDIO->STA & ( SDIO_FLAG_TXACT | SDIO_FLAG_RXACT ) )
    1936   {
    1937     return ( SD_TRANSFER_BUSY );
    1938   }
    1939   else
    1940   {
    1941     return ( SD_TRANSFER_OK );
    1942   }
    1943 }
    1944 
    1945 /**
    1946  * @brief  Aborts an ongoing data transfer.
    1947  * @param  None
    1948  * @retval SD_Error: SD Card Error code.
    1949  */
    1950 SD_Error SD_StopTransfer ( void )
    1951 {
    1952   SD_Error errorstatus = SD_OK;
    1953 
    1954   /*!< Send CMD12 STOP_TRANSMISSION  */
    1955   SDIO_CmdInitStructure.SDIO_Argument = 0x0;
    1956   SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_STOP_TRANSMISSION;
    1957   SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    1958   SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
    1959   SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
    1960   SDIO_SendCommand ( & SDIO_CmdInitStructure );
    1961 
    1962   errorstatus = CmdResp1Error ( SD_CMD_STOP_TRANSMISSION );
    1963 
    1964   return ( errorstatus );
    1965 }
    1966 
    1967 /**
    1968  * @brief  Allows to erase memory area specified for the given card.
    1969  * @param  startaddr: the start address.
    1970  * @param  endaddr: the end address.
    1971  * @retval SD_Error: SD Card Error code.
    1972  */
    1973 SD_Error SD_Erase ( uint32_t startaddr, uint32_t endaddr )
    1974 {
    1975   SD_Error      errorstatus = SD_OK;
    1976   uint32_t      delay       = 0;
    1977   __IO uint32_t maxdelay    = 0;
    1978   uint8_t       cardstate   = 0;
    1979 
    1980   /*!< Check if the card coomnd class supports erase command */
    1981   if ( ( ( CSD_Tab[ 1 ] >> 20 ) & SD_CCCC_ERASE ) == 0 )
    1982   {
    1983     errorstatus = SD_REQUEST_NOT_APPLICABLE;
    1984     return ( errorstatus );
    1985   }
    1986 
    1987   maxdelay = 120000 / ( ( SDIO->CLKCR & 0xFF ) + 2 );
    1988 
    1989   if ( SDIO_GetResponse( SDIO_RESP1 ) & SD_CARD_LOCKED )
    1990   {
    1991     errorstatus = SD_LOCK_UNLOCK_FAILED;
    1992     return ( errorstatus );
    1993   }
    1994 
    1995   if ( CardType == SDIO_HIGH_CAPACITY_SD_CARD )
    1996   {
    1997     startaddr /= 512;
    1998     endaddr /= 512;
    1999   }
    2000 
    2001   /*!< According to sd-card spec 1.0 ERASE_GROUP_START (CMD32) and erase_group_end(CMD33) */
    2002   if ( ( SDIO_STD_CAPACITY_SD_CARD_V1_1 == CardType ) ||
    2003     ( SDIO_STD_CAPACITY_SD_CARD_V2_0 == CardType ) ||
    2004     ( SDIO_HIGH_CAPACITY_SD_CARD == CardType ) )
    2005   {
    2006     /*!< Send CMD32 SD_ERASE_GRP_START with argument as addr  */
    2007     SDIO_CmdInitStructure.SDIO_Argument = startaddr;
    2008     SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SD_ERASE_GRP_START;
    2009     SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    2010     SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
    2011     SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
    2012     SDIO_SendCommand ( & SDIO_CmdInitStructure );
    2013 
    2014     errorstatus = CmdResp1Error ( SD_CMD_SD_ERASE_GRP_START );
    2015     if ( errorstatus != SD_OK )
    2016     {
    2017       return ( errorstatus );
    2018     }
    2019 
    2020     /*!< Send CMD33 SD_ERASE_GRP_END with argument as addr  */
    2021     SDIO_CmdInitStructure.SDIO_Argument = endaddr;
    2022     SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SD_ERASE_GRP_END;
    2023     SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    2024     SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
    2025     SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
    2026     SDIO_SendCommand ( & SDIO_CmdInitStructure );
    2027 
    2028     errorstatus = CmdResp1Error ( SD_CMD_SD_ERASE_GRP_END );
    2029     if ( errorstatus != SD_OK )
    2030     {
    2031       return ( errorstatus );
    2032     }
    2033   }
    2034 
    2035   /*!< Send CMD38 ERASE */
    2036   SDIO_CmdInitStructure.SDIO_Argument = 0;
    2037   SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_ERASE;
    2038   SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    2039   SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
    2040   SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
    2041   SDIO_SendCommand ( & SDIO_CmdInitStructure );
    2042 
    2043   errorstatus = CmdResp1Error ( SD_CMD_ERASE );
    2044 
    2045   if ( errorstatus != SD_OK )
    2046   {
    2047     return ( errorstatus );
    2048   }
    2049 
    2050   for ( delay = 0; delay < maxdelay; delay++ )
    2051   {
    2052   }
    2053 
    2054   /*!< Wait till the card is in programming state */
    2055   errorstatus = IsCardProgramming ( &cardstate );
    2056 
    2057   while ( ( errorstatus == SD_OK ) && ( ( SD_CARD_PROGRAMMING == cardstate ) ||
    2058       ( SD_CARD_RECEIVING == cardstate ) ) )
    2059   {
    2060     errorstatus = IsCardProgramming ( &cardstate );
    2061   }
    2062 
    2063   return ( errorstatus );
    2064 }
    2065 
    2066 /**
    2067  * @brief  Returns the current card's status.
    2068  * @param  pcardstatus: pointer to the buffer that will contain the SD card
    2069  *         status (Card Status register).
    2070  * @retval SD_Error: SD Card Error code.
    2071  */
    2072 SD_Error SD_SendStatus ( uint32_t * pcardstatus )
    2073 {
    2074   SD_Error errorstatus = SD_OK;
    2075 
    2076   if ( pcardstatus == NULL )
    2077   {
    2078     errorstatus = SD_INVALID_PARAMETER;
    2079     return ( errorstatus );
    2080   }
    2081 
    2082   SDIO_CmdInitStructure.SDIO_Argument = ( uint32_t ) RCA << 16;
    2083   SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SEND_STATUS;
    2084   SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    2085   SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
    2086   SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
    2087   SDIO_SendCommand ( & SDIO_CmdInitStructure );
    2088 
    2089   errorstatus = CmdResp1Error ( SD_CMD_SEND_STATUS );
    2090 
    2091   if ( errorstatus != SD_OK )
    2092   {
    2093     return ( errorstatus );
    2094   }
    2095 
    2096   *pcardstatus = SDIO_GetResponse ( SDIO_RESP1 );
    2097 
    2098   return ( errorstatus );
    2099 }
    2100 
    2101 /**
    2102  * @brief  Returns the current SD card's status.
    2103  * @param  psdstatus: pointer to the buffer that will contain the SD card status
    2104  *         (SD Status register).
    2105  * @retval SD_Error: SD Card Error code.
    2106  */
    2107 SD_Error SD_SendSDStatus ( uint32_t * psdstatus )
    2108 {
    2109   SD_Error errorstatus = SD_OK;
    2110   uint32_t count       = 0;
    2111 
    2112   if ( SDIO_GetResponse( SDIO_RESP1 ) & SD_CARD_LOCKED )
    2113   {
    2114     errorstatus = SD_LOCK_UNLOCK_FAILED;
    2115     return ( errorstatus );
    2116   }
    2117 
    2118   /*!< Set block size for card if it is not equal to current block size for card. */
    2119   SDIO_CmdInitStructure.SDIO_Argument = 64;
    2120   SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SET_BLOCKLEN;
    2121   SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    2122   SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
    2123   SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
    2124   SDIO_SendCommand ( & SDIO_CmdInitStructure );
    2125 
    2126   errorstatus = CmdResp1Error ( SD_CMD_SET_BLOCKLEN );
    2127 
    2128   if ( errorstatus != SD_OK )
    2129   {
    2130     return ( errorstatus );
    2131   }
    2132 
    2133   /*!< CMD55 */
    2134   SDIO_CmdInitStructure.SDIO_Argument = ( uint32_t ) RCA << 16;
    2135   SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_APP_CMD;
    2136   SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    2137   SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
    2138   SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
    2139   SDIO_SendCommand ( & SDIO_CmdInitStructure );
    2140   errorstatus = CmdResp1Error ( SD_CMD_APP_CMD );
    2141 
    2142   if ( errorstatus != SD_OK )
    2143   {
    2144     return ( errorstatus );
    2145   }
    2146 
    2147   SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT;
    2148   SDIO_DataInitStructure.SDIO_DataLength    = 64;
    2149   SDIO_DataInitStructure.SDIO_DataBlockSize = SDIO_DataBlockSize_64b;
    2150   SDIO_DataInitStructure.SDIO_TransferDir   = SDIO_TransferDir_ToSDIO;
    2151   SDIO_DataInitStructure.SDIO_TransferMode  = SDIO_TransferMode_Block;
    2152   SDIO_DataInitStructure.SDIO_DPSM          = SDIO_DPSM_Enable;
    2153   SDIO_DataConfig ( & SDIO_DataInitStructure );
    2154 
    2155   /*!< Send ACMD13 SD_APP_STAUS  with argument as card's RCA.*/
    2156   SDIO_CmdInitStructure.SDIO_Argument = 0;
    2157   SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SD_APP_STAUS;
    2158   SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    2159   SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
    2160   SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
    2161   SDIO_SendCommand ( & SDIO_CmdInitStructure );
    2162   errorstatus = CmdResp1Error ( SD_CMD_SD_APP_STAUS );
    2163 
    2164   if ( errorstatus != SD_OK )
    2165   {
    2166     return ( errorstatus );
    2167   }
    2168 
    2169   while ( !( SDIO->STA & ( SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL |
    2170         SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR ) ) )
    2171   {
    2172     if ( SDIO_GetFlagStatus( SDIO_FLAG_RXFIFOHF ) != RESET )
    2173     {
    2174       for ( count = 0; count < 8; count++ )
    2175       {
    2176         *( psdstatus + count ) = SDIO_ReadData ( );
    2177       }
    2178       psdstatus += 8;
    2179     }
    2180   }
    2181 
    2182   if ( SDIO_GetFlagStatus( SDIO_FLAG_DTIMEOUT ) != RESET )
    2183   {
    2184     SDIO_ClearFlag ( SDIO_FLAG_DTIMEOUT );
    2185     errorstatus = SD_DATA_TIMEOUT;
    2186     return ( errorstatus );
    2187   }
    2188   else if ( SDIO_GetFlagStatus( SDIO_FLAG_DCRCFAIL ) != RESET )
    2189   {
    2190     SDIO_ClearFlag ( SDIO_FLAG_DCRCFAIL );
    2191     errorstatus = SD_DATA_CRC_FAIL;
    2192     return ( errorstatus );
    2193   }
    2194   else if ( SDIO_GetFlagStatus( SDIO_FLAG_RXOVERR ) != RESET )
    2195   {
    2196     SDIO_ClearFlag ( SDIO_FLAG_RXOVERR );
    2197     errorstatus = SD_RX_OVERRUN;
    2198     return ( errorstatus );
    2199   }
    2200   else if ( SDIO_GetFlagStatus( SDIO_FLAG_STBITERR ) != RESET )
    2201   {
    2202     SDIO_ClearFlag ( SDIO_FLAG_STBITERR );
    2203     errorstatus = SD_START_BIT_ERR;
    2204     return ( errorstatus );
    2205   }
    2206 
    2207   while ( SDIO_GetFlagStatus( SDIO_FLAG_RXDAVL ) != RESET )
    2208   {
    2209     *psdstatus = SDIO_ReadData ( );
    2210     psdstatus++;
    2211   }
    2212 
    2213   /*!< Clear all the static status flags*/
    2214   SDIO_ClearFlag ( SDIO_STATIC_FLAGS );
    2215   psdstatus -= 16;
    2216   for ( count = 0; count < 16; count++ )
    2217   {
    2218     psdstatus[ count ] = ( ( psdstatus[ count ] & SD_0TO7BITS ) << 24 ) |
    2219       ( ( psdstatus[ count ] & SD_8TO15BITS ) << 8 ) |
    2220       ( ( psdstatus[ count ] & SD_16TO23BITS ) >> 8 ) |
    2221       ( ( psdstatus[ count ] & SD_24TO31BITS ) >> 24 );
    2222   }
    2223   return ( errorstatus );
    2224 }
    2225 
    2226 /**
    2227  * @brief  Allows to process all the interrupts that are high.
    2228  * @param  None
    2229  * @retval SD_Error: SD Card Error code.
    2230  */
    2231 SD_Error SD_ProcessIRQSrc ( void )
    2232 {
    2233   uint32_t count = 0, restwords = 0;
    2234 
    2235   if ( DeviceMode == SD_INTERRUPT_MODE )
    2236   {
    2237     if ( SDIO_GetITStatus( SDIO_IT_RXFIFOHF ) != RESET )
    2238     {
    2239       for ( count = 0; count < SD_HALFFIFO; count++ )
    2240       {
    2241         *( DestBuffer + count ) = SDIO_ReadData ( );
    2242       }
    2243       DestBuffer += SD_HALFFIFO;
    2244       NumberOfBytes += SD_HALFFIFOBYTES;
    2245     }
    2246     else if ( SDIO_GetITStatus( SDIO_IT_TXFIFOHE ) != RESET )
    2247     {
    2248       if ( ( TotalNumberOfBytes - NumberOfBytes ) < SD_HALFFIFOBYTES )
    2249       {
    2250         restwords = ( ( TotalNumberOfBytes - NumberOfBytes ) % 4 == 0 ) ?
    2251           ( ( TotalNumberOfBytes - NumberOfBytes ) / 4 ) :
    2252           ( ( TotalNumberOfBytes - NumberOfBytes ) / 4 + 1 );
    2253 
    2254         for ( count = 0; count < restwords; count++, SrcBuffer++,
    2255           NumberOfBytes += 4 )
    2256         {
    2257           SDIO_WriteData ( * SrcBuffer );
    2258         }
    2259       }
    2260       else
    2261       {
    2262         for ( count = 0; count < SD_HALFFIFO; count++ )
    2263         {
    2264           SDIO_WriteData ( * ( SrcBuffer + count ) );
    2265         }
    2266 
    2267         SrcBuffer += SD_HALFFIFO;
    2268         NumberOfBytes += SD_HALFFIFOBYTES;
    2269       }
    2270     }
    2271   }
    2272 
    2273   if ( SDIO_GetITStatus( SDIO_IT_DATAEND ) != RESET )
    2274   {
    2275     if ( DeviceMode != SD_DMA_MODE )
    2276     {
    2277       while ( ( SDIO_GetFlagStatus( SDIO_FLAG_RXDAVL ) != RESET ) &&
    2278         ( NumberOfBytes < TotalNumberOfBytes ) )
    2279       {
    2280         *DestBuffer = SDIO_ReadData ( );
    2281         DestBuffer++;
    2282         NumberOfBytes += 4;
    2283       }
    2284     }
    2285 
    2286     if ( StopCondition == 1 )
    2287     {
    2288       TransferError = SD_StopTransfer ( );
    2289     }
    2290     else
    2291     {
    2292       TransferError = SD_OK;
    2293     }
    2294     SDIO_ClearITPendingBit ( SDIO_IT_DATAEND );
    2295     SDIO_ITConfig ( SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |
    2296       SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR | SDIO_IT_RXOVERR |
    2297       SDIO_IT_STBITERR, DISABLE );
    2298     TransferEnd   = 1;
    2299     NumberOfBytes = 0;
    2300     return ( TransferError );
    2301   }
    2302 
    2303   if ( SDIO_GetITStatus( SDIO_IT_DCRCFAIL ) != RESET )
    2304   {
    2305     SDIO_ClearITPendingBit ( SDIO_IT_DCRCFAIL );
    2306     SDIO_ITConfig ( SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |
    2307       SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR | SDIO_IT_RXOVERR |
    2308       SDIO_IT_STBITERR, DISABLE );
    2309     NumberOfBytes = 0;
    2310     TransferError = SD_DATA_CRC_FAIL;
    2311     return ( SD_DATA_CRC_FAIL );
    2312   }
    2313 
    2314   if ( SDIO_GetITStatus( SDIO_IT_DTIMEOUT ) != RESET )
    2315   {
    2316     SDIO_ClearITPendingBit ( SDIO_IT_DTIMEOUT );
    2317     SDIO_ITConfig ( SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |
    2318       SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR | SDIO_IT_RXOVERR |
    2319       SDIO_IT_STBITERR, DISABLE );
    2320     NumberOfBytes = 0;
    2321     TransferError = SD_DATA_TIMEOUT;
    2322     return ( SD_DATA_TIMEOUT );
    2323   }
    2324 
    2325   if ( SDIO_GetITStatus( SDIO_IT_RXOVERR ) != RESET )
    2326   {
    2327     SDIO_ClearITPendingBit ( SDIO_IT_RXOVERR );
    2328     SDIO_ITConfig ( SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |
    2329       SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR | SDIO_IT_RXOVERR |
    2330       SDIO_IT_STBITERR, DISABLE );
    2331     NumberOfBytes = 0;
    2332     TransferError = SD_RX_OVERRUN;
    2333     return ( SD_RX_OVERRUN );
    2334   }
    2335 
    2336   if ( SDIO_GetITStatus( SDIO_IT_TXUNDERR ) != RESET )
    2337   {
    2338     SDIO_ClearITPendingBit ( SDIO_IT_TXUNDERR );
    2339     SDIO_ITConfig ( SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |
    2340       SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR | SDIO_IT_RXOVERR |
    2341       SDIO_IT_STBITERR, DISABLE );
    2342     NumberOfBytes = 0;
    2343     TransferError = SD_TX_UNDERRUN;
    2344     return ( SD_TX_UNDERRUN );
    2345   }
    2346 
    2347   if ( SDIO_GetITStatus( SDIO_IT_STBITERR ) != RESET )
    2348   {
    2349     SDIO_ClearITPendingBit ( SDIO_IT_STBITERR );
    2350     SDIO_ITConfig ( SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |
    2351       SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR | SDIO_IT_RXOVERR |
    2352       SDIO_IT_STBITERR, DISABLE );
    2353     NumberOfBytes = 0;
    2354     TransferError = SD_START_BIT_ERR;
    2355     return ( SD_START_BIT_ERR );
    2356   }
    2357 
    2358   return ( SD_OK );
    2359 }
    2360 
    2361 /**
    2362  * @brief  Checks for error conditions for CMD0.
    2363  * @param  None
    2364  * @retval SD_Error: SD Card Error code.
    2365  */
    2366 static SD_Error CmdError ( void )
    2367 {
    2368   SD_Error errorstatus = SD_OK;
    2369   uint32_t timeout;
    2370 
    2371   timeout = SDIO_CMD0TIMEOUT; /*!< 10000 */
    2372 
    2373   while ( ( timeout > 0 ) && ( SDIO_GetFlagStatus( SDIO_FLAG_CMDSENT )
    2374       == RESET ) )
    2375   {
    2376     timeout--;
    2377   }
    2378 
    2379   if ( timeout == 0 )
    2380   {
    2381     errorstatus = SD_CMD_RSP_TIMEOUT;
    2382     return ( errorstatus );
    2383   }
    2384 
    2385   /*!< Clear all the static flags */
    2386   SDIO_ClearFlag ( SDIO_STATIC_FLAGS );
    2387 
    2388   return ( errorstatus );
    2389 }
    2390 
    2391 /**
    2392  * @brief  Checks for error conditions for R7 response.
    2393  * @param  None
    2394  * @retval SD_Error: SD Card Error code.
    2395  */
    2396 static SD_Error CmdResp7Error ( void )
    2397 {
    2398   SD_Error errorstatus = SD_OK;
    2399   uint32_t status;
    2400   uint32_t timeout = SDIO_CMD0TIMEOUT;
    2401 
    2402   status = SDIO->STA;
    2403 
    2404   while ( !( status & ( SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND |
    2405         SDIO_FLAG_CTIMEOUT ) ) && ( timeout > 0 ) )
    2406   {
    2407     timeout--;
    2408     status = SDIO->STA;
    2409   }
    2410 
    2411   if ( ( timeout == 0 ) || ( status & SDIO_FLAG_CTIMEOUT ) )
    2412   {
    2413     /*!< Card is not V2.0 complient or card does not support the set voltage range */
    2414     errorstatus = SD_CMD_RSP_TIMEOUT;
    2415     SDIO_ClearFlag ( SDIO_FLAG_CTIMEOUT );
    2416     return ( errorstatus );
    2417   }
    2418 
    2419   if ( status & SDIO_FLAG_CMDREND )
    2420   {
    2421     /*!< Card is SD V2.0 compliant */
    2422     errorstatus = SD_OK;
    2423     SDIO_ClearFlag ( SDIO_FLAG_CMDREND );
    2424     return ( errorstatus );
    2425   }
    2426   return ( errorstatus );
    2427 }
    2428 
    2429 /**
    2430  * @brief  Checks for error conditions for R1 response.
    2431  * @param  cmd: The sent command index.
    2432  * @retval SD_Error: SD Card Error code.
    2433  */
    2434 static SD_Error CmdResp1Error ( uint8_t cmd )
    2435 {
    2436   SD_Error errorstatus = SD_OK;
    2437   uint32_t status;
    2438   uint32_t response_r1;
    2439 
    2440   status = SDIO->STA;
    2441 
    2442   while ( !( status & ( SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND |
    2443         SDIO_FLAG_CTIMEOUT ) ) )
    2444   {
    2445     status = SDIO->STA;
    2446   }
    2447 
    2448   if ( status & SDIO_FLAG_CTIMEOUT )
    2449   {
    2450     errorstatus = SD_CMD_RSP_TIMEOUT;
    2451     SDIO_ClearFlag ( SDIO_FLAG_CTIMEOUT );
    2452     return ( errorstatus );
    2453   }
    2454   else if ( status & SDIO_FLAG_CCRCFAIL )
    2455   {
    2456     errorstatus = SD_CMD_CRC_FAIL;
    2457     SDIO_ClearFlag ( SDIO_FLAG_CCRCFAIL );
    2458     return ( errorstatus );
    2459   }
    2460 
    2461   /*!< Check response received is of desired command */
    2462   if ( SDIO_GetCommandResponse( ) != cmd )
    2463   {
    2464     errorstatus = SD_ILLEGAL_CMD;
    2465     return ( errorstatus );
    2466   }
    2467 
    2468   /*!< Clear all the static flags */
    2469   SDIO_ClearFlag ( SDIO_STATIC_FLAGS );
    2470 
    2471   /*!< We have received response, retrieve it for analysis  */
    2472   response_r1 = SDIO_GetResponse ( SDIO_RESP1 );
    2473 
    2474   if ( ( response_r1 & SD_OCR_ERRORBITS ) == SD_ALLZERO )
    2475   {
    2476     return ( errorstatus );
    2477   }
    2478 
    2479   if ( response_r1 & SD_OCR_ADDR_OUT_OF_RANGE )
    2480   {
    2481     return ( SD_ADDR_OUT_OF_RANGE );
    2482   }
    2483 
    2484   if ( response_r1 & SD_OCR_ADDR_MISALIGNED )
    2485   {
    2486     return ( SD_ADDR_MISALIGNED );
    2487   }
    2488 
    2489   if ( response_r1 & SD_OCR_BLOCK_LEN_ERR )
    2490   {
    2491     return ( SD_BLOCK_LEN_ERR );
    2492   }
    2493 
    2494   if ( response_r1 & SD_OCR_ERASE_SEQ_ERR )
    2495   {
    2496     return ( SD_ERASE_SEQ_ERR );
    2497   }
    2498 
    2499   if ( response_r1 & SD_OCR_BAD_ERASE_PARAM )
    2500   {
    2501     return ( SD_BAD_ERASE_PARAM );
    2502   }
    2503 
    2504   if ( response_r1 & SD_OCR_WRITE_PROT_VIOLATION )
    2505   {
    2506     return ( SD_WRITE_PROT_VIOLATION );
    2507   }
    2508 
    2509   if ( response_r1 & SD_OCR_LOCK_UNLOCK_FAILED )
    2510   {
    2511     return ( SD_LOCK_UNLOCK_FAILED );
    2512   }
    2513 
    2514   if ( response_r1 & SD_OCR_COM_CRC_FAILED )
    2515   {
    2516     return ( SD_COM_CRC_FAILED );
    2517   }
    2518 
    2519   if ( response_r1 & SD_OCR_ILLEGAL_CMD )
    2520   {
    2521     return ( SD_ILLEGAL_CMD );
    2522   }
    2523 
    2524   if ( response_r1 & SD_OCR_CARD_ECC_FAILED )
    2525   {
    2526     return ( SD_CARD_ECC_FAILED );
    2527   }
    2528 
    2529   if ( response_r1 & SD_OCR_CC_ERROR )
    2530   {
    2531     return ( SD_CC_ERROR );
    2532   }
    2533 
    2534   if ( response_r1 & SD_OCR_GENERAL_UNKNOWN_ERROR )
    2535   {
    2536     return ( SD_GENERAL_UNKNOWN_ERROR );
    2537   }
    2538 
    2539   if ( response_r1 & SD_OCR_STREAM_READ_UNDERRUN )
    2540   {
    2541     return ( SD_STREAM_READ_UNDERRUN );
    2542   }
    2543 
    2544   if ( response_r1 & SD_OCR_STREAM_WRITE_OVERRUN )
    2545   {
    2546     return ( SD_STREAM_WRITE_OVERRUN );
    2547   }
    2548 
    2549   if ( response_r1 & SD_OCR_CID_CSD_OVERWRIETE )
    2550   {
    2551     return ( SD_CID_CSD_OVERWRITE );
    2552   }
    2553 
    2554   if ( response_r1 & SD_OCR_WP_ERASE_SKIP )
    2555   {
    2556     return ( SD_WP_ERASE_SKIP );
    2557   }
    2558 
    2559   if ( response_r1 & SD_OCR_CARD_ECC_DISABLED )
    2560   {
    2561     return ( SD_CARD_ECC_DISABLED );
    2562   }
    2563 
    2564   if ( response_r1 & SD_OCR_ERASE_RESET )
    2565   {
    2566     return ( SD_ERASE_RESET );
    2567   }
    2568 
    2569   if ( response_r1 & SD_OCR_AKE_SEQ_ERROR )
    2570   {
    2571     return ( SD_AKE_SEQ_ERROR );
    2572   }
    2573   return ( errorstatus );
    2574 }
    2575 
    2576 /**
    2577  * @brief  Checks for error conditions for R3 (OCR) response.
    2578  * @param  None
    2579  * @retval SD_Error: SD Card Error code.
    2580  */
    2581 static SD_Error CmdResp3Error ( void )
    2582 {
    2583   SD_Error errorstatus = SD_OK;
    2584   uint32_t status;
    2585 
    2586   status = SDIO->STA;
    2587 
    2588   while ( !( status & ( SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND |
    2589         SDIO_FLAG_CTIMEOUT ) ) )
    2590   {
    2591     status = SDIO->STA;
    2592   }
    2593 
    2594   if ( status & SDIO_FLAG_CTIMEOUT )
    2595   {
    2596     errorstatus = SD_CMD_RSP_TIMEOUT;
    2597     SDIO_ClearFlag ( SDIO_FLAG_CTIMEOUT );
    2598     return ( errorstatus );
    2599   }
    2600   /*!< Clear all the static flags */
    2601   SDIO_ClearFlag ( SDIO_STATIC_FLAGS );
    2602   return ( errorstatus );
    2603 }
    2604 
    2605 /**
    2606  * @brief  Checks for error conditions for R2 (CID or CSD) response.
    2607  * @param  None
    2608  * @retval SD_Error: SD Card Error code.
    2609  */
    2610 static SD_Error CmdResp2Error ( void )
    2611 {
    2612   SD_Error errorstatus = SD_OK;
    2613   uint32_t status;
    2614 
    2615   status = SDIO->STA;
    2616 
    2617   while ( !( status & ( SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CTIMEOUT |
    2618         SDIO_FLAG_CMDREND ) ) )
    2619   {
    2620     status = SDIO->STA;
    2621   }
    2622 
    2623   if ( status & SDIO_FLAG_CTIMEOUT )
    2624   {
    2625     errorstatus = SD_CMD_RSP_TIMEOUT;
    2626     SDIO_ClearFlag ( SDIO_FLAG_CTIMEOUT );
    2627     return ( errorstatus );
    2628   }
    2629   else if ( status & SDIO_FLAG_CCRCFAIL )
    2630   {
    2631     errorstatus = SD_CMD_CRC_FAIL;
    2632     SDIO_ClearFlag ( SDIO_FLAG_CCRCFAIL );
    2633     return ( errorstatus );
    2634   }
    2635 
    2636   /*!< Clear all the static flags */
    2637   SDIO_ClearFlag ( SDIO_STATIC_FLAGS );
    2638 
    2639   return ( errorstatus );
    2640 }
    2641 
    2642 /**
    2643  * @brief  Checks for error conditions for R6 (RCA) response.
    2644  * @param  cmd: The sent command index.
    2645  * @param  prca: pointer to the variable that will contain the SD card relative
    2646  *         address RCA.
    2647  * @retval SD_Error: SD Card Error code.
    2648  */
    2649 static SD_Error CmdResp6Error ( uint8_t cmd, uint16_t * prca )
    2650 {
    2651   SD_Error errorstatus = SD_OK;
    2652   uint32_t status;
    2653   uint32_t response_r1;
    2654 
    2655   status = SDIO->STA;
    2656 
    2657   while ( !( status & ( SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CTIMEOUT |
    2658         SDIO_FLAG_CMDREND ) ) )
    2659   {
    2660     status = SDIO->STA;
    2661   }
    2662 
    2663   if ( status & SDIO_FLAG_CTIMEOUT )
    2664   {
    2665     errorstatus = SD_CMD_RSP_TIMEOUT;
    2666     SDIO_ClearFlag ( SDIO_FLAG_CTIMEOUT );
    2667     return ( errorstatus );
    2668   }
    2669   else if ( status & SDIO_FLAG_CCRCFAIL )
    2670   {
    2671     errorstatus = SD_CMD_CRC_FAIL;
    2672     SDIO_ClearFlag ( SDIO_FLAG_CCRCFAIL );
    2673     return ( errorstatus );
    2674   }
    2675 
    2676   /*!< Check response received is of desired command */
    2677   if ( SDIO_GetCommandResponse( ) != cmd )
    2678   {
    2679     errorstatus = SD_ILLEGAL_CMD;
    2680     return ( errorstatus );
    2681   }
    2682 
    2683   /*!< Clear all the static flags */
    2684   SDIO_ClearFlag ( SDIO_STATIC_FLAGS );
    2685 
    2686   /*!< We have received response, retrieve it.  */
    2687   response_r1 = SDIO_GetResponse ( SDIO_RESP1 );
    2688 
    2689   if ( SD_ALLZERO == ( response_r1 &
    2690       ( SD_R6_GENERAL_UNKNOWN_ERROR | SD_R6_ILLEGAL_CMD |
    2691         SD_R6_COM_CRC_FAILED ) ) )
    2692   {
    2693     *prca = ( uint16_t )( response_r1 >> 16 );
    2694     return ( errorstatus );
    2695   }
    2696 
    2697   if ( response_r1 & SD_R6_GENERAL_UNKNOWN_ERROR )
    2698   {
    2699     return ( SD_GENERAL_UNKNOWN_ERROR );
    2700   }
    2701 
    2702   if ( response_r1 & SD_R6_ILLEGAL_CMD )
    2703   {
    2704     return ( SD_ILLEGAL_CMD );
    2705   }
    2706 
    2707   if ( response_r1 & SD_R6_COM_CRC_FAILED )
    2708   {
    2709     return ( SD_COM_CRC_FAILED );
    2710   }
    2711 
    2712   return ( errorstatus );
    2713 }
    2714 
    2715 /**
    2716  * @brief  Enables or disables the SDIO wide bus mode.
    2717  * @param  NewState: new state of the SDIO wide bus mode.
    2718  *   This parameter can be: ENABLE or DISABLE.
    2719  * @retval SD_Error: SD Card Error code.
    2720  */
    2721 static SD_Error SDEnWideBus ( FunctionalState NewState )
    2722 {
    2723   SD_Error errorstatus = SD_OK;
    2724 
    2725   uint32_t scr[ 2 ] =
    2726   {
    2727     0,
    2728     0
    2729   } ;
    2730 
    2731   if ( SDIO_GetResponse( SDIO_RESP1 ) & SD_CARD_LOCKED )
    2732   {
    2733     errorstatus = SD_LOCK_UNLOCK_FAILED;
    2734     return ( errorstatus );
    2735   }
    2736 
    2737   /*!< Get SCR Register */
    2738   errorstatus = FindSCR ( RCA, scr );
    2739 
    2740   if ( errorstatus != SD_OK )
    2741   {
    2742     return ( errorstatus );
    2743   }
    2744 
    2745   /*!< If wide bus operation to be enabled */
    2746   if ( NewState == ENABLE )
    2747   {
    2748     /*!< If requested card supports wide bus operation */
    2749     if ( ( scr[ 1 ] & SD_WIDE_BUS_SUPPORT ) != SD_ALLZERO )
    2750     {
    2751       /*!< Send CMD55 APP_CMD with argument as card's RCA.*/
    2752       SDIO_CmdInitStructure.SDIO_Argument = ( uint32_t ) RCA << 16;
    2753       SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_APP_CMD;
    2754       SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    2755       SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
    2756       SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
    2757       SDIO_SendCommand ( & SDIO_CmdInitStructure );
    2758 
    2759       errorstatus = CmdResp1Error ( SD_CMD_APP_CMD );
    2760 
    2761       if ( errorstatus != SD_OK )
    2762       {
    2763         return ( errorstatus );
    2764       }
    2765 
    2766       /*!< Send ACMD6 APP_CMD with argument as 2 for wide bus mode */
    2767       SDIO_CmdInitStructure.SDIO_Argument = 0x2;
    2768       SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_APP_SD_SET_BUSWIDTH;
    2769       SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    2770       SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
    2771       SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
    2772       SDIO_SendCommand ( & SDIO_CmdInitStructure );
    2773 
    2774       errorstatus = CmdResp1Error ( SD_CMD_APP_SD_SET_BUSWIDTH );
    2775 
    2776       if ( errorstatus != SD_OK )
    2777       {
    2778         return ( errorstatus );
    2779       }
    2780       return ( errorstatus );
    2781     }
    2782     else
    2783     {
    2784       errorstatus = SD_REQUEST_NOT_APPLICABLE;
    2785       return ( errorstatus );
    2786     }
    2787   } /*!< If wide bus operation to be disabled */
    2788   else
    2789   {
    2790     /*!< If requested card supports 1 bit mode operation */
    2791     if ( ( scr[ 1 ] & SD_SINGLE_BUS_SUPPORT ) != SD_ALLZERO )
    2792     {
    2793       /*!< Send CMD55 APP_CMD with argument as card's RCA.*/
    2794       SDIO_CmdInitStructure.SDIO_Argument = ( uint32_t ) RCA << 16;
    2795       SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_APP_CMD;
    2796       SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    2797       SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
    2798       SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
    2799       SDIO_SendCommand ( & SDIO_CmdInitStructure );
    2800 
    2801       errorstatus = CmdResp1Error ( SD_CMD_APP_CMD );
    2802 
    2803       if ( errorstatus != SD_OK )
    2804       {
    2805         return ( errorstatus );
    2806       }
    2807 
    2808       /*!< Send ACMD6 APP_CMD with argument as 2 for wide bus mode */
    2809       SDIO_CmdInitStructure.SDIO_Argument = 0x00;
    2810       SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_APP_SD_SET_BUSWIDTH;
    2811       SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    2812       SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
    2813       SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
    2814       SDIO_SendCommand ( & SDIO_CmdInitStructure );
    2815 
    2816       errorstatus = CmdResp1Error ( SD_CMD_APP_SD_SET_BUSWIDTH );
    2817 
    2818       if ( errorstatus != SD_OK )
    2819       {
    2820         return ( errorstatus );
    2821       }
    2822 
    2823       return ( errorstatus );
    2824     }
    2825     else
    2826     {
    2827       errorstatus = SD_REQUEST_NOT_APPLICABLE;
    2828       return ( errorstatus );
    2829     }
    2830   }
    2831 }
    2832 
    2833 /**
    2834  * @brief  Checks if the SD card is in programming state.
    2835  * @param  pstatus: pointer to the variable that will contain the SD card state.
    2836  * @retval SD_Error: SD Card Error code.
    2837  */
    2838 static SD_Error IsCardProgramming ( uint8_t * pstatus )
    2839 {
    2840   SD_Error      errorstatus = SD_OK;
    2841   __IO uint32_t respR1      = 0, status = 0;
    2842 
    2843   SDIO_CmdInitStructure.SDIO_Argument = ( uint32_t ) RCA << 16;
    2844   SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SEND_STATUS;
    2845   SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    2846   SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
    2847   SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
    2848   SDIO_SendCommand ( & SDIO_CmdInitStructure );
    2849 
    2850   status = SDIO->STA;
    2851   while ( !( status & ( SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND |
    2852         SDIO_FLAG_CTIMEOUT ) ) )
    2853   {
    2854     status = SDIO->STA;
    2855   }
    2856 
    2857   if ( status & SDIO_FLAG_CTIMEOUT )
    2858   {
    2859     errorstatus = SD_CMD_RSP_TIMEOUT;
    2860     SDIO_ClearFlag ( SDIO_FLAG_CTIMEOUT );
    2861     return ( errorstatus );
    2862   }
    2863   else if ( status & SDIO_FLAG_CCRCFAIL )
    2864   {
    2865     errorstatus = SD_CMD_CRC_FAIL;
    2866     SDIO_ClearFlag ( SDIO_FLAG_CCRCFAIL );
    2867     return ( errorstatus );
    2868   }
    2869 
    2870   status = ( uint32_t )SDIO_GetCommandResponse ( );
    2871 
    2872   /*!< Check response received is of desired command */
    2873   if ( status != SD_CMD_SEND_STATUS )
    2874   {
    2875     errorstatus = SD_ILLEGAL_CMD;
    2876     return ( errorstatus );
    2877   }
    2878 
    2879   /*!< Clear all the static flags */
    2880   SDIO_ClearFlag ( SDIO_STATIC_FLAGS );
    2881 
    2882   /*!< We have received response, retrieve it for analysis  */
    2883   respR1 = SDIO_GetResponse ( SDIO_RESP1 );
    2884 
    2885   /*!< Find out card status */
    2886   *pstatus = ( uint8_t )( ( respR1 >> 9 ) & 0x0000000F );
    2887 
    2888   if ( ( respR1 & SD_OCR_ERRORBITS ) == SD_ALLZERO )
    2889   {
    2890     return ( errorstatus );
    2891   }
    2892 
    2893   if ( respR1 & SD_OCR_ADDR_OUT_OF_RANGE )
    2894   {
    2895     return ( SD_ADDR_OUT_OF_RANGE );
    2896   }
    2897 
    2898   if ( respR1 & SD_OCR_ADDR_MISALIGNED )
    2899   {
    2900     return ( SD_ADDR_MISALIGNED );
    2901   }
    2902 
    2903   if ( respR1 & SD_OCR_BLOCK_LEN_ERR )
    2904   {
    2905     return ( SD_BLOCK_LEN_ERR );
    2906   }
    2907 
    2908   if ( respR1 & SD_OCR_ERASE_SEQ_ERR )
    2909   {
    2910     return ( SD_ERASE_SEQ_ERR );
    2911   }
    2912 
    2913   if ( respR1 & SD_OCR_BAD_ERASE_PARAM )
    2914   {
    2915     return ( SD_BAD_ERASE_PARAM );
    2916   }
    2917 
    2918   if ( respR1 & SD_OCR_WRITE_PROT_VIOLATION )
    2919   {
    2920     return ( SD_WRITE_PROT_VIOLATION );
    2921   }
    2922 
    2923   if ( respR1 & SD_OCR_LOCK_UNLOCK_FAILED )
    2924   {
    2925     return ( SD_LOCK_UNLOCK_FAILED );
    2926   }
    2927 
    2928   if ( respR1 & SD_OCR_COM_CRC_FAILED )
    2929   {
    2930     return ( SD_COM_CRC_FAILED );
    2931   }
    2932 
    2933   if ( respR1 & SD_OCR_ILLEGAL_CMD )
    2934   {
    2935     return ( SD_ILLEGAL_CMD );
    2936   }
    2937 
    2938   if ( respR1 & SD_OCR_CARD_ECC_FAILED )
    2939   {
    2940     return ( SD_CARD_ECC_FAILED );
    2941   }
    2942 
    2943   if ( respR1 & SD_OCR_CC_ERROR )
    2944   {
    2945     return ( SD_CC_ERROR );
    2946   }
    2947 
    2948   if ( respR1 & SD_OCR_GENERAL_UNKNOWN_ERROR )
    2949   {
    2950     return ( SD_GENERAL_UNKNOWN_ERROR );
    2951   }
    2952 
    2953   if ( respR1 & SD_OCR_STREAM_READ_UNDERRUN )
    2954   {
    2955     return ( SD_STREAM_READ_UNDERRUN );
    2956   }
    2957 
    2958   if ( respR1 & SD_OCR_STREAM_WRITE_OVERRUN )
    2959   {
    2960     return ( SD_STREAM_WRITE_OVERRUN );
    2961   }
    2962 
    2963   if ( respR1 & SD_OCR_CID_CSD_OVERWRIETE )
    2964   {
    2965     return ( SD_CID_CSD_OVERWRITE );
    2966   }
    2967 
    2968   if ( respR1 & SD_OCR_WP_ERASE_SKIP )
    2969   {
    2970     return ( SD_WP_ERASE_SKIP );
    2971   }
    2972 
    2973   if ( respR1 & SD_OCR_CARD_ECC_DISABLED )
    2974   {
    2975     return ( SD_CARD_ECC_DISABLED );
    2976   }
    2977 
    2978   if ( respR1 & SD_OCR_ERASE_RESET )
    2979   {
    2980     return ( SD_ERASE_RESET );
    2981   }
    2982 
    2983   if ( respR1 & SD_OCR_AKE_SEQ_ERROR )
    2984   {
    2985     return ( SD_AKE_SEQ_ERROR );
    2986   }
    2987 
    2988   return ( errorstatus );
    2989 }
    2990 
    2991 /**
    2992  * @brief  Find the SD card SCR register value.
    2993  * @param  rca: selected card address.
    2994  * @param  pscr: pointer to the buffer that will contain the SCR value.
    2995  * @retval SD_Error: SD Card Error code.
    2996  */
    2997 static SD_Error FindSCR ( uint16_t rca, uint32_t * pscr )
    2998 {
    2999   uint32_t index        = 0;
    3000   SD_Error errorstatus  = SD_OK;
    3001   uint32_t tempscr[ 2 ] =
    3002   {
    3003     0,
    3004     0
    3005   } ;
    3006 
    3007   /*!< Set Block Size To 8 Bytes */
    3008   /*!< Send CMD55 APP_CMD with argument as card's RCA */
    3009   SDIO_CmdInitStructure.SDIO_Argument = ( uint32_t )8;
    3010   SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SET_BLOCKLEN;
    3011   SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    3012   SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
    3013   SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
    3014   SDIO_SendCommand ( & SDIO_CmdInitStructure );
    3015 
    3016   errorstatus = CmdResp1Error ( SD_CMD_SET_BLOCKLEN );
    3017 
    3018   if ( errorstatus != SD_OK )
    3019   {
    3020     return ( errorstatus );
    3021   }
    3022 
    3023   /*!< Send CMD55 APP_CMD with argument as card's RCA */
    3024   SDIO_CmdInitStructure.SDIO_Argument = ( uint32_t ) RCA << 16;
    3025   SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_APP_CMD;
    3026   SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    3027   SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
    3028   SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
    3029   SDIO_SendCommand ( & SDIO_CmdInitStructure );
    3030 
    3031   errorstatus = CmdResp1Error ( SD_CMD_APP_CMD );
    3032 
    3033   if ( errorstatus != SD_OK )
    3034   {
    3035     return ( errorstatus );
    3036   }
    3037   SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT;
    3038   SDIO_DataInitStructure.SDIO_DataLength    = 8;
    3039   SDIO_DataInitStructure.SDIO_DataBlockSize = SDIO_DataBlockSize_8b;
    3040   SDIO_DataInitStructure.SDIO_TransferDir   = SDIO_TransferDir_ToSDIO;
    3041   SDIO_DataInitStructure.SDIO_TransferMode  = SDIO_TransferMode_Block;
    3042   SDIO_DataInitStructure.SDIO_DPSM          = SDIO_DPSM_Enable;
    3043   SDIO_DataConfig ( & SDIO_DataInitStructure );
    3044 
    3045   /*!< Send ACMD51 SD_APP_SEND_SCR with argument as 0 */
    3046   SDIO_CmdInitStructure.SDIO_Argument = 0x0;
    3047   SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SD_APP_SEND_SCR;
    3048   SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    3049   SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
    3050   SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
    3051   SDIO_SendCommand ( & SDIO_CmdInitStructure );
    3052 
    3053   errorstatus = CmdResp1Error ( SD_CMD_SD_APP_SEND_SCR );
    3054 
    3055   if ( errorstatus != SD_OK )
    3056   {
    3057     return ( errorstatus );
    3058   }
    3059 
    3060   while ( !( SDIO->STA & ( SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL |
    3061         SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR ) ) )
    3062   {
    3063     if ( SDIO_GetFlagStatus( SDIO_FLAG_RXDAVL ) != RESET )
    3064     {
    3065       *( tempscr + index ) = SDIO_ReadData ( );
    3066       index++;
    3067     }
    3068   }
    3069 
    3070   if ( SDIO_GetFlagStatus( SDIO_FLAG_DTIMEOUT ) != RESET )
    3071   {
    3072     SDIO_ClearFlag ( SDIO_FLAG_DTIMEOUT );
    3073     errorstatus = SD_DATA_TIMEOUT;
    3074     return ( errorstatus );
    3075   }
    3076   else if ( SDIO_GetFlagStatus( SDIO_FLAG_DCRCFAIL ) != RESET )
    3077   {
    3078     SDIO_ClearFlag ( SDIO_FLAG_DCRCFAIL );
    3079     errorstatus = SD_DATA_CRC_FAIL;
    3080     return ( errorstatus );
    3081   }
    3082   else if ( SDIO_GetFlagStatus( SDIO_FLAG_RXOVERR ) != RESET )
    3083   {
    3084     SDIO_ClearFlag ( SDIO_FLAG_RXOVERR );
    3085     errorstatus = SD_RX_OVERRUN;
    3086     return ( errorstatus );
    3087   }
    3088   else if ( SDIO_GetFlagStatus( SDIO_FLAG_STBITERR ) != RESET )
    3089   {
    3090     SDIO_ClearFlag ( SDIO_FLAG_STBITERR );
    3091     errorstatus = SD_START_BIT_ERR;
    3092     return ( errorstatus );
    3093   }
    3094 
    3095   /*!< Clear all the static flags */
    3096   SDIO_ClearFlag ( SDIO_STATIC_FLAGS );
    3097 
    3098   *( pscr + 1 ) = ( ( tempscr[ 0 ] & SD_0TO7BITS ) << 24 ) |
    3099     ( ( tempscr[ 0 ] & SD_8TO15BITS ) << 8 ) |
    3100     ( ( tempscr[ 0 ] & SD_16TO23BITS ) >> 8 ) |
    3101     ( ( tempscr[ 0 ] & SD_24TO31BITS ) >> 24 );
    3102 
    3103   *( pscr ) = ( ( tempscr[ 1 ] & SD_0TO7BITS ) << 24 ) |
    3104     ( ( tempscr[ 1 ] & SD_8TO15BITS ) << 8 ) |
    3105     ( ( tempscr[ 1 ] & SD_16TO23BITS ) >> 8 ) |
    3106     ( ( tempscr[ 1 ] & SD_24TO31BITS ) >> 24 );
    3107 
    3108   return ( errorstatus );
    3109 }
    3110 
    3111 /**
    3112  * @brief  Converts the number of bytes in power of two and returns the power.
    3113  * @param  NumberOfBytes: number of bytes.
    3114  * @retval None
    3115  */
    3116 static uint8_t convert_from_bytes_to_power_of_two ( uint16_t NumberOfBytes )
    3117 {
    3118   uint8_t count = 0;
    3119 
    3120   while ( NumberOfBytes != 1 )
    3121   {
    3122     NumberOfBytes >>= 1;
    3123     count++;
    3124   }
    3125   return ( count );
    3126 }
    3127 
    3128 /**
    3129  * @}
    3130  */
    3131 
    3132 /**
    3133  * @}
    3134  */
    3135 
    3136 /**
    3137  * @}
    3138  */
    3139 
    3140 /**
    3141  * @}
    3142  */
    3143 
    3144 /**
    3145  * @}
    3146  */
    3147 
    3148 /******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/
      1 /****************************************Copyright (c)****************************************************
      2  **
      3  **                                 http://www.powermcu.com
      4  **
      5  **--------------File Info---------------------------------------------------------------------------------
      6  ** File name:               sdio_sd.h
      7  ** Descriptions:            sdio sd卡操作头文件
      8  **
      9  **--------------------------------------------------------------------------------------------------------
     10  ** Created by:              AVRman
     11  ** Created date:            2010-10-30
     12  ** Version:                 v1.0
     13  ** Descriptions:            The original version
     14  **
     15  **--------------------------------------------------------------------------------------------------------
     16  ** Modified by:
     17  ** Modified date:
     18  ** Version:
     19  ** Descriptions:
     20  **
     21  *********************************************************************************************************/
     22 
     23 /* Define to prevent recursive inclusion -------------------------------------*/
     24 #ifndef __SDIO_SD_H
     25 #define __SDIO_SD_H
     26 
     27 #ifdef __cplusplus
     28 extern "C"
     29 {
     30   #endif
     31 
     32   /* Includes ------------------------------------------------------------------*/
     33   #include "stm32f10x.h"
     34 
     35   typedef enum
     36   {
     37     /**
     38      * @brief  SDIO specific error defines
     39      */
     40     SD_CMD_CRC_FAIL = ( 1 ),
     41     /*!< Command response received (but CRC check failed) */
     42       SD_DATA_CRC_FAIL = ( 2 ),
     43     /*!< Data bock sent/received (CRC check Failed) */
     44       SD_CMD_RSP_TIMEOUT = ( 3 ), /*!< Command response timeout */
     45       SD_DATA_TIMEOUT = ( 4 ),    /*!< Data time out */
     46       SD_TX_UNDERRUN = ( 5 ),     /*!< Transmit FIFO under-run */
     47       SD_RX_OVERRUN = ( 6 ),      /*!< Receive FIFO over-run */
     48       SD_START_BIT_ERR = ( 7 ),
     49     /*!< Start bit not detected on all data signals in widE bus mode */
     50       SD_CMD_OUT_OF_RANGE = ( 8 ), /*!< CMD's argument was out of range.*/
     51       SD_ADDR_MISALIGNED = ( 9 ),  /*!< Misaligned address */
     52       SD_BLOCK_LEN_ERR = ( 10 ),
     53     /*!< Transferred block length is not allowed for the card or the number of transferred bytes does not match the block length */
     54       SD_ERASE_SEQ_ERR = ( 11 ),
     55     /*!< An error in the sequence of erase command occurs.*/
     56       SD_BAD_ERASE_PARAM = ( 12 ), /*!< An Invalid selection for erase groups */
     57       SD_WRITE_PROT_VIOLATION = ( 13 ),
     58     /*!< Attempt to program a write protect block */
     59       SD_LOCK_UNLOCK_FAILED = ( 14 ),
     60     /*!< Sequence or password error has been detected in unlock command or if there was an attempt to access a locked card */
     61       SD_COM_CRC_FAILED = ( 15 ),
     62     /*!< CRC check of the previous command failed */
     63       SD_ILLEGAL_CMD = ( 16 ), /*!< Command is not legal for the card state */
     64       SD_CARD_ECC_FAILED = ( 17 ),
     65     /*!< Card internal ECC was applied but failed to correct the data */
     66       SD_CC_ERROR = ( 18 ),              /*!< Internal card controller error */
     67       SD_GENERAL_UNKNOWN_ERROR = ( 19 ), /*!< General or Unknown error */
     68       SD_STREAM_READ_UNDERRUN = ( 20 ),
     69     /*!< The card could not sustain data transfer in stream read operation. */
     70       SD_STREAM_WRITE_OVERRUN = ( 21 ),
     71     /*!< The card could not sustain data programming in stream mode */
     72       SD_CID_CSD_OVERWRITE = ( 22 ), /*!< CID/CSD overwrite error */
     73       SD_WP_ERASE_SKIP = ( 23 ), /*!< only partial address space was erased */
     74       SD_CARD_ECC_DISABLED = ( 24 ),
     75     /*!< Command has been executed without using internal ECC */
     76       SD_ERASE_RESET = ( 25 ),
     77     /*!< Erase sequence was cleared before executing because an out of erase sequence command was received */
     78       SD_AKE_SEQ_ERROR = ( 26 ), /*!< Error in sequence of authentication. */
     79       SD_INVALID_VOLTRANGE = ( 27 ), SD_ADDR_OUT_OF_RANGE = ( 28 ),
     80     SD_SWITCH_ERROR = ( 29 ), SD_SDIO_DISABLED = ( 30 ), SD_SDIO_FUNCTION_BUSY =
     81       ( 31 ), SD_SDIO_FUNCTION_FAILED = ( 32 ),
     82     SD_SDIO_UNKNOWN_FUNCTION = ( 33 ),
     83 
     84     /**
     85      * @brief  Standard error defines
     86      */
     87       SD_INTERNAL_ERROR, SD_NOT_CONFIGURED, SD_REQUEST_PENDING,
     88     SD_REQUEST_NOT_APPLICABLE, SD_INVALID_PARAMETER, SD_UNSUPPORTED_FEATURE,
     89     SD_UNSUPPORTED_HW, SD_ERROR, SD_OK
     90   } SD_Error;
     91 
     92   /**
     93    * @brief  SDIO Transfer state
     94    */
     95   typedef enum
     96   {
     97     SD_TRANSFER_OK = 0, SD_TRANSFER_BUSY = 1, SD_TRANSFER_ERROR
     98   } SDTransferState;
     99 
    100   /**
    101    * @brief  SD Card States
    102    */
    103   typedef enum
    104   {
    105     SD_CARD_READY = ( ( uint32_t )0x00000001 ), SD_CARD_IDENTIFICATION =
    106       ( ( uint32_t )0x00000002 ), SD_CARD_STANDBY = ( ( uint32_t )0x00000003 ),
    107     SD_CARD_TRANSFER = ( ( uint32_t )0x00000004 ), SD_CARD_SENDING =
    108       ( ( uint32_t )0x00000005 ), SD_CARD_RECEIVING =
    109       ( ( uint32_t )0x00000006 ), SD_CARD_PROGRAMMING =
    110       ( ( uint32_t )0x00000007 ), SD_CARD_DISCONNECTED =
    111       ( ( uint32_t )0x00000008 ), SD_CARD_ERROR = ( ( uint32_t )0x000000FF )
    112   } SDCardState;
    113 
    114   /**
    115    * @brief  Card Specific Data: CSD Register
    116    */
    117   typedef struct
    118   {
    119     __IO uint8_t CSDStruct;      /*!< CSD structure */
    120     __IO uint8_t SysSpecVersion; /*!< System specification version */
    121     __IO uint8_t Reserved1;      /*!< Reserved */
    122     __IO uint8_t TAAC;           /*!< Data read access-time 1 */
    123     __IO uint8_t NSAC;           /*!< Data read access-time 2 in CLK cycles */
    124     __IO uint8_t MaxBusClkFrec;  /*!< Max. bus clock frequency */
    125     __IO uint16_t CardComdClasses; /*!< Card command classes */
    126     __IO uint8_t RdBlockLen;          /*!< Max. read data block length */
    127     __IO uint8_t PartBlockRead;       /*!< Partial blocks for read allowed */
    128     __IO uint8_t WrBlockMisalign;     /*!< Write block misalignment */
    129     __IO uint8_t RdBlockMisalign;     /*!< Read block misalignment */
    130     __IO uint8_t DSRImpl;             /*!< DSR implemented */
    131     __IO uint8_t Reserved2;           /*!< Reserved */
    132     __IO uint32_t DeviceSize;         /*!< Device Size */
    133     __IO uint8_t MaxRdCurrentVDDMin;  /*!< Max. read current @ VDD min */
    134     __IO uint8_t MaxRdCurrentVDDMax;  /*!< Max. read current @ VDD max */
    135     __IO uint8_t MaxWrCurrentVDDMin;  /*!< Max. write current @ VDD min */
    136     __IO uint8_t MaxWrCurrentVDDMax;  /*!< Max. write current @ VDD max */
    137     __IO uint8_t DeviceSizeMul;       /*!< Device size multiplier */
    138     __IO uint8_t EraseGrSize;         /*!< Erase group size */
    139     __IO uint8_t EraseGrMul;          /*!< Erase group size multiplier */
    140     __IO uint8_t WrProtectGrSize;     /*!< Write protect group size */
    141     __IO uint8_t WrProtectGrEnable;   /*!< Write protect group enable */
    142     __IO uint8_t ManDeflECC;          /*!< Manufacturer default ECC */
    143     __IO uint8_t WrSpeedFact;         /*!< Write speed factor */
    144     __IO uint8_t MaxWrBlockLen;       /*!< Max. write data block length */
    145     __IO uint8_t WriteBlockPaPartial; /*!< Partial blocks for write allowed */
    146     __IO uint8_t Reserved3;           /*!< Reserded */
    147     __IO uint8_t ContentProtectAppli; /*!< Content protection application */
    148     __IO uint8_t FileFormatGrouop;    /*!< File format group */
    149     __IO uint8_t CopyFlag;            /*!< Copy flag (OTP) */
    150     __IO uint8_t PermWrProtect;       /*!< Permanent write protection */
    151     __IO uint8_t TempWrProtect;       /*!< Temporary write protection */
    152     __IO uint8_t FileFormat;          /*!< File Format */
    153     __IO uint8_t ECC;                 /*!< ECC code */
    154     __IO uint8_t CSD_CRC;             /*!< CSD CRC */
    155     __IO uint8_t Reserved4;           /*!< always 1*/
    156   } SD_CSD;
    157 
    158   /**
    159    * @brief  Card Identification Data: CID Register
    160    */
    161   typedef struct
    162   {
    163     __IO uint8_t ManufacturerID; /*!< ManufacturerID */
    164     __IO uint16_t OEM_AppliID;   /*!< OEM/Application ID */
    165     __IO uint32_t ProdName1;     /*!< Product Name part1 */
    166     __IO uint8_t ProdName2;      /*!< Product Name part2*/
    167     __IO uint8_t ProdRev;        /*!< Product Revision */
    168     __IO uint32_t ProdSN;        /*!< Product Serial Number */
    169     __IO uint8_t Reserved1;      /*!< Reserved1 */
    170     __IO uint16_t ManufactDate;  /*!< Manufacturing Date */
    171     __IO uint8_t CID_CRC;        /*!< CID CRC */
    172     __IO uint8_t Reserved2;      /*!< always 1 */
    173   } SD_CID;
    174 
    175   /**
    176    * @brief SD Card information
    177    */
    178   typedef struct
    179   {
    180     SD_CSD SD_csd;
    181     SD_CID SD_cid;
    182     uint32_t CardCapacity;  /*!< Card Capacity */
    183     uint32_t CardBlockSize; /*!< Card Block Size */
    184     uint16_t RCA;
    185     uint8_t CardType;
    186   } SD_CardInfo;
    187 
    188   /**
    189    * @brief  SDIO Data Transfer Frequency (25MHz max)
    190    */
    191   #define SDIO_TRANSFER_CLK_DIV            ((uint8_t)0x1)
    192 
    193   #define SD_DETECT_PIN                    GPIO_Pin_14                 /* PB.14 */
    194   #define SD_DETECT_GPIO_PORT              GPIOB                       /* GPIOB */
    195   #define SD_DETECT_GPIO_CLK               RCC_APB2Periph_GPIOB
    196 
    197   /**
    198    * @brief  SDIO Intialization Frequency (400KHz max)
    199    */
    200   #define SDIO_INIT_CLK_DIV                ((uint8_t)0xB2)
    201   #define SDIO_FIFO_ADDRESS                ((uint32_t)0x40018080)
    202 
    203   /**
    204    * @brief SDIO Commands  Index
    205    */
    206   #define SD_CMD_GO_IDLE_STATE                       ((uint8_t)0)
    207   #define SD_CMD_SEND_OP_COND                        ((uint8_t)1)
    208   #define SD_CMD_ALL_SEND_CID                        ((uint8_t)2)
    209   #define SD_CMD_SET_REL_ADDR                        ((uint8_t)3) /*!< SDIO_SEND_REL_ADDR for SD Card */
    210   #define SD_CMD_SET_DSR                             ((uint8_t)4)
    211   #define SD_CMD_SDIO_SEN_OP_COND                    ((uint8_t)5)
    212   #define SD_CMD_HS_SWITCH                           ((uint8_t)6)
    213   #define SD_CMD_SEL_DESEL_CARD                      ((uint8_t)7)
    214   #define SD_CMD_HS_SEND_EXT_CSD                     ((uint8_t)8)
    215   #define SD_CMD_SEND_CSD                            ((uint8_t)9)
    216   #define SD_CMD_SEND_CID                            ((uint8_t)10)
    217   #define SD_CMD_READ_DAT_UNTIL_STOP                 ((uint8_t)11) /*!< SD Card doesn't support it */
    218   #define SD_CMD_STOP_TRANSMISSION                   ((uint8_t)12)
    219   #define SD_CMD_SEND_STATUS                         ((uint8_t)13)
    220   #define SD_CMD_HS_BUSTEST_READ                     ((uint8_t)14)
    221   #define SD_CMD_GO_INACTIVE_STATE                   ((uint8_t)15)
    222   #define SD_CMD_SET_BLOCKLEN                        ((uint8_t)16)
    223   #define SD_CMD_READ_SINGLE_BLOCK                   ((uint8_t)17)
    224   #define SD_CMD_READ_MULT_BLOCK                     ((uint8_t)18)
    225   #define SD_CMD_HS_BUSTEST_WRITE                    ((uint8_t)19)
    226   #define SD_CMD_WRITE_DAT_UNTIL_STOP                ((uint8_t)20) /*!< SD Card doesn't support it */
    227   #define SD_CMD_SET_BLOCK_COUNT                     ((uint8_t)23) /*!< SD Card doesn't support it */
    228   #define SD_CMD_WRITE_SINGLE_BLOCK                  ((uint8_t)24)
    229   #define SD_CMD_WRITE_MULT_BLOCK                    ((uint8_t)25)
    230   #define SD_CMD_PROG_CID                            ((uint8_t)26) /*!< reserved for manufacturers */
    231   #define SD_CMD_PROG_CSD                            ((uint8_t)27)
    232   #define SD_CMD_SET_WRITE_PROT                      ((uint8_t)28)
    233   #define SD_CMD_CLR_WRITE_PROT                      ((uint8_t)29)
    234   #define SD_CMD_SEND_WRITE_PROT                     ((uint8_t)30)
    235   #define SD_CMD_SD_ERASE_GRP_START                  ((uint8_t)32) /*!< To set the address of the first write
    236   block to be erased.( For SD card only )* /
    237     #define SD_CMD_SD_ERASE_GRP_END                    ((uint8_t)33) /*!< To set the address of the last write block of the
    238   continuous range to be erased.( For SD card only )* /
    239     #define SD_CMD_ERASE_GRP_START                     ((uint8_t)35) /*!< To set the address of the first write block to be erased.
    240   ( For MMC card only spec 3.31 )* /
    241 
    242     #define SD_CMD_ERASE_GRP_END                       ((uint8_t)36) /*!< To set the address of the last write block of the
    243   continuous range to be erased.( For MMC card only spec 3.31 )* /
    244 
    245     #define SD_CMD_ERASE                               ((uint8_t)38)
    246     #define SD_CMD_FAST_IO                             ((uint8_t)39) /*!< SD Card doesn't support it */
    247     #define SD_CMD_GO_IRQ_STATE                        ((uint8_t)40) /*!< SD Card doesn't support it */
    248     #define SD_CMD_LOCK_UNLOCK                         ((uint8_t)42)
    249     #define SD_CMD_APP_CMD                             ((uint8_t)55)
    250     #define SD_CMD_GEN_CMD                             ((uint8_t)56)
    251     #define SD_CMD_NO_CMD                              ((uint8_t)64)
    252 
    253     /**
    254      * @brief Following commands are SD Card Specific commands.
    255      *        SDIO_APP_CMD should be sent before sending these commands.
    256      */
    257     #define SD_CMD_APP_SD_SET_BUSWIDTH                 ((uint8_t)6)  /*!< For SD Card only */
    258     #define SD_CMD_SD_APP_STAUS                        ((uint8_t)13) /*!< For SD Card only */
    259     #define SD_CMD_SD_APP_SEND_NUM_WRITE_BLOCKS        ((uint8_t)22) /*!< For SD Card only */
    260     #define SD_CMD_SD_APP_OP_COND                      ((uint8_t)41) /*!< For SD Card only */
    261     #define SD_CMD_SD_APP_SET_CLR_CARD_DETECT          ((uint8_t)42) /*!< For SD Card only */
    262     #define SD_CMD_SD_APP_SEND_SCR                     ((uint8_t)51) /*!< For SD Card only */
    263     #define SD_CMD_SDIO_RW_DIRECT                      ((uint8_t)52) /*!< For SD I/O Card only */
    264     #define SD_CMD_SDIO_RW_EXTENDED                    ((uint8_t)53) /*!< For SD I/O Card only */
    265 
    266     /**
    267      * @brief Following commands are SD Card Specific security commands.
    268      *        SDIO_APP_CMD should be sent before sending these commands.
    269      */
    270     #define SD_CMD_SD_APP_GET_MKB                      ((uint8_t)43) /*!< For SD Card only */
    271     #define SD_CMD_SD_APP_GET_MID                      ((uint8_t)44) /*!< For SD Card only */
    272     #define SD_CMD_SD_APP_SET_CER_RN1                  ((uint8_t)45) /*!< For SD Card only */
    273     #define SD_CMD_SD_APP_GET_CER_RN2                  ((uint8_t)46) /*!< For SD Card only */
    274     #define SD_CMD_SD_APP_SET_CER_RES2                 ((uint8_t)47) /*!< For SD Card only */
    275     #define SD_CMD_SD_APP_GET_CER_RES1                 ((uint8_t)48) /*!< For SD Card only */
    276     #define SD_CMD_SD_APP_SECURE_READ_MULTIPLE_BLOCK   ((uint8_t)18) /*!< For SD Card only */
    277     #define SD_CMD_SD_APP_SECURE_WRITE_MULTIPLE_BLOCK  ((uint8_t)25) /*!< For SD Card only */
    278     #define SD_CMD_SD_APP_SECURE_ERASE                 ((uint8_t)38) /*!< For SD Card only */
    279     #define SD_CMD_SD_APP_CHANGE_SECURE_AREA           ((uint8_t)49) /*!< For SD Card only */
    280     #define SD_CMD_SD_APP_SECURE_WRITE_MKB             ((uint8_t)48) /*!< For SD Card only */
    281 
    282     #define SD_DMA_MODE                                ((uint32_t)0x00000000)
    283     #define SD_INTERRUPT_MODE                          ((uint32_t)0x00000001)
    284     #define SD_POLLING_MODE                            ((uint32_t)0x00000002)
    285 
    286     /**
    287      * @brief  SD detection on its memory slot
    288      */
    289     #define SD_PRESENT                                 ((uint8_t)0x01)
    290     #define SD_NOT_PRESENT                             ((uint8_t)0x00)
    291 
    292     /**
    293      * @brief Supported SD Memory Cards
    294      */
    295     #define SDIO_STD_CAPACITY_SD_CARD_V1_1             ((uint32_t)0x00000000)
    296     #define SDIO_STD_CAPACITY_SD_CARD_V2_0             ((uint32_t)0x00000001)
    297     #define SDIO_HIGH_CAPACITY_SD_CARD                 ((uint32_t)0x00000002)
    298     #define SDIO_MULTIMEDIA_CARD                       ((uint32_t)0x00000003)
    299     #define SDIO_SECURE_DIGITAL_IO_CARD                ((uint32_t)0x00000004)
    300     #define SDIO_HIGH_SPEED_MULTIMEDIA_CARD            ((uint32_t)0x00000005)
    301     #define SDIO_SECURE_DIGITAL_IO_COMBO_CARD          ((uint32_t)0x00000006)
    302     #define SDIO_HIGH_CAPACITY_MMC_CARD                ((uint32_t)0x00000007)
    303 
    304     /* Private function prototypes -----------------------------------------------*/
    305   void SD_DeInit ( void );
    306   SD_Error SD_Init ( void );
    307   SDTransferState SD_GetStatus ( void );
    308   SDCardState SD_GetState ( void );
    309   uint8_t SD_Detect ( void );
    310   SD_Error SD_PowerON ( void );
    311   SD_Error SD_PowerOFF ( void );
    312   SD_Error SD_InitializeCards ( void );
    313   SD_Error SD_GetCardInfo ( SD_CardInfo * cardinfo );
    314   SD_Error SD_EnableWideBusOperation ( uint32_t WideMode );
    315   SD_Error SD_SetDeviceMode ( uint32_t Mode );
    316   SD_Error SD_SelectDeselect ( uint32_t addr );
    317   SD_Error SD_ReadBlock ( uint8_t * readbuff, uint32_t ReadAddr,
    318     uint16_t BlockSize );
    319   SD_Error SD_ReadMultiBlocks ( uint8_t * readbuff, uint32_t ReadAddr,
    320     uint16_t BlockSize, uint32_t NumberOfBlocks );
    321   SD_Error SD_WriteBlock ( uint8_t * writebuff, uint32_t WriteAddr,
    322     uint16_t BlockSize );
    323   SD_Error SD_WriteMultiBlocks ( uint8_t * writebuff, uint32_t WriteAddr,
    324     uint16_t BlockSize, uint32_t NumberOfBlocks );
    325   SDTransferState SD_GetTransferState ( void );
    326   SD_Error SD_StopTransfer ( void );
    327   SD_Error SD_Erase ( uint32_t startaddr, uint32_t endaddr );
    328   SD_Error SD_SendStatus ( uint32_t * pcardstatus );
    329   SD_Error SD_SendSDStatus ( uint32_t * psdstatus );
    330   SD_Error SD_ProcessIRQSrc ( void );
    331 
    332   #ifdef __cplusplus
    333 }
    334 #endif
    335 
    336 #endif /* __SDIO_SD_H */
    337 
    338 /*********************************************************************************************************
    339  END FILE
    340  *********************************************************************************************************/

  • 相关阅读:
    高级查询
    简单查询
    CRUD
    T-SQL语句
    数据库规范
    导出含有特定字符串的注册表
    .net、jquery、ajax、wcf实现数据库用户名检测局部刷新
    数据结构实验之二叉树二:遍历二叉树
    传纸条
    数据结构实验之栈与队列五:下一较大值(一)
  • 原文地址:https://www.cnblogs.com/shangdawei/p/2616818.html
Copyright © 2011-2022 走看看