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 *********************************************************************************************************/