Modified version of the mbed library for use with the Nucleo boards.

Dependents:   EEPROMWrite Full-Project

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Thu Aug 20 10:45:13 2015 +0100
Revision:
613:bc40b8d2aec4
Parent:
532:fe11edbda85c
Synchronized with git revision 92ca8c7b60a283b6bb60eb65b183dac1599f0ade

Full URL: https://github.com/mbedmicro/mbed/commit/92ca8c7b60a283b6bb60eb65b183dac1599f0ade/

Nordic: update application start address in GCC linker script

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 235:685d5f11838f 1 /**
mbed_official 235:685d5f11838f 2 ******************************************************************************
mbed_official 235:685d5f11838f 3 * @file stm32f4xx_hal_sd.c
mbed_official 235:685d5f11838f 4 * @author MCD Application Team
mbed_official 613:bc40b8d2aec4 5 * @version V1.3.2
mbed_official 613:bc40b8d2aec4 6 * @date 26-June-2015
mbed_official 235:685d5f11838f 7 * @brief SD card HAL module driver.
mbed_official 235:685d5f11838f 8 * This file provides firmware functions to manage the following
mbed_official 235:685d5f11838f 9 * functionalities of the Secure Digital (SD) peripheral:
mbed_official 235:685d5f11838f 10 * + Initialization and de-initialization functions
mbed_official 235:685d5f11838f 11 * + IO operation functions
mbed_official 235:685d5f11838f 12 * + Peripheral Control functions
mbed_official 235:685d5f11838f 13 * + Peripheral State functions
mbed_official 235:685d5f11838f 14 *
mbed_official 235:685d5f11838f 15 @verbatim
mbed_official 235:685d5f11838f 16 ==============================================================================
mbed_official 235:685d5f11838f 17 ##### How to use this driver #####
mbed_official 235:685d5f11838f 18 ==============================================================================
mbed_official 235:685d5f11838f 19 [..]
mbed_official 235:685d5f11838f 20 This driver implements a high level communication layer for read and write from/to
mbed_official 235:685d5f11838f 21 this memory. The needed STM32 hardware resources (SDIO and GPIO) are performed by
mbed_official 235:685d5f11838f 22 the user in HAL_SD_MspInit() function (MSP layer).
mbed_official 235:685d5f11838f 23 Basically, the MSP layer configuration should be the same as we provide in the
mbed_official 235:685d5f11838f 24 examples.
mbed_official 235:685d5f11838f 25 You can easily tailor this configuration according to hardware resources.
mbed_official 235:685d5f11838f 26
mbed_official 235:685d5f11838f 27 [..]
mbed_official 235:685d5f11838f 28 This driver is a generic layered driver for SDIO memories which uses the HAL
mbed_official 235:685d5f11838f 29 SDIO driver functions to interface with SD and uSD cards devices.
mbed_official 235:685d5f11838f 30 It is used as follows:
mbed_official 235:685d5f11838f 31
mbed_official 235:685d5f11838f 32 (#)Initialize the SDIO low level resources by implement the HAL_SD_MspInit() API:
mbed_official 532:fe11edbda85c 33 (##) Enable the SDIO interface clock using __HAL_RCC_SDIO_CLK_ENABLE();
mbed_official 235:685d5f11838f 34 (##) SDIO pins configuration for SD card
mbed_official 532:fe11edbda85c 35 (+++) Enable the clock for the SDIO GPIOs using the functions __HAL_RCC_GPIOx_CLK_ENABLE();
mbed_official 235:685d5f11838f 36 (+++) Configure these SDIO pins as alternate function pull-up using HAL_GPIO_Init()
mbed_official 235:685d5f11838f 37 and according to your pin assignment;
mbed_official 235:685d5f11838f 38 (##) DMA Configuration if you need to use DMA process (HAL_SD_ReadBlocks_DMA()
mbed_official 235:685d5f11838f 39 and HAL_SD_WriteBlocks_DMA() APIs).
mbed_official 532:fe11edbda85c 40 (+++) Enable the DMAx interface clock using __HAL_RCC_DMAx_CLK_ENABLE();
mbed_official 235:685d5f11838f 41 (+++) Configure the DMA using the function HAL_DMA_Init() with predeclared and filled.
mbed_official 235:685d5f11838f 42 (##) NVIC configuration if you need to use interrupt process when using DMA transfer.
mbed_official 235:685d5f11838f 43 (+++) Configure the SDIO and DMA interrupt priorities using functions
mbed_official 235:685d5f11838f 44 HAL_NVIC_SetPriority(); DMA priority is superior to SDIO's priority
mbed_official 235:685d5f11838f 45 (+++) Enable the NVIC DMA and SDIO IRQs using function HAL_NVIC_EnableIRQ()
mbed_official 235:685d5f11838f 46 (+++) SDIO interrupts are managed using the macros __HAL_SD_SDIO_ENABLE_IT()
mbed_official 235:685d5f11838f 47 and __HAL_SD_SDIO_DISABLE_IT() inside the communication process.
mbed_official 235:685d5f11838f 48 (+++) SDIO interrupts pending bits are managed using the macros __HAL_SD_SDIO_GET_IT()
mbed_official 235:685d5f11838f 49 and __HAL_SD_SDIO_CLEAR_IT()
mbed_official 235:685d5f11838f 50 (#) At this stage, you can perform SD read/write/erase operations after SD card initialization
mbed_official 235:685d5f11838f 51
mbed_official 235:685d5f11838f 52
mbed_official 235:685d5f11838f 53 *** SD Card Initialization and configuration ***
mbed_official 235:685d5f11838f 54 ================================================
mbed_official 235:685d5f11838f 55 [..]
mbed_official 235:685d5f11838f 56 To initialize the SD Card, use the HAL_SD_Init() function. It Initializes
mbed_official 532:fe11edbda85c 57 the SD Card and put it into Standby State (Ready for data transfer).
mbed_official 235:685d5f11838f 58 This function provide the following operations:
mbed_official 235:685d5f11838f 59
mbed_official 235:685d5f11838f 60 (#) Apply the SD Card initialization process at 400KHz and check the SD Card
mbed_official 235:685d5f11838f 61 type (Standard Capacity or High Capacity). You can change or adapt this
mbed_official 235:685d5f11838f 62 frequency by adjusting the "ClockDiv" field.
mbed_official 235:685d5f11838f 63 The SD Card frequency (SDIO_CK) is computed as follows:
mbed_official 235:685d5f11838f 64
mbed_official 235:685d5f11838f 65 SDIO_CK = SDIOCLK / (ClockDiv + 2)
mbed_official 235:685d5f11838f 66
mbed_official 235:685d5f11838f 67 In initialization mode and according to the SD Card standard,
mbed_official 235:685d5f11838f 68 make sure that the SDIO_CK frequency doesn't exceed 400KHz.
mbed_official 235:685d5f11838f 69
mbed_official 235:685d5f11838f 70 (#) Get the SD CID and CSD data. All these information are managed by the SDCardInfo
mbed_official 235:685d5f11838f 71 structure. This structure provide also ready computed SD Card capacity
mbed_official 235:685d5f11838f 72 and Block size.
mbed_official 235:685d5f11838f 73
mbed_official 235:685d5f11838f 74 -@- These information are stored in SD handle structure in case of future use.
mbed_official 235:685d5f11838f 75
mbed_official 235:685d5f11838f 76 (#) Configure the SD Card Data transfer frequency. By Default, the card transfer
mbed_official 235:685d5f11838f 77 frequency is set to 24MHz. You can change or adapt this frequency by adjusting
mbed_official 235:685d5f11838f 78 the "ClockDiv" field.
mbed_official 235:685d5f11838f 79 In transfer mode and according to the SD Card standard, make sure that the
mbed_official 235:685d5f11838f 80 SDIO_CK frequency doesn't exceed 25MHz and 50MHz in High-speed mode switch.
mbed_official 235:685d5f11838f 81 To be able to use a frequency higher than 24MHz, you should use the SDIO
mbed_official 235:685d5f11838f 82 peripheral in bypass mode. Refer to the corresponding reference manual
mbed_official 235:685d5f11838f 83 for more details.
mbed_official 235:685d5f11838f 84
mbed_official 235:685d5f11838f 85 (#) Select the corresponding SD Card according to the address read with the step 2.
mbed_official 235:685d5f11838f 86
mbed_official 235:685d5f11838f 87 (#) Configure the SD Card in wide bus mode: 4-bits data.
mbed_official 235:685d5f11838f 88
mbed_official 235:685d5f11838f 89 *** SD Card Read operation ***
mbed_official 235:685d5f11838f 90 ==============================
mbed_official 235:685d5f11838f 91 [..]
mbed_official 235:685d5f11838f 92 (+) You can read from SD card in polling mode by using function HAL_SD_ReadBlocks().
mbed_official 532:fe11edbda85c 93 This function support only 512-bytes block length (the block size should be
mbed_official 532:fe11edbda85c 94 chosen as 512 bytes).
mbed_official 235:685d5f11838f 95 You can choose either one block read operation or multiple block read operation
mbed_official 235:685d5f11838f 96 by adjusting the "NumberOfBlocks" parameter.
mbed_official 235:685d5f11838f 97
mbed_official 235:685d5f11838f 98 (+) You can read from SD card in DMA mode by using function HAL_SD_ReadBlocks_DMA().
mbed_official 532:fe11edbda85c 99 This function support only 512-bytes block length (the block size should be
mbed_official 532:fe11edbda85c 100 chosen as 512 bytes).
mbed_official 235:685d5f11838f 101 You can choose either one block read operation or multiple block read operation
mbed_official 235:685d5f11838f 102 by adjusting the "NumberOfBlocks" parameter.
mbed_official 235:685d5f11838f 103 After this, you have to call the function HAL_SD_CheckReadOperation(), to insure
mbed_official 235:685d5f11838f 104 that the read transfer is done correctly in both DMA and SD sides.
mbed_official 235:685d5f11838f 105
mbed_official 235:685d5f11838f 106 *** SD Card Write operation ***
mbed_official 235:685d5f11838f 107 ===============================
mbed_official 235:685d5f11838f 108 [..]
mbed_official 235:685d5f11838f 109 (+) You can write to SD card in polling mode by using function HAL_SD_WriteBlocks().
mbed_official 532:fe11edbda85c 110 This function support only 512-bytes block length (the block size should be
mbed_official 532:fe11edbda85c 111 chosen as 512 bytes).
mbed_official 235:685d5f11838f 112 You can choose either one block read operation or multiple block read operation
mbed_official 235:685d5f11838f 113 by adjusting the "NumberOfBlocks" parameter.
mbed_official 235:685d5f11838f 114
mbed_official 235:685d5f11838f 115 (+) You can write to SD card in DMA mode by using function HAL_SD_WriteBlocks_DMA().
mbed_official 532:fe11edbda85c 116 This function support only 512-bytes block length (the block size should be
mbed_official 235:685d5f11838f 117 chosen as 512 byte).
mbed_official 235:685d5f11838f 118 You can choose either one block read operation or multiple block read operation
mbed_official 235:685d5f11838f 119 by adjusting the "NumberOfBlocks" parameter.
mbed_official 235:685d5f11838f 120 After this, you have to call the function HAL_SD_CheckWriteOperation(), to insure
mbed_official 235:685d5f11838f 121 that the write transfer is done correctly in both DMA and SD sides.
mbed_official 235:685d5f11838f 122
mbed_official 235:685d5f11838f 123 *** SD card status ***
mbed_official 235:685d5f11838f 124 ======================
mbed_official 235:685d5f11838f 125 [..]
mbed_official 235:685d5f11838f 126 (+) At any time, you can check the SD Card status and get the SD card state
mbed_official 235:685d5f11838f 127 by using the HAL_SD_GetStatus() function. This function checks first if the
mbed_official 235:685d5f11838f 128 SD card is still connected and then get the internal SD Card transfer state.
mbed_official 235:685d5f11838f 129 (+) You can also get the SD card SD Status register by using the HAL_SD_SendSDStatus()
mbed_official 235:685d5f11838f 130 function.
mbed_official 235:685d5f11838f 131
mbed_official 235:685d5f11838f 132 *** SD HAL driver macros list ***
mbed_official 235:685d5f11838f 133 ==================================
mbed_official 235:685d5f11838f 134 [..]
mbed_official 235:685d5f11838f 135 Below the list of most used macros in SD HAL driver.
mbed_official 532:fe11edbda85c 136
mbed_official 235:685d5f11838f 137 (+) __HAL_SD_SDIO_ENABLE : Enable the SD device
mbed_official 235:685d5f11838f 138 (+) __HAL_SD_SDIO_DISABLE : Disable the SD device
mbed_official 235:685d5f11838f 139 (+) __HAL_SD_SDIO_DMA_ENABLE: Enable the SDIO DMA transfer
mbed_official 235:685d5f11838f 140 (+) __HAL_SD_SDIO_DMA_DISABLE: Disable the SDIO DMA transfer
mbed_official 235:685d5f11838f 141 (+) __HAL_SD_SDIO_ENABLE_IT: Enable the SD device interrupt
mbed_official 235:685d5f11838f 142 (+) __HAL_SD_SDIO_DISABLE_IT: Disable the SD device interrupt
mbed_official 235:685d5f11838f 143 (+) __HAL_SD_SDIO_GET_FLAG:Check whether the specified SD flag is set or not
mbed_official 235:685d5f11838f 144 (+) __HAL_SD_SDIO_CLEAR_FLAG: Clear the SD's pending flags
mbed_official 235:685d5f11838f 145
mbed_official 235:685d5f11838f 146 (@) You can refer to the SD HAL driver header file for more useful macros
mbed_official 235:685d5f11838f 147
mbed_official 235:685d5f11838f 148 @endverbatim
mbed_official 235:685d5f11838f 149 ******************************************************************************
mbed_official 235:685d5f11838f 150 * @attention
mbed_official 235:685d5f11838f 151 *
mbed_official 532:fe11edbda85c 152 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
mbed_official 235:685d5f11838f 153 *
mbed_official 235:685d5f11838f 154 * Redistribution and use in source and binary forms, with or without modification,
mbed_official 235:685d5f11838f 155 * are permitted provided that the following conditions are met:
mbed_official 235:685d5f11838f 156 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 235:685d5f11838f 157 * this list of conditions and the following disclaimer.
mbed_official 235:685d5f11838f 158 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 235:685d5f11838f 159 * this list of conditions and the following disclaimer in the documentation
mbed_official 235:685d5f11838f 160 * and/or other materials provided with the distribution.
mbed_official 235:685d5f11838f 161 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 235:685d5f11838f 162 * may be used to endorse or promote products derived from this software
mbed_official 235:685d5f11838f 163 * without specific prior written permission.
mbed_official 235:685d5f11838f 164 *
mbed_official 235:685d5f11838f 165 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 235:685d5f11838f 166 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 235:685d5f11838f 167 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 235:685d5f11838f 168 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 235:685d5f11838f 169 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 235:685d5f11838f 170 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 235:685d5f11838f 171 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 235:685d5f11838f 172 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 235:685d5f11838f 173 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 235:685d5f11838f 174 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 235:685d5f11838f 175 *
mbed_official 235:685d5f11838f 176 ******************************************************************************
mbed_official 235:685d5f11838f 177 */
mbed_official 235:685d5f11838f 178
mbed_official 235:685d5f11838f 179 /* Includes ------------------------------------------------------------------*/
mbed_official 235:685d5f11838f 180 #include "stm32f4xx_hal.h"
mbed_official 235:685d5f11838f 181
mbed_official 532:fe11edbda85c 182 #ifdef HAL_SD_MODULE_ENABLED
mbed_official 532:fe11edbda85c 183
mbed_official 235:685d5f11838f 184 /** @addtogroup STM32F4xx_HAL_Driver
mbed_official 235:685d5f11838f 185 * @{
mbed_official 235:685d5f11838f 186 */
mbed_official 235:685d5f11838f 187
mbed_official 532:fe11edbda85c 188 /** @addtogroup SD
mbed_official 235:685d5f11838f 189 * @{
mbed_official 235:685d5f11838f 190 */
mbed_official 235:685d5f11838f 191
mbed_official 235:685d5f11838f 192 /* Private typedef -----------------------------------------------------------*/
mbed_official 235:685d5f11838f 193 /* Private define ------------------------------------------------------------*/
mbed_official 532:fe11edbda85c 194 /** @addtogroup SD_Private_Defines
mbed_official 235:685d5f11838f 195 * @{
mbed_official 235:685d5f11838f 196 */
mbed_official 235:685d5f11838f 197 /**
mbed_official 532:fe11edbda85c 198 * @brief SDIO Data block size
mbed_official 532:fe11edbda85c 199 */
mbed_official 532:fe11edbda85c 200 #define DATA_BLOCK_SIZE ((uint32_t)(9 << 4))
mbed_official 532:fe11edbda85c 201 /**
mbed_official 532:fe11edbda85c 202 * @brief SDIO Static flags, Timeout, FIFO Address
mbed_official 235:685d5f11838f 203 */
mbed_official 235:685d5f11838f 204 #define SDIO_STATIC_FLAGS ((uint32_t)(SDIO_FLAG_CCRCFAIL | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_CTIMEOUT |\
mbed_official 235:685d5f11838f 205 SDIO_FLAG_DTIMEOUT | SDIO_FLAG_TXUNDERR | SDIO_FLAG_RXOVERR |\
mbed_official 235:685d5f11838f 206 SDIO_FLAG_CMDREND | SDIO_FLAG_CMDSENT | SDIO_FLAG_DATAEND |\
mbed_official 235:685d5f11838f 207 SDIO_FLAG_DBCKEND))
mbed_official 235:685d5f11838f 208
mbed_official 235:685d5f11838f 209 #define SDIO_CMD0TIMEOUT ((uint32_t)0x00010000)
mbed_official 235:685d5f11838f 210
mbed_official 235:685d5f11838f 211 /**
mbed_official 235:685d5f11838f 212 * @brief Mask for errors Card Status R1 (OCR Register)
mbed_official 235:685d5f11838f 213 */
mbed_official 235:685d5f11838f 214 #define SD_OCR_ADDR_OUT_OF_RANGE ((uint32_t)0x80000000)
mbed_official 235:685d5f11838f 215 #define SD_OCR_ADDR_MISALIGNED ((uint32_t)0x40000000)
mbed_official 235:685d5f11838f 216 #define SD_OCR_BLOCK_LEN_ERR ((uint32_t)0x20000000)
mbed_official 235:685d5f11838f 217 #define SD_OCR_ERASE_SEQ_ERR ((uint32_t)0x10000000)
mbed_official 235:685d5f11838f 218 #define SD_OCR_BAD_ERASE_PARAM ((uint32_t)0x08000000)
mbed_official 235:685d5f11838f 219 #define SD_OCR_WRITE_PROT_VIOLATION ((uint32_t)0x04000000)
mbed_official 235:685d5f11838f 220 #define SD_OCR_LOCK_UNLOCK_FAILED ((uint32_t)0x01000000)
mbed_official 235:685d5f11838f 221 #define SD_OCR_COM_CRC_FAILED ((uint32_t)0x00800000)
mbed_official 235:685d5f11838f 222 #define SD_OCR_ILLEGAL_CMD ((uint32_t)0x00400000)
mbed_official 235:685d5f11838f 223 #define SD_OCR_CARD_ECC_FAILED ((uint32_t)0x00200000)
mbed_official 235:685d5f11838f 224 #define SD_OCR_CC_ERROR ((uint32_t)0x00100000)
mbed_official 235:685d5f11838f 225 #define SD_OCR_GENERAL_UNKNOWN_ERROR ((uint32_t)0x00080000)
mbed_official 235:685d5f11838f 226 #define SD_OCR_STREAM_READ_UNDERRUN ((uint32_t)0x00040000)
mbed_official 235:685d5f11838f 227 #define SD_OCR_STREAM_WRITE_OVERRUN ((uint32_t)0x00020000)
mbed_official 532:fe11edbda85c 228 #define SD_OCR_CID_CSD_OVERWRITE ((uint32_t)0x00010000)
mbed_official 235:685d5f11838f 229 #define SD_OCR_WP_ERASE_SKIP ((uint32_t)0x00008000)
mbed_official 235:685d5f11838f 230 #define SD_OCR_CARD_ECC_DISABLED ((uint32_t)0x00004000)
mbed_official 235:685d5f11838f 231 #define SD_OCR_ERASE_RESET ((uint32_t)0x00002000)
mbed_official 235:685d5f11838f 232 #define SD_OCR_AKE_SEQ_ERROR ((uint32_t)0x00000008)
mbed_official 235:685d5f11838f 233 #define SD_OCR_ERRORBITS ((uint32_t)0xFDFFE008)
mbed_official 235:685d5f11838f 234
mbed_official 235:685d5f11838f 235 /**
mbed_official 235:685d5f11838f 236 * @brief Masks for R6 Response
mbed_official 235:685d5f11838f 237 */
mbed_official 235:685d5f11838f 238 #define SD_R6_GENERAL_UNKNOWN_ERROR ((uint32_t)0x00002000)
mbed_official 235:685d5f11838f 239 #define SD_R6_ILLEGAL_CMD ((uint32_t)0x00004000)
mbed_official 235:685d5f11838f 240 #define SD_R6_COM_CRC_FAILED ((uint32_t)0x00008000)
mbed_official 235:685d5f11838f 241
mbed_official 235:685d5f11838f 242 #define SD_VOLTAGE_WINDOW_SD ((uint32_t)0x80100000)
mbed_official 235:685d5f11838f 243 #define SD_HIGH_CAPACITY ((uint32_t)0x40000000)
mbed_official 235:685d5f11838f 244 #define SD_STD_CAPACITY ((uint32_t)0x00000000)
mbed_official 235:685d5f11838f 245 #define SD_CHECK_PATTERN ((uint32_t)0x000001AA)
mbed_official 235:685d5f11838f 246
mbed_official 235:685d5f11838f 247 #define SD_MAX_VOLT_TRIAL ((uint32_t)0x0000FFFF)
mbed_official 235:685d5f11838f 248 #define SD_ALLZERO ((uint32_t)0x00000000)
mbed_official 235:685d5f11838f 249
mbed_official 235:685d5f11838f 250 #define SD_WIDE_BUS_SUPPORT ((uint32_t)0x00040000)
mbed_official 235:685d5f11838f 251 #define SD_SINGLE_BUS_SUPPORT ((uint32_t)0x00010000)
mbed_official 235:685d5f11838f 252 #define SD_CARD_LOCKED ((uint32_t)0x02000000)
mbed_official 235:685d5f11838f 253
mbed_official 235:685d5f11838f 254 #define SD_DATATIMEOUT ((uint32_t)0xFFFFFFFF)
mbed_official 235:685d5f11838f 255 #define SD_0TO7BITS ((uint32_t)0x000000FF)
mbed_official 235:685d5f11838f 256 #define SD_8TO15BITS ((uint32_t)0x0000FF00)
mbed_official 235:685d5f11838f 257 #define SD_16TO23BITS ((uint32_t)0x00FF0000)
mbed_official 235:685d5f11838f 258 #define SD_24TO31BITS ((uint32_t)0xFF000000)
mbed_official 235:685d5f11838f 259 #define SD_MAX_DATA_LENGTH ((uint32_t)0x01FFFFFF)
mbed_official 235:685d5f11838f 260
mbed_official 235:685d5f11838f 261 #define SD_HALFFIFO ((uint32_t)0x00000008)
mbed_official 235:685d5f11838f 262 #define SD_HALFFIFOBYTES ((uint32_t)0x00000020)
mbed_official 235:685d5f11838f 263
mbed_official 235:685d5f11838f 264 /**
mbed_official 235:685d5f11838f 265 * @brief Command Class Supported
mbed_official 235:685d5f11838f 266 */
mbed_official 235:685d5f11838f 267 #define SD_CCCC_LOCK_UNLOCK ((uint32_t)0x00000080)
mbed_official 235:685d5f11838f 268 #define SD_CCCC_WRITE_PROT ((uint32_t)0x00000040)
mbed_official 235:685d5f11838f 269 #define SD_CCCC_ERASE ((uint32_t)0x00000020)
mbed_official 235:685d5f11838f 270
mbed_official 235:685d5f11838f 271 /**
mbed_official 235:685d5f11838f 272 * @brief Following commands are SD Card Specific commands.
mbed_official 235:685d5f11838f 273 * SDIO_APP_CMD should be sent before sending these commands.
mbed_official 235:685d5f11838f 274 */
mbed_official 235:685d5f11838f 275 #define SD_SDIO_SEND_IF_COND ((uint32_t)SD_CMD_HS_SEND_EXT_CSD)
mbed_official 532:fe11edbda85c 276
mbed_official 235:685d5f11838f 277 /**
mbed_official 235:685d5f11838f 278 * @}
mbed_official 235:685d5f11838f 279 */
mbed_official 235:685d5f11838f 280
mbed_official 235:685d5f11838f 281 /* Private macro -------------------------------------------------------------*/
mbed_official 235:685d5f11838f 282 /* Private variables ---------------------------------------------------------*/
mbed_official 235:685d5f11838f 283 /* Private function prototypes -----------------------------------------------*/
mbed_official 532:fe11edbda85c 284 /** @addtogroup SD_Private_Functions_Prototypes
mbed_official 235:685d5f11838f 285 * @{
mbed_official 235:685d5f11838f 286 */
mbed_official 235:685d5f11838f 287 static HAL_SD_ErrorTypedef SD_Initialize_Cards(SD_HandleTypeDef *hsd);
mbed_official 235:685d5f11838f 288 static HAL_SD_ErrorTypedef SD_Select_Deselect(SD_HandleTypeDef *hsd, uint64_t addr);
mbed_official 235:685d5f11838f 289 static HAL_SD_ErrorTypedef SD_PowerON(SD_HandleTypeDef *hsd);
mbed_official 235:685d5f11838f 290 static HAL_SD_ErrorTypedef SD_PowerOFF(SD_HandleTypeDef *hsd);
mbed_official 235:685d5f11838f 291 static HAL_SD_ErrorTypedef SD_SendStatus(SD_HandleTypeDef *hsd, uint32_t *pCardStatus);
mbed_official 235:685d5f11838f 292 static HAL_SD_CardStateTypedef SD_GetState(SD_HandleTypeDef *hsd);
mbed_official 235:685d5f11838f 293 static HAL_SD_ErrorTypedef SD_IsCardProgramming(SD_HandleTypeDef *hsd, uint8_t *pStatus);
mbed_official 235:685d5f11838f 294 static HAL_SD_ErrorTypedef SD_CmdError(SD_HandleTypeDef *hsd);
mbed_official 235:685d5f11838f 295 static HAL_SD_ErrorTypedef SD_CmdResp1Error(SD_HandleTypeDef *hsd, uint8_t SD_CMD);
mbed_official 235:685d5f11838f 296 static HAL_SD_ErrorTypedef SD_CmdResp7Error(SD_HandleTypeDef *hsd);
mbed_official 235:685d5f11838f 297 static HAL_SD_ErrorTypedef SD_CmdResp3Error(SD_HandleTypeDef *hsd);
mbed_official 235:685d5f11838f 298 static HAL_SD_ErrorTypedef SD_CmdResp2Error(SD_HandleTypeDef *hsd);
mbed_official 235:685d5f11838f 299 static HAL_SD_ErrorTypedef SD_CmdResp6Error(SD_HandleTypeDef *hsd, uint8_t SD_CMD, uint16_t *pRCA);
mbed_official 235:685d5f11838f 300 static HAL_SD_ErrorTypedef SD_WideBus_Enable(SD_HandleTypeDef *hsd);
mbed_official 235:685d5f11838f 301 static HAL_SD_ErrorTypedef SD_WideBus_Disable(SD_HandleTypeDef *hsd);
mbed_official 235:685d5f11838f 302 static HAL_SD_ErrorTypedef SD_FindSCR(SD_HandleTypeDef *hsd, uint32_t *pSCR);
mbed_official 235:685d5f11838f 303 static void SD_DMA_RxCplt(DMA_HandleTypeDef *hdma);
mbed_official 235:685d5f11838f 304 static void SD_DMA_RxError(DMA_HandleTypeDef *hdma);
mbed_official 235:685d5f11838f 305 static void SD_DMA_TxCplt(DMA_HandleTypeDef *hdma);
mbed_official 235:685d5f11838f 306 static void SD_DMA_TxError(DMA_HandleTypeDef *hdma);
mbed_official 235:685d5f11838f 307 /**
mbed_official 235:685d5f11838f 308 * @}
mbed_official 235:685d5f11838f 309 */
mbed_official 532:fe11edbda85c 310 /* Exported functions --------------------------------------------------------*/
mbed_official 532:fe11edbda85c 311 /** @addtogroup SD_Exported_Functions
mbed_official 235:685d5f11838f 312 * @{
mbed_official 235:685d5f11838f 313 */
mbed_official 235:685d5f11838f 314
mbed_official 532:fe11edbda85c 315 /** @addtogroup SD_Exported_Functions_Group1
mbed_official 532:fe11edbda85c 316 * @brief Initialization and de-initialization functions
mbed_official 235:685d5f11838f 317 *
mbed_official 532:fe11edbda85c 318 @verbatim
mbed_official 235:685d5f11838f 319 ==============================================================================
mbed_official 235:685d5f11838f 320 ##### Initialization and de-initialization functions #####
mbed_official 235:685d5f11838f 321 ==============================================================================
mbed_official 235:685d5f11838f 322 [..]
mbed_official 235:685d5f11838f 323 This section provides functions allowing to initialize/de-initialize the SD
mbed_official 235:685d5f11838f 324 card device to be ready for use.
mbed_official 235:685d5f11838f 325
mbed_official 235:685d5f11838f 326
mbed_official 235:685d5f11838f 327 @endverbatim
mbed_official 235:685d5f11838f 328 * @{
mbed_official 235:685d5f11838f 329 */
mbed_official 235:685d5f11838f 330
mbed_official 235:685d5f11838f 331 /**
mbed_official 235:685d5f11838f 332 * @brief Initializes the SD card according to the specified parameters in the
mbed_official 235:685d5f11838f 333 SD_HandleTypeDef and create the associated handle.
mbed_official 235:685d5f11838f 334 * @param hsd: SD handle
mbed_official 235:685d5f11838f 335 * @param SDCardInfo: HAL_SD_CardInfoTypedef structure for SD card information
mbed_official 235:685d5f11838f 336 * @retval HAL SD error state
mbed_official 235:685d5f11838f 337 */
mbed_official 235:685d5f11838f 338 HAL_SD_ErrorTypedef HAL_SD_Init(SD_HandleTypeDef *hsd, HAL_SD_CardInfoTypedef *SDCardInfo)
mbed_official 235:685d5f11838f 339 {
mbed_official 235:685d5f11838f 340 __IO HAL_SD_ErrorTypedef errorstate = SD_OK;
mbed_official 235:685d5f11838f 341 SD_InitTypeDef tmpinit;
mbed_official 235:685d5f11838f 342
mbed_official 532:fe11edbda85c 343 /* Allocate lock resource and initialize it */
mbed_official 532:fe11edbda85c 344 hsd->Lock = HAL_UNLOCKED;
mbed_official 235:685d5f11838f 345 /* Initialize the low level hardware (MSP) */
mbed_official 235:685d5f11838f 346 HAL_SD_MspInit(hsd);
mbed_official 235:685d5f11838f 347
mbed_official 235:685d5f11838f 348 /* Default SDIO peripheral configuration for SD card initialization */
mbed_official 235:685d5f11838f 349 tmpinit.ClockEdge = SDIO_CLOCK_EDGE_RISING;
mbed_official 235:685d5f11838f 350 tmpinit.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;
mbed_official 235:685d5f11838f 351 tmpinit.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;
mbed_official 235:685d5f11838f 352 tmpinit.BusWide = SDIO_BUS_WIDE_1B;
mbed_official 235:685d5f11838f 353 tmpinit.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
mbed_official 235:685d5f11838f 354 tmpinit.ClockDiv = SDIO_INIT_CLK_DIV;
mbed_official 235:685d5f11838f 355
mbed_official 235:685d5f11838f 356 /* Initialize SDIO peripheral interface with default configuration */
mbed_official 235:685d5f11838f 357 SDIO_Init(hsd->Instance, tmpinit);
mbed_official 235:685d5f11838f 358
mbed_official 235:685d5f11838f 359 /* Identify card operating voltage */
mbed_official 235:685d5f11838f 360 errorstate = SD_PowerON(hsd);
mbed_official 235:685d5f11838f 361
mbed_official 235:685d5f11838f 362 if(errorstate != SD_OK)
mbed_official 235:685d5f11838f 363 {
mbed_official 235:685d5f11838f 364 return errorstate;
mbed_official 235:685d5f11838f 365 }
mbed_official 235:685d5f11838f 366
mbed_official 235:685d5f11838f 367 /* Initialize the present SDIO card(s) and put them in idle state */
mbed_official 235:685d5f11838f 368 errorstate = SD_Initialize_Cards(hsd);
mbed_official 235:685d5f11838f 369
mbed_official 235:685d5f11838f 370 if (errorstate != SD_OK)
mbed_official 235:685d5f11838f 371 {
mbed_official 235:685d5f11838f 372 return errorstate;
mbed_official 235:685d5f11838f 373 }
mbed_official 235:685d5f11838f 374
mbed_official 235:685d5f11838f 375 /* Read CSD/CID MSD registers */
mbed_official 235:685d5f11838f 376 errorstate = HAL_SD_Get_CardInfo(hsd, SDCardInfo);
mbed_official 235:685d5f11838f 377
mbed_official 235:685d5f11838f 378 if (errorstate == SD_OK)
mbed_official 235:685d5f11838f 379 {
mbed_official 235:685d5f11838f 380 /* Select the Card */
mbed_official 235:685d5f11838f 381 errorstate = SD_Select_Deselect(hsd, (uint32_t)(((uint32_t)SDCardInfo->RCA) << 16));
mbed_official 235:685d5f11838f 382 }
mbed_official 235:685d5f11838f 383
mbed_official 235:685d5f11838f 384 /* Configure SDIO peripheral interface */
mbed_official 235:685d5f11838f 385 SDIO_Init(hsd->Instance, hsd->Init);
mbed_official 235:685d5f11838f 386
mbed_official 235:685d5f11838f 387 return errorstate;
mbed_official 235:685d5f11838f 388 }
mbed_official 235:685d5f11838f 389
mbed_official 235:685d5f11838f 390 /**
mbed_official 235:685d5f11838f 391 * @brief De-Initializes the SD card.
mbed_official 235:685d5f11838f 392 * @param hsd: SD handle
mbed_official 235:685d5f11838f 393 * @retval HAL status
mbed_official 235:685d5f11838f 394 */
mbed_official 235:685d5f11838f 395 HAL_StatusTypeDef HAL_SD_DeInit(SD_HandleTypeDef *hsd)
mbed_official 235:685d5f11838f 396 {
mbed_official 235:685d5f11838f 397
mbed_official 235:685d5f11838f 398 /* Set SD power state to off */
mbed_official 235:685d5f11838f 399 SD_PowerOFF(hsd);
mbed_official 235:685d5f11838f 400
mbed_official 235:685d5f11838f 401 /* De-Initialize the MSP layer */
mbed_official 235:685d5f11838f 402 HAL_SD_MspDeInit(hsd);
mbed_official 235:685d5f11838f 403
mbed_official 235:685d5f11838f 404 return HAL_OK;
mbed_official 235:685d5f11838f 405 }
mbed_official 235:685d5f11838f 406
mbed_official 235:685d5f11838f 407
mbed_official 235:685d5f11838f 408 /**
mbed_official 235:685d5f11838f 409 * @brief Initializes the SD MSP.
mbed_official 235:685d5f11838f 410 * @param hsd: SD handle
mbed_official 235:685d5f11838f 411 * @retval None
mbed_official 235:685d5f11838f 412 */
mbed_official 235:685d5f11838f 413 __weak void HAL_SD_MspInit(SD_HandleTypeDef *hsd)
mbed_official 235:685d5f11838f 414 {
mbed_official 235:685d5f11838f 415 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 235:685d5f11838f 416 the HAL_SD_MspInit could be implemented in the user file
mbed_official 235:685d5f11838f 417 */
mbed_official 235:685d5f11838f 418 }
mbed_official 235:685d5f11838f 419
mbed_official 235:685d5f11838f 420 /**
mbed_official 235:685d5f11838f 421 * @brief De-Initialize SD MSP.
mbed_official 235:685d5f11838f 422 * @param hsd: SD handle
mbed_official 235:685d5f11838f 423 * @retval None
mbed_official 235:685d5f11838f 424 */
mbed_official 235:685d5f11838f 425 __weak void HAL_SD_MspDeInit(SD_HandleTypeDef *hsd)
mbed_official 235:685d5f11838f 426 {
mbed_official 235:685d5f11838f 427 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 235:685d5f11838f 428 the HAL_SD_MspDeInit could be implemented in the user file
mbed_official 235:685d5f11838f 429 */
mbed_official 235:685d5f11838f 430 }
mbed_official 235:685d5f11838f 431
mbed_official 235:685d5f11838f 432 /**
mbed_official 235:685d5f11838f 433 * @}
mbed_official 235:685d5f11838f 434 */
mbed_official 235:685d5f11838f 435
mbed_official 532:fe11edbda85c 436 /** @addtogroup SD_Exported_Functions_Group2
mbed_official 235:685d5f11838f 437 * @brief Data transfer functions
mbed_official 235:685d5f11838f 438 *
mbed_official 235:685d5f11838f 439 @verbatim
mbed_official 235:685d5f11838f 440 ==============================================================================
mbed_official 235:685d5f11838f 441 ##### IO operation functions #####
mbed_official 235:685d5f11838f 442 ==============================================================================
mbed_official 235:685d5f11838f 443 [..]
mbed_official 235:685d5f11838f 444 This subsection provides a set of functions allowing to manage the data
mbed_official 235:685d5f11838f 445 transfer from/to SD card.
mbed_official 235:685d5f11838f 446
mbed_official 235:685d5f11838f 447 @endverbatim
mbed_official 235:685d5f11838f 448 * @{
mbed_official 235:685d5f11838f 449 */
mbed_official 235:685d5f11838f 450
mbed_official 235:685d5f11838f 451 /**
mbed_official 235:685d5f11838f 452 * @brief Reads block(s) from a specified address in a card. The Data transfer
mbed_official 235:685d5f11838f 453 * is managed by polling mode.
mbed_official 235:685d5f11838f 454 * @param hsd: SD handle
mbed_official 235:685d5f11838f 455 * @param pReadBuffer: pointer to the buffer that will contain the received data
mbed_official 235:685d5f11838f 456 * @param ReadAddr: Address from where data is to be read
mbed_official 235:685d5f11838f 457 * @param BlockSize: SD card Data block size
mbed_official 532:fe11edbda85c 458 * @note BlockSize must be 512 bytes.
mbed_official 235:685d5f11838f 459 * @param NumberOfBlocks: Number of SD blocks to read
mbed_official 235:685d5f11838f 460 * @retval SD Card error state
mbed_official 235:685d5f11838f 461 */
mbed_official 235:685d5f11838f 462 HAL_SD_ErrorTypedef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint64_t ReadAddr, uint32_t BlockSize, uint32_t NumberOfBlocks)
mbed_official 235:685d5f11838f 463 {
mbed_official 235:685d5f11838f 464 SDIO_CmdInitTypeDef sdio_cmdinitstructure;
mbed_official 235:685d5f11838f 465 SDIO_DataInitTypeDef sdio_datainitstructure;
mbed_official 235:685d5f11838f 466 HAL_SD_ErrorTypedef errorstate = SD_OK;
mbed_official 235:685d5f11838f 467 uint32_t count = 0, *tempbuff = (uint32_t *)pReadBuffer;
mbed_official 235:685d5f11838f 468
mbed_official 235:685d5f11838f 469 /* Initialize data control register */
mbed_official 235:685d5f11838f 470 hsd->Instance->DCTRL = 0;
mbed_official 235:685d5f11838f 471
mbed_official 235:685d5f11838f 472 if (hsd->CardType == HIGH_CAPACITY_SD_CARD)
mbed_official 235:685d5f11838f 473 {
mbed_official 235:685d5f11838f 474 BlockSize = 512;
mbed_official 235:685d5f11838f 475 ReadAddr /= 512;
mbed_official 235:685d5f11838f 476 }
mbed_official 235:685d5f11838f 477
mbed_official 235:685d5f11838f 478 /* Set Block Size for Card */
mbed_official 235:685d5f11838f 479 sdio_cmdinitstructure.Argument = (uint32_t) BlockSize;
mbed_official 235:685d5f11838f 480 sdio_cmdinitstructure.CmdIndex = SD_CMD_SET_BLOCKLEN;
mbed_official 235:685d5f11838f 481 sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT;
mbed_official 235:685d5f11838f 482 sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
mbed_official 235:685d5f11838f 483 sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE;
mbed_official 235:685d5f11838f 484 SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
mbed_official 235:685d5f11838f 485
mbed_official 235:685d5f11838f 486 /* Check for error conditions */
mbed_official 235:685d5f11838f 487 errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN);
mbed_official 235:685d5f11838f 488
mbed_official 235:685d5f11838f 489 if (errorstate != SD_OK)
mbed_official 235:685d5f11838f 490 {
mbed_official 235:685d5f11838f 491 return errorstate;
mbed_official 235:685d5f11838f 492 }
mbed_official 235:685d5f11838f 493
mbed_official 235:685d5f11838f 494 /* Configure the SD DPSM (Data Path State Machine) */
mbed_official 235:685d5f11838f 495 sdio_datainitstructure.DataTimeOut = SD_DATATIMEOUT;
mbed_official 235:685d5f11838f 496 sdio_datainitstructure.DataLength = NumberOfBlocks * BlockSize;
mbed_official 532:fe11edbda85c 497 sdio_datainitstructure.DataBlockSize = DATA_BLOCK_SIZE;
mbed_official 235:685d5f11838f 498 sdio_datainitstructure.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO;
mbed_official 235:685d5f11838f 499 sdio_datainitstructure.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
mbed_official 235:685d5f11838f 500 sdio_datainitstructure.DPSM = SDIO_DPSM_ENABLE;
mbed_official 235:685d5f11838f 501 SDIO_DataConfig(hsd->Instance, &sdio_datainitstructure);
mbed_official 235:685d5f11838f 502
mbed_official 235:685d5f11838f 503 if(NumberOfBlocks > 1)
mbed_official 235:685d5f11838f 504 {
mbed_official 235:685d5f11838f 505 /* Send CMD18 READ_MULT_BLOCK with argument data address */
mbed_official 235:685d5f11838f 506 sdio_cmdinitstructure.CmdIndex = SD_CMD_READ_MULT_BLOCK;
mbed_official 235:685d5f11838f 507 }
mbed_official 235:685d5f11838f 508 else
mbed_official 235:685d5f11838f 509 {
mbed_official 235:685d5f11838f 510 /* Send CMD17 READ_SINGLE_BLOCK */
mbed_official 235:685d5f11838f 511 sdio_cmdinitstructure.CmdIndex = SD_CMD_READ_SINGLE_BLOCK;
mbed_official 235:685d5f11838f 512 }
mbed_official 235:685d5f11838f 513
mbed_official 235:685d5f11838f 514 sdio_cmdinitstructure.Argument = (uint32_t)ReadAddr;
mbed_official 235:685d5f11838f 515 SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
mbed_official 235:685d5f11838f 516
mbed_official 235:685d5f11838f 517 /* Read block(s) in polling mode */
mbed_official 235:685d5f11838f 518 if(NumberOfBlocks > 1)
mbed_official 235:685d5f11838f 519 {
mbed_official 235:685d5f11838f 520 /* Check for error conditions */
mbed_official 235:685d5f11838f 521 errorstate = SD_CmdResp1Error(hsd, SD_CMD_READ_MULT_BLOCK);
mbed_official 235:685d5f11838f 522
mbed_official 235:685d5f11838f 523 if (errorstate != SD_OK)
mbed_official 235:685d5f11838f 524 {
mbed_official 235:685d5f11838f 525 return errorstate;
mbed_official 235:685d5f11838f 526 }
mbed_official 235:685d5f11838f 527
mbed_official 235:685d5f11838f 528 /* Poll on SDIO flags */
mbed_official 532:fe11edbda85c 529 #ifdef SDIO_STA_STBITERR
mbed_official 235:685d5f11838f 530 while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND | SDIO_FLAG_STBITERR))
mbed_official 532:fe11edbda85c 531 #else /* SDIO_STA_STBITERR not defined */
mbed_official 532:fe11edbda85c 532 while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND))
mbed_official 532:fe11edbda85c 533 #endif /* SDIO_STA_STBITERR */
mbed_official 235:685d5f11838f 534 {
mbed_official 235:685d5f11838f 535 if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXFIFOHF))
mbed_official 235:685d5f11838f 536 {
mbed_official 235:685d5f11838f 537 /* Read data from SDIO Rx FIFO */
mbed_official 235:685d5f11838f 538 for (count = 0; count < 8; count++)
mbed_official 235:685d5f11838f 539 {
mbed_official 235:685d5f11838f 540 *(tempbuff + count) = SDIO_ReadFIFO(hsd->Instance);
mbed_official 235:685d5f11838f 541 }
mbed_official 235:685d5f11838f 542
mbed_official 235:685d5f11838f 543 tempbuff += 8;
mbed_official 235:685d5f11838f 544 }
mbed_official 235:685d5f11838f 545 }
mbed_official 235:685d5f11838f 546 }
mbed_official 235:685d5f11838f 547 else
mbed_official 235:685d5f11838f 548 {
mbed_official 235:685d5f11838f 549 /* Check for error conditions */
mbed_official 235:685d5f11838f 550 errorstate = SD_CmdResp1Error(hsd, SD_CMD_READ_SINGLE_BLOCK);
mbed_official 235:685d5f11838f 551
mbed_official 235:685d5f11838f 552 if (errorstate != SD_OK)
mbed_official 235:685d5f11838f 553 {
mbed_official 235:685d5f11838f 554 return errorstate;
mbed_official 235:685d5f11838f 555 }
mbed_official 235:685d5f11838f 556
mbed_official 235:685d5f11838f 557 /* In case of single block transfer, no need of stop transfer at all */
mbed_official 532:fe11edbda85c 558 #ifdef SDIO_STA_STBITERR
mbed_official 235:685d5f11838f 559 while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR))
mbed_official 532:fe11edbda85c 560 #else /* SDIO_STA_STBITERR not defined */
mbed_official 532:fe11edbda85c 561 while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND))
mbed_official 532:fe11edbda85c 562 #endif /* SDIO_STA_STBITERR */
mbed_official 235:685d5f11838f 563 {
mbed_official 235:685d5f11838f 564 if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXFIFOHF))
mbed_official 235:685d5f11838f 565 {
mbed_official 235:685d5f11838f 566 /* Read data from SDIO Rx FIFO */
mbed_official 235:685d5f11838f 567 for (count = 0; count < 8; count++)
mbed_official 235:685d5f11838f 568 {
mbed_official 235:685d5f11838f 569 *(tempbuff + count) = SDIO_ReadFIFO(hsd->Instance);
mbed_official 235:685d5f11838f 570 }
mbed_official 235:685d5f11838f 571
mbed_official 235:685d5f11838f 572 tempbuff += 8;
mbed_official 235:685d5f11838f 573 }
mbed_official 532:fe11edbda85c 574 }
mbed_official 235:685d5f11838f 575 }
mbed_official 235:685d5f11838f 576
mbed_official 235:685d5f11838f 577 /* Send stop transmission command in case of multiblock read */
mbed_official 235:685d5f11838f 578 if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DATAEND) && (NumberOfBlocks > 1))
mbed_official 235:685d5f11838f 579 {
mbed_official 235:685d5f11838f 580 if ((hsd->CardType == STD_CAPACITY_SD_CARD_V1_1) ||\
mbed_official 235:685d5f11838f 581 (hsd->CardType == STD_CAPACITY_SD_CARD_V2_0) ||\
mbed_official 235:685d5f11838f 582 (hsd->CardType == HIGH_CAPACITY_SD_CARD))
mbed_official 235:685d5f11838f 583 {
mbed_official 235:685d5f11838f 584 /* Send stop transmission command */
mbed_official 235:685d5f11838f 585 errorstate = HAL_SD_StopTransfer(hsd);
mbed_official 235:685d5f11838f 586 }
mbed_official 235:685d5f11838f 587 }
mbed_official 235:685d5f11838f 588
mbed_official 235:685d5f11838f 589 /* Get error state */
mbed_official 235:685d5f11838f 590 if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT))
mbed_official 235:685d5f11838f 591 {
mbed_official 235:685d5f11838f 592 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DTIMEOUT);
mbed_official 235:685d5f11838f 593
mbed_official 235:685d5f11838f 594 errorstate = SD_DATA_TIMEOUT;
mbed_official 235:685d5f11838f 595
mbed_official 235:685d5f11838f 596 return errorstate;
mbed_official 235:685d5f11838f 597 }
mbed_official 235:685d5f11838f 598 else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL))
mbed_official 235:685d5f11838f 599 {
mbed_official 235:685d5f11838f 600 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DCRCFAIL);
mbed_official 235:685d5f11838f 601
mbed_official 235:685d5f11838f 602 errorstate = SD_DATA_CRC_FAIL;
mbed_official 235:685d5f11838f 603
mbed_official 235:685d5f11838f 604 return errorstate;
mbed_official 235:685d5f11838f 605 }
mbed_official 235:685d5f11838f 606 else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR))
mbed_official 235:685d5f11838f 607 {
mbed_official 235:685d5f11838f 608 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_RXOVERR);
mbed_official 235:685d5f11838f 609
mbed_official 235:685d5f11838f 610 errorstate = SD_RX_OVERRUN;
mbed_official 235:685d5f11838f 611
mbed_official 235:685d5f11838f 612 return errorstate;
mbed_official 235:685d5f11838f 613 }
mbed_official 532:fe11edbda85c 614 #ifdef SDIO_STA_STBITERR
mbed_official 235:685d5f11838f 615 else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_STBITERR))
mbed_official 235:685d5f11838f 616 {
mbed_official 235:685d5f11838f 617 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_STBITERR);
mbed_official 235:685d5f11838f 618
mbed_official 235:685d5f11838f 619 errorstate = SD_START_BIT_ERR;
mbed_official 235:685d5f11838f 620
mbed_official 235:685d5f11838f 621 return errorstate;
mbed_official 235:685d5f11838f 622 }
mbed_official 532:fe11edbda85c 623 #endif /* SDIO_STA_STBITERR */
mbed_official 235:685d5f11838f 624 else
mbed_official 235:685d5f11838f 625 {
mbed_official 235:685d5f11838f 626 /* No error flag set */
mbed_official 235:685d5f11838f 627 }
mbed_official 235:685d5f11838f 628
mbed_official 235:685d5f11838f 629 count = SD_DATATIMEOUT;
mbed_official 235:685d5f11838f 630
mbed_official 235:685d5f11838f 631 /* Empty FIFO if there is still any data */
mbed_official 235:685d5f11838f 632 while ((__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXDAVL)) && (count > 0))
mbed_official 235:685d5f11838f 633 {
mbed_official 235:685d5f11838f 634 *tempbuff = SDIO_ReadFIFO(hsd->Instance);
mbed_official 235:685d5f11838f 635 tempbuff++;
mbed_official 235:685d5f11838f 636 count--;
mbed_official 235:685d5f11838f 637 }
mbed_official 235:685d5f11838f 638
mbed_official 235:685d5f11838f 639 /* Clear all the static flags */
mbed_official 235:685d5f11838f 640 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
mbed_official 235:685d5f11838f 641
mbed_official 235:685d5f11838f 642 return errorstate;
mbed_official 235:685d5f11838f 643 }
mbed_official 235:685d5f11838f 644
mbed_official 235:685d5f11838f 645 /**
mbed_official 235:685d5f11838f 646 * @brief Allows to write block(s) to a specified address in a card. The Data
mbed_official 235:685d5f11838f 647 * transfer is managed by polling mode.
mbed_official 235:685d5f11838f 648 * @param hsd: SD handle
mbed_official 235:685d5f11838f 649 * @param pWriteBuffer: pointer to the buffer that will contain the data to transmit
mbed_official 235:685d5f11838f 650 * @param WriteAddr: Address from where data is to be written
mbed_official 235:685d5f11838f 651 * @param BlockSize: SD card Data block size
mbed_official 532:fe11edbda85c 652 * @note BlockSize must be 512 bytes.
mbed_official 235:685d5f11838f 653 * @param NumberOfBlocks: Number of SD blocks to write
mbed_official 235:685d5f11838f 654 * @retval SD Card error state
mbed_official 235:685d5f11838f 655 */
mbed_official 235:685d5f11838f 656 HAL_SD_ErrorTypedef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint64_t WriteAddr, uint32_t BlockSize, uint32_t NumberOfBlocks)
mbed_official 235:685d5f11838f 657 {
mbed_official 235:685d5f11838f 658 SDIO_CmdInitTypeDef sdio_cmdinitstructure;
mbed_official 235:685d5f11838f 659 SDIO_DataInitTypeDef sdio_datainitstructure;
mbed_official 235:685d5f11838f 660 HAL_SD_ErrorTypedef errorstate = SD_OK;
mbed_official 235:685d5f11838f 661 uint32_t totalnumberofbytes = 0, bytestransferred = 0, count = 0, restwords = 0;
mbed_official 235:685d5f11838f 662 uint32_t *tempbuff = (uint32_t *)pWriteBuffer;
mbed_official 235:685d5f11838f 663 uint8_t cardstate = 0;
mbed_official 235:685d5f11838f 664
mbed_official 235:685d5f11838f 665 /* Initialize data control register */
mbed_official 235:685d5f11838f 666 hsd->Instance->DCTRL = 0;
mbed_official 235:685d5f11838f 667
mbed_official 235:685d5f11838f 668 if (hsd->CardType == HIGH_CAPACITY_SD_CARD)
mbed_official 235:685d5f11838f 669 {
mbed_official 235:685d5f11838f 670 BlockSize = 512;
mbed_official 235:685d5f11838f 671 WriteAddr /= 512;
mbed_official 235:685d5f11838f 672 }
mbed_official 235:685d5f11838f 673
mbed_official 235:685d5f11838f 674 /* Set Block Size for Card */
mbed_official 235:685d5f11838f 675 sdio_cmdinitstructure.Argument = (uint32_t)BlockSize;
mbed_official 235:685d5f11838f 676 sdio_cmdinitstructure.CmdIndex = SD_CMD_SET_BLOCKLEN;
mbed_official 235:685d5f11838f 677 sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT;
mbed_official 235:685d5f11838f 678 sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
mbed_official 235:685d5f11838f 679 sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE;
mbed_official 235:685d5f11838f 680 SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
mbed_official 235:685d5f11838f 681
mbed_official 235:685d5f11838f 682 /* Check for error conditions */
mbed_official 235:685d5f11838f 683 errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN);
mbed_official 235:685d5f11838f 684
mbed_official 235:685d5f11838f 685 if (errorstate != SD_OK)
mbed_official 235:685d5f11838f 686 {
mbed_official 235:685d5f11838f 687 return errorstate;
mbed_official 235:685d5f11838f 688 }
mbed_official 235:685d5f11838f 689
mbed_official 235:685d5f11838f 690 if(NumberOfBlocks > 1)
mbed_official 235:685d5f11838f 691 {
mbed_official 235:685d5f11838f 692 /* Send CMD25 WRITE_MULT_BLOCK with argument data address */
mbed_official 235:685d5f11838f 693 sdio_cmdinitstructure.CmdIndex = SD_CMD_WRITE_MULT_BLOCK;
mbed_official 235:685d5f11838f 694 }
mbed_official 235:685d5f11838f 695 else
mbed_official 235:685d5f11838f 696 {
mbed_official 235:685d5f11838f 697 /* Send CMD24 WRITE_SINGLE_BLOCK */
mbed_official 235:685d5f11838f 698 sdio_cmdinitstructure.CmdIndex = SD_CMD_WRITE_SINGLE_BLOCK;
mbed_official 235:685d5f11838f 699 }
mbed_official 235:685d5f11838f 700
mbed_official 235:685d5f11838f 701 sdio_cmdinitstructure.Argument = (uint32_t)WriteAddr;
mbed_official 235:685d5f11838f 702 SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
mbed_official 235:685d5f11838f 703
mbed_official 235:685d5f11838f 704 /* Check for error conditions */
mbed_official 235:685d5f11838f 705 if(NumberOfBlocks > 1)
mbed_official 235:685d5f11838f 706 {
mbed_official 235:685d5f11838f 707 errorstate = SD_CmdResp1Error(hsd, SD_CMD_WRITE_MULT_BLOCK);
mbed_official 235:685d5f11838f 708 }
mbed_official 235:685d5f11838f 709 else
mbed_official 235:685d5f11838f 710 {
mbed_official 235:685d5f11838f 711 errorstate = SD_CmdResp1Error(hsd, SD_CMD_WRITE_SINGLE_BLOCK);
mbed_official 235:685d5f11838f 712 }
mbed_official 235:685d5f11838f 713
mbed_official 235:685d5f11838f 714 if (errorstate != SD_OK)
mbed_official 235:685d5f11838f 715 {
mbed_official 235:685d5f11838f 716 return errorstate;
mbed_official 235:685d5f11838f 717 }
mbed_official 235:685d5f11838f 718
mbed_official 235:685d5f11838f 719 /* Set total number of bytes to write */
mbed_official 235:685d5f11838f 720 totalnumberofbytes = NumberOfBlocks * BlockSize;
mbed_official 235:685d5f11838f 721
mbed_official 235:685d5f11838f 722 /* Configure the SD DPSM (Data Path State Machine) */
mbed_official 235:685d5f11838f 723 sdio_datainitstructure.DataTimeOut = SD_DATATIMEOUT;
mbed_official 235:685d5f11838f 724 sdio_datainitstructure.DataLength = NumberOfBlocks * BlockSize;
mbed_official 235:685d5f11838f 725 sdio_datainitstructure.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
mbed_official 235:685d5f11838f 726 sdio_datainitstructure.TransferDir = SDIO_TRANSFER_DIR_TO_CARD;
mbed_official 235:685d5f11838f 727 sdio_datainitstructure.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
mbed_official 235:685d5f11838f 728 sdio_datainitstructure.DPSM = SDIO_DPSM_ENABLE;
mbed_official 235:685d5f11838f 729 SDIO_DataConfig(hsd->Instance, &sdio_datainitstructure);
mbed_official 235:685d5f11838f 730
mbed_official 235:685d5f11838f 731 /* Write block(s) in polling mode */
mbed_official 235:685d5f11838f 732 if(NumberOfBlocks > 1)
mbed_official 235:685d5f11838f 733 {
mbed_official 532:fe11edbda85c 734 #ifdef SDIO_STA_STBITERR
mbed_official 235:685d5f11838f 735 while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND | SDIO_FLAG_STBITERR))
mbed_official 532:fe11edbda85c 736 #else /* SDIO_STA_STBITERR not defined */
mbed_official 532:fe11edbda85c 737 while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND))
mbed_official 532:fe11edbda85c 738 #endif /* SDIO_STA_STBITERR */
mbed_official 235:685d5f11838f 739 {
mbed_official 235:685d5f11838f 740 if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_TXFIFOHE))
mbed_official 235:685d5f11838f 741 {
mbed_official 235:685d5f11838f 742 if ((totalnumberofbytes - bytestransferred) < 32)
mbed_official 235:685d5f11838f 743 {
mbed_official 235:685d5f11838f 744 restwords = ((totalnumberofbytes - bytestransferred) % 4 == 0) ? ((totalnumberofbytes - bytestransferred) / 4) : (( totalnumberofbytes - bytestransferred) / 4 + 1);
mbed_official 235:685d5f11838f 745
mbed_official 235:685d5f11838f 746 /* Write data to SDIO Tx FIFO */
mbed_official 235:685d5f11838f 747 for (count = 0; count < restwords; count++)
mbed_official 235:685d5f11838f 748 {
mbed_official 235:685d5f11838f 749 SDIO_WriteFIFO(hsd->Instance, tempbuff);
mbed_official 235:685d5f11838f 750 tempbuff++;
mbed_official 235:685d5f11838f 751 bytestransferred += 4;
mbed_official 235:685d5f11838f 752 }
mbed_official 235:685d5f11838f 753 }
mbed_official 235:685d5f11838f 754 else
mbed_official 235:685d5f11838f 755 {
mbed_official 235:685d5f11838f 756 /* Write data to SDIO Tx FIFO */
mbed_official 235:685d5f11838f 757 for (count = 0; count < 8; count++)
mbed_official 235:685d5f11838f 758 {
mbed_official 235:685d5f11838f 759 SDIO_WriteFIFO(hsd->Instance, (tempbuff + count));
mbed_official 235:685d5f11838f 760 }
mbed_official 235:685d5f11838f 761
mbed_official 235:685d5f11838f 762 tempbuff += 8;
mbed_official 235:685d5f11838f 763 bytestransferred += 32;
mbed_official 235:685d5f11838f 764 }
mbed_official 235:685d5f11838f 765 }
mbed_official 235:685d5f11838f 766 }
mbed_official 235:685d5f11838f 767 }
mbed_official 235:685d5f11838f 768 else
mbed_official 235:685d5f11838f 769 {
mbed_official 532:fe11edbda85c 770 /* In case of single data block transfer no need of stop command at all */
mbed_official 532:fe11edbda85c 771 #ifdef SDIO_STA_STBITERR
mbed_official 235:685d5f11838f 772 while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR))
mbed_official 532:fe11edbda85c 773 #else /* SDIO_STA_STBITERR not defined */
mbed_official 532:fe11edbda85c 774 while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND))
mbed_official 532:fe11edbda85c 775 #endif /* SDIO_STA_STBITERR */
mbed_official 235:685d5f11838f 776 {
mbed_official 235:685d5f11838f 777 if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_TXFIFOHE))
mbed_official 235:685d5f11838f 778 {
mbed_official 235:685d5f11838f 779 if ((totalnumberofbytes - bytestransferred) < 32)
mbed_official 235:685d5f11838f 780 {
mbed_official 235:685d5f11838f 781 restwords = ((totalnumberofbytes - bytestransferred) % 4 == 0) ? ((totalnumberofbytes - bytestransferred) / 4) : (( totalnumberofbytes - bytestransferred) / 4 + 1);
mbed_official 235:685d5f11838f 782
mbed_official 235:685d5f11838f 783 /* Write data to SDIO Tx FIFO */
mbed_official 235:685d5f11838f 784 for (count = 0; count < restwords; count++)
mbed_official 235:685d5f11838f 785 {
mbed_official 235:685d5f11838f 786 SDIO_WriteFIFO(hsd->Instance, tempbuff);
mbed_official 235:685d5f11838f 787 tempbuff++;
mbed_official 235:685d5f11838f 788 bytestransferred += 4;
mbed_official 235:685d5f11838f 789 }
mbed_official 235:685d5f11838f 790 }
mbed_official 235:685d5f11838f 791 else
mbed_official 235:685d5f11838f 792 {
mbed_official 235:685d5f11838f 793 /* Write data to SDIO Tx FIFO */
mbed_official 235:685d5f11838f 794 for (count = 0; count < 8; count++)
mbed_official 235:685d5f11838f 795 {
mbed_official 235:685d5f11838f 796 SDIO_WriteFIFO(hsd->Instance, (tempbuff + count));
mbed_official 235:685d5f11838f 797 }
mbed_official 235:685d5f11838f 798
mbed_official 235:685d5f11838f 799 tempbuff += 8;
mbed_official 235:685d5f11838f 800 bytestransferred += 32;
mbed_official 235:685d5f11838f 801 }
mbed_official 235:685d5f11838f 802 }
mbed_official 235:685d5f11838f 803 }
mbed_official 235:685d5f11838f 804 }
mbed_official 235:685d5f11838f 805
mbed_official 235:685d5f11838f 806 /* Send stop transmission command in case of multiblock write */
mbed_official 235:685d5f11838f 807 if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DATAEND) && (NumberOfBlocks > 1))
mbed_official 235:685d5f11838f 808 {
mbed_official 235:685d5f11838f 809 if ((hsd->CardType == STD_CAPACITY_SD_CARD_V1_1) || (hsd->CardType == STD_CAPACITY_SD_CARD_V2_0) ||\
mbed_official 235:685d5f11838f 810 (hsd->CardType == HIGH_CAPACITY_SD_CARD))
mbed_official 235:685d5f11838f 811 {
mbed_official 235:685d5f11838f 812 /* Send stop transmission command */
mbed_official 235:685d5f11838f 813 errorstate = HAL_SD_StopTransfer(hsd);
mbed_official 235:685d5f11838f 814 }
mbed_official 235:685d5f11838f 815 }
mbed_official 235:685d5f11838f 816
mbed_official 235:685d5f11838f 817 /* Get error state */
mbed_official 235:685d5f11838f 818 if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT))
mbed_official 235:685d5f11838f 819 {
mbed_official 235:685d5f11838f 820 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DTIMEOUT);
mbed_official 235:685d5f11838f 821
mbed_official 235:685d5f11838f 822 errorstate = SD_DATA_TIMEOUT;
mbed_official 235:685d5f11838f 823
mbed_official 235:685d5f11838f 824 return errorstate;
mbed_official 235:685d5f11838f 825 }
mbed_official 235:685d5f11838f 826 else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL))
mbed_official 235:685d5f11838f 827 {
mbed_official 235:685d5f11838f 828 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DCRCFAIL);
mbed_official 235:685d5f11838f 829
mbed_official 235:685d5f11838f 830 errorstate = SD_DATA_CRC_FAIL;
mbed_official 235:685d5f11838f 831
mbed_official 235:685d5f11838f 832 return errorstate;
mbed_official 235:685d5f11838f 833 }
mbed_official 235:685d5f11838f 834 else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR))
mbed_official 235:685d5f11838f 835 {
mbed_official 235:685d5f11838f 836 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_TXUNDERR);
mbed_official 235:685d5f11838f 837
mbed_official 235:685d5f11838f 838 errorstate = SD_TX_UNDERRUN;
mbed_official 235:685d5f11838f 839
mbed_official 235:685d5f11838f 840 return errorstate;
mbed_official 235:685d5f11838f 841 }
mbed_official 532:fe11edbda85c 842 #ifdef SDIO_STA_STBITERR
mbed_official 235:685d5f11838f 843 else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_STBITERR))
mbed_official 235:685d5f11838f 844 {
mbed_official 235:685d5f11838f 845 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_STBITERR);
mbed_official 235:685d5f11838f 846
mbed_official 235:685d5f11838f 847 errorstate = SD_START_BIT_ERR;
mbed_official 235:685d5f11838f 848
mbed_official 235:685d5f11838f 849 return errorstate;
mbed_official 235:685d5f11838f 850 }
mbed_official 532:fe11edbda85c 851 #endif /* SDIO_STA_STBITERR */
mbed_official 235:685d5f11838f 852 else
mbed_official 235:685d5f11838f 853 {
mbed_official 235:685d5f11838f 854 /* No error flag set */
mbed_official 235:685d5f11838f 855 }
mbed_official 235:685d5f11838f 856
mbed_official 235:685d5f11838f 857 /* Clear all the static flags */
mbed_official 235:685d5f11838f 858 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
mbed_official 235:685d5f11838f 859
mbed_official 235:685d5f11838f 860 /* Wait till the card is in programming state */
mbed_official 235:685d5f11838f 861 errorstate = SD_IsCardProgramming(hsd, &cardstate);
mbed_official 235:685d5f11838f 862
mbed_official 235:685d5f11838f 863 while ((errorstate == SD_OK) && ((cardstate == SD_CARD_PROGRAMMING) || (cardstate == SD_CARD_RECEIVING)))
mbed_official 235:685d5f11838f 864 {
mbed_official 235:685d5f11838f 865 errorstate = SD_IsCardProgramming(hsd, &cardstate);
mbed_official 235:685d5f11838f 866 }
mbed_official 235:685d5f11838f 867
mbed_official 235:685d5f11838f 868 return errorstate;
mbed_official 235:685d5f11838f 869 }
mbed_official 235:685d5f11838f 870
mbed_official 235:685d5f11838f 871 /**
mbed_official 235:685d5f11838f 872 * @brief Reads block(s) from a specified address in a card. The Data transfer
mbed_official 235:685d5f11838f 873 * is managed by DMA mode.
mbed_official 235:685d5f11838f 874 * @note This API should be followed by the function HAL_SD_CheckReadOperation()
mbed_official 235:685d5f11838f 875 * to check the completion of the read process
mbed_official 235:685d5f11838f 876 * @param hsd: SD handle
mbed_official 235:685d5f11838f 877 * @param pReadBuffer: Pointer to the buffer that will contain the received data
mbed_official 235:685d5f11838f 878 * @param ReadAddr: Address from where data is to be read
mbed_official 235:685d5f11838f 879 * @param BlockSize: SD card Data block size
mbed_official 532:fe11edbda85c 880 * @note BlockSize must be 512 bytes.
mbed_official 235:685d5f11838f 881 * @param NumberOfBlocks: Number of blocks to read.
mbed_official 235:685d5f11838f 882 * @retval SD Card error state
mbed_official 235:685d5f11838f 883 */
mbed_official 235:685d5f11838f 884 HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint64_t ReadAddr, uint32_t BlockSize, uint32_t NumberOfBlocks)
mbed_official 235:685d5f11838f 885 {
mbed_official 235:685d5f11838f 886 SDIO_CmdInitTypeDef sdio_cmdinitstructure;
mbed_official 235:685d5f11838f 887 SDIO_DataInitTypeDef sdio_datainitstructure;
mbed_official 235:685d5f11838f 888 HAL_SD_ErrorTypedef errorstate = SD_OK;
mbed_official 235:685d5f11838f 889
mbed_official 235:685d5f11838f 890 /* Initialize data control register */
mbed_official 235:685d5f11838f 891 hsd->Instance->DCTRL = 0;
mbed_official 235:685d5f11838f 892
mbed_official 235:685d5f11838f 893 /* Initialize handle flags */
mbed_official 235:685d5f11838f 894 hsd->SdTransferCplt = 0;
mbed_official 235:685d5f11838f 895 hsd->DmaTransferCplt = 0;
mbed_official 235:685d5f11838f 896 hsd->SdTransferErr = SD_OK;
mbed_official 235:685d5f11838f 897
mbed_official 235:685d5f11838f 898 /* Initialize SD Read operation */
mbed_official 235:685d5f11838f 899 if(NumberOfBlocks > 1)
mbed_official 235:685d5f11838f 900 {
mbed_official 235:685d5f11838f 901 hsd->SdOperation = SD_READ_MULTIPLE_BLOCK;
mbed_official 235:685d5f11838f 902 }
mbed_official 235:685d5f11838f 903 else
mbed_official 235:685d5f11838f 904 {
mbed_official 235:685d5f11838f 905 hsd->SdOperation = SD_READ_SINGLE_BLOCK;
mbed_official 235:685d5f11838f 906 }
mbed_official 235:685d5f11838f 907
mbed_official 235:685d5f11838f 908 /* Enable transfer interrupts */
mbed_official 532:fe11edbda85c 909 #ifdef SDIO_STA_STBITERR
mbed_official 235:685d5f11838f 910 __HAL_SD_SDIO_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL |\
mbed_official 235:685d5f11838f 911 SDIO_IT_DTIMEOUT |\
mbed_official 235:685d5f11838f 912 SDIO_IT_DATAEND |\
mbed_official 235:685d5f11838f 913 SDIO_IT_RXOVERR |\
mbed_official 235:685d5f11838f 914 SDIO_IT_STBITERR));
mbed_official 532:fe11edbda85c 915 #else /* SDIO_STA_STBITERR not defined */
mbed_official 532:fe11edbda85c 916 __HAL_SD_SDIO_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL |\
mbed_official 532:fe11edbda85c 917 SDIO_IT_DTIMEOUT |\
mbed_official 532:fe11edbda85c 918 SDIO_IT_DATAEND |\
mbed_official 532:fe11edbda85c 919 SDIO_IT_RXOVERR));
mbed_official 532:fe11edbda85c 920 #endif /* SDIO_STA_STBITERR */
mbed_official 235:685d5f11838f 921
mbed_official 235:685d5f11838f 922 /* Enable SDIO DMA transfer */
mbed_official 235:685d5f11838f 923 __HAL_SD_SDIO_DMA_ENABLE();
mbed_official 235:685d5f11838f 924
mbed_official 235:685d5f11838f 925 /* Configure DMA user callbacks */
mbed_official 235:685d5f11838f 926 hsd->hdmarx->XferCpltCallback = SD_DMA_RxCplt;
mbed_official 235:685d5f11838f 927 hsd->hdmarx->XferErrorCallback = SD_DMA_RxError;
mbed_official 235:685d5f11838f 928
mbed_official 235:685d5f11838f 929 /* Enable the DMA Stream */
mbed_official 532:fe11edbda85c 930 HAL_DMA_Start_IT(hsd->hdmarx, (uint32_t)&hsd->Instance->FIFO, (uint32_t)pReadBuffer, (uint32_t)(BlockSize * NumberOfBlocks)/4);
mbed_official 235:685d5f11838f 931
mbed_official 235:685d5f11838f 932 if (hsd->CardType == HIGH_CAPACITY_SD_CARD)
mbed_official 235:685d5f11838f 933 {
mbed_official 235:685d5f11838f 934 BlockSize = 512;
mbed_official 235:685d5f11838f 935 ReadAddr /= 512;
mbed_official 235:685d5f11838f 936 }
mbed_official 235:685d5f11838f 937
mbed_official 235:685d5f11838f 938 /* Set Block Size for Card */
mbed_official 235:685d5f11838f 939 sdio_cmdinitstructure.Argument = (uint32_t)BlockSize;
mbed_official 235:685d5f11838f 940 sdio_cmdinitstructure.CmdIndex = SD_CMD_SET_BLOCKLEN;
mbed_official 235:685d5f11838f 941 sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT;
mbed_official 235:685d5f11838f 942 sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
mbed_official 235:685d5f11838f 943 sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE;
mbed_official 235:685d5f11838f 944 SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
mbed_official 235:685d5f11838f 945
mbed_official 235:685d5f11838f 946 /* Check for error conditions */
mbed_official 235:685d5f11838f 947 errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN);
mbed_official 235:685d5f11838f 948
mbed_official 235:685d5f11838f 949 if (errorstate != SD_OK)
mbed_official 235:685d5f11838f 950 {
mbed_official 235:685d5f11838f 951 return errorstate;
mbed_official 235:685d5f11838f 952 }
mbed_official 235:685d5f11838f 953
mbed_official 235:685d5f11838f 954 /* Configure the SD DPSM (Data Path State Machine) */
mbed_official 235:685d5f11838f 955 sdio_datainitstructure.DataTimeOut = SD_DATATIMEOUT;
mbed_official 235:685d5f11838f 956 sdio_datainitstructure.DataLength = BlockSize * NumberOfBlocks;
mbed_official 235:685d5f11838f 957 sdio_datainitstructure.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
mbed_official 235:685d5f11838f 958 sdio_datainitstructure.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO;
mbed_official 235:685d5f11838f 959 sdio_datainitstructure.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
mbed_official 235:685d5f11838f 960 sdio_datainitstructure.DPSM = SDIO_DPSM_ENABLE;
mbed_official 235:685d5f11838f 961 SDIO_DataConfig(hsd->Instance, &sdio_datainitstructure);
mbed_official 235:685d5f11838f 962
mbed_official 235:685d5f11838f 963 /* Check number of blocks command */
mbed_official 235:685d5f11838f 964 if(NumberOfBlocks > 1)
mbed_official 235:685d5f11838f 965 {
mbed_official 235:685d5f11838f 966 /* Send CMD18 READ_MULT_BLOCK with argument data address */
mbed_official 235:685d5f11838f 967 sdio_cmdinitstructure.CmdIndex = SD_CMD_READ_MULT_BLOCK;
mbed_official 235:685d5f11838f 968 }
mbed_official 235:685d5f11838f 969 else
mbed_official 235:685d5f11838f 970 {
mbed_official 235:685d5f11838f 971 /* Send CMD17 READ_SINGLE_BLOCK */
mbed_official 235:685d5f11838f 972 sdio_cmdinitstructure.CmdIndex = SD_CMD_READ_SINGLE_BLOCK;
mbed_official 235:685d5f11838f 973 }
mbed_official 235:685d5f11838f 974
mbed_official 532:fe11edbda85c 975 sdio_cmdinitstructure.Argument = (uint32_t)ReadAddr;
mbed_official 235:685d5f11838f 976 SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
mbed_official 235:685d5f11838f 977
mbed_official 235:685d5f11838f 978 /* Check for error conditions */
mbed_official 235:685d5f11838f 979 if(NumberOfBlocks > 1)
mbed_official 235:685d5f11838f 980 {
mbed_official 235:685d5f11838f 981 errorstate = SD_CmdResp1Error(hsd, SD_CMD_READ_MULT_BLOCK);
mbed_official 235:685d5f11838f 982 }
mbed_official 235:685d5f11838f 983 else
mbed_official 235:685d5f11838f 984 {
mbed_official 235:685d5f11838f 985 errorstate = SD_CmdResp1Error(hsd, SD_CMD_READ_SINGLE_BLOCK);
mbed_official 235:685d5f11838f 986 }
mbed_official 235:685d5f11838f 987
mbed_official 235:685d5f11838f 988 /* Update the SD transfer error in SD handle */
mbed_official 235:685d5f11838f 989 hsd->SdTransferErr = errorstate;
mbed_official 235:685d5f11838f 990
mbed_official 235:685d5f11838f 991 return errorstate;
mbed_official 235:685d5f11838f 992 }
mbed_official 235:685d5f11838f 993
mbed_official 235:685d5f11838f 994
mbed_official 235:685d5f11838f 995 /**
mbed_official 235:685d5f11838f 996 * @brief Writes block(s) to a specified address in a card. The Data transfer
mbed_official 235:685d5f11838f 997 * is managed by DMA mode.
mbed_official 235:685d5f11838f 998 * @note This API should be followed by the function HAL_SD_CheckWriteOperation()
mbed_official 235:685d5f11838f 999 * to check the completion of the write process (by SD current status polling).
mbed_official 235:685d5f11838f 1000 * @param hsd: SD handle
mbed_official 235:685d5f11838f 1001 * @param pWriteBuffer: pointer to the buffer that will contain the data to transmit
mbed_official 235:685d5f11838f 1002 * @param WriteAddr: Address from where data is to be read
mbed_official 235:685d5f11838f 1003 * @param BlockSize: the SD card Data block size
mbed_official 532:fe11edbda85c 1004 * @note BlockSize must be 512 bytes.
mbed_official 235:685d5f11838f 1005 * @param NumberOfBlocks: Number of blocks to write
mbed_official 235:685d5f11838f 1006 * @retval SD Card error state
mbed_official 235:685d5f11838f 1007 */
mbed_official 235:685d5f11838f 1008 HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint64_t WriteAddr, uint32_t BlockSize, uint32_t NumberOfBlocks)
mbed_official 235:685d5f11838f 1009 {
mbed_official 235:685d5f11838f 1010 SDIO_CmdInitTypeDef sdio_cmdinitstructure;
mbed_official 235:685d5f11838f 1011 SDIO_DataInitTypeDef sdio_datainitstructure;
mbed_official 235:685d5f11838f 1012 HAL_SD_ErrorTypedef errorstate = SD_OK;
mbed_official 235:685d5f11838f 1013
mbed_official 235:685d5f11838f 1014 /* Initialize data control register */
mbed_official 235:685d5f11838f 1015 hsd->Instance->DCTRL = 0;
mbed_official 235:685d5f11838f 1016
mbed_official 235:685d5f11838f 1017 /* Initialize handle flags */
mbed_official 235:685d5f11838f 1018 hsd->SdTransferCplt = 0;
mbed_official 235:685d5f11838f 1019 hsd->DmaTransferCplt = 0;
mbed_official 235:685d5f11838f 1020 hsd->SdTransferErr = SD_OK;
mbed_official 235:685d5f11838f 1021
mbed_official 235:685d5f11838f 1022 /* Initialize SD Write operation */
mbed_official 235:685d5f11838f 1023 if(NumberOfBlocks > 1)
mbed_official 235:685d5f11838f 1024 {
mbed_official 235:685d5f11838f 1025 hsd->SdOperation = SD_WRITE_MULTIPLE_BLOCK;
mbed_official 235:685d5f11838f 1026 }
mbed_official 235:685d5f11838f 1027 else
mbed_official 235:685d5f11838f 1028 {
mbed_official 235:685d5f11838f 1029 hsd->SdOperation = SD_WRITE_SINGLE_BLOCK;
mbed_official 235:685d5f11838f 1030 }
mbed_official 235:685d5f11838f 1031
mbed_official 235:685d5f11838f 1032 /* Enable transfer interrupts */
mbed_official 532:fe11edbda85c 1033 #ifdef SDIO_STA_STBITERR
mbed_official 235:685d5f11838f 1034 __HAL_SD_SDIO_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL |\
mbed_official 235:685d5f11838f 1035 SDIO_IT_DTIMEOUT |\
mbed_official 235:685d5f11838f 1036 SDIO_IT_DATAEND |\
mbed_official 235:685d5f11838f 1037 SDIO_IT_TXUNDERR |\
mbed_official 532:fe11edbda85c 1038 SDIO_IT_STBITERR));
mbed_official 532:fe11edbda85c 1039 #else /* SDIO_STA_STBITERR not defined */
mbed_official 532:fe11edbda85c 1040 __HAL_SD_SDIO_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL |\
mbed_official 532:fe11edbda85c 1041 SDIO_IT_DTIMEOUT |\
mbed_official 532:fe11edbda85c 1042 SDIO_IT_DATAEND |\
mbed_official 532:fe11edbda85c 1043 SDIO_IT_TXUNDERR));
mbed_official 532:fe11edbda85c 1044 #endif /* SDIO_STA_STBITERR */
mbed_official 235:685d5f11838f 1045
mbed_official 235:685d5f11838f 1046 /* Configure DMA user callbacks */
mbed_official 235:685d5f11838f 1047 hsd->hdmatx->XferCpltCallback = SD_DMA_TxCplt;
mbed_official 235:685d5f11838f 1048 hsd->hdmatx->XferErrorCallback = SD_DMA_TxError;
mbed_official 235:685d5f11838f 1049
mbed_official 235:685d5f11838f 1050 /* Enable the DMA Stream */
mbed_official 532:fe11edbda85c 1051 HAL_DMA_Start_IT(hsd->hdmatx, (uint32_t)pWriteBuffer, (uint32_t)&hsd->Instance->FIFO, (uint32_t)(BlockSize * NumberOfBlocks)/4);
mbed_official 235:685d5f11838f 1052
mbed_official 235:685d5f11838f 1053 /* Enable SDIO DMA transfer */
mbed_official 235:685d5f11838f 1054 __HAL_SD_SDIO_DMA_ENABLE();
mbed_official 235:685d5f11838f 1055
mbed_official 235:685d5f11838f 1056 if (hsd->CardType == HIGH_CAPACITY_SD_CARD)
mbed_official 235:685d5f11838f 1057 {
mbed_official 235:685d5f11838f 1058 BlockSize = 512;
mbed_official 235:685d5f11838f 1059 WriteAddr /= 512;
mbed_official 235:685d5f11838f 1060 }
mbed_official 235:685d5f11838f 1061
mbed_official 235:685d5f11838f 1062 /* Set Block Size for Card */
mbed_official 235:685d5f11838f 1063 sdio_cmdinitstructure.Argument = (uint32_t)BlockSize;
mbed_official 235:685d5f11838f 1064 sdio_cmdinitstructure.CmdIndex = SD_CMD_SET_BLOCKLEN;
mbed_official 235:685d5f11838f 1065 sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT;
mbed_official 235:685d5f11838f 1066 sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
mbed_official 235:685d5f11838f 1067 sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE;
mbed_official 235:685d5f11838f 1068 SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
mbed_official 235:685d5f11838f 1069
mbed_official 235:685d5f11838f 1070 /* Check for error conditions */
mbed_official 235:685d5f11838f 1071 errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN);
mbed_official 235:685d5f11838f 1072
mbed_official 235:685d5f11838f 1073 if (errorstate != SD_OK)
mbed_official 235:685d5f11838f 1074 {
mbed_official 235:685d5f11838f 1075 return errorstate;
mbed_official 235:685d5f11838f 1076 }
mbed_official 235:685d5f11838f 1077
mbed_official 235:685d5f11838f 1078 /* Check number of blocks command */
mbed_official 235:685d5f11838f 1079 if(NumberOfBlocks <= 1)
mbed_official 235:685d5f11838f 1080 {
mbed_official 235:685d5f11838f 1081 /* Send CMD24 WRITE_SINGLE_BLOCK */
mbed_official 235:685d5f11838f 1082 sdio_cmdinitstructure.CmdIndex = SD_CMD_WRITE_SINGLE_BLOCK;
mbed_official 235:685d5f11838f 1083 }
mbed_official 235:685d5f11838f 1084 else
mbed_official 235:685d5f11838f 1085 {
mbed_official 235:685d5f11838f 1086 /* Send CMD25 WRITE_MULT_BLOCK with argument data address */
mbed_official 235:685d5f11838f 1087 sdio_cmdinitstructure.CmdIndex = SD_CMD_WRITE_MULT_BLOCK;
mbed_official 235:685d5f11838f 1088 }
mbed_official 235:685d5f11838f 1089
mbed_official 235:685d5f11838f 1090 sdio_cmdinitstructure.Argument = (uint32_t)WriteAddr;
mbed_official 235:685d5f11838f 1091 SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
mbed_official 235:685d5f11838f 1092
mbed_official 235:685d5f11838f 1093 /* Check for error conditions */
mbed_official 235:685d5f11838f 1094 if(NumberOfBlocks > 1)
mbed_official 235:685d5f11838f 1095 {
mbed_official 235:685d5f11838f 1096 errorstate = SD_CmdResp1Error(hsd, SD_CMD_WRITE_MULT_BLOCK);
mbed_official 235:685d5f11838f 1097 }
mbed_official 235:685d5f11838f 1098 else
mbed_official 235:685d5f11838f 1099 {
mbed_official 235:685d5f11838f 1100 errorstate = SD_CmdResp1Error(hsd, SD_CMD_WRITE_SINGLE_BLOCK);
mbed_official 235:685d5f11838f 1101 }
mbed_official 235:685d5f11838f 1102
mbed_official 235:685d5f11838f 1103 if (errorstate != SD_OK)
mbed_official 235:685d5f11838f 1104 {
mbed_official 235:685d5f11838f 1105 return errorstate;
mbed_official 235:685d5f11838f 1106 }
mbed_official 235:685d5f11838f 1107
mbed_official 235:685d5f11838f 1108 /* Configure the SD DPSM (Data Path State Machine) */
mbed_official 235:685d5f11838f 1109 sdio_datainitstructure.DataTimeOut = SD_DATATIMEOUT;
mbed_official 235:685d5f11838f 1110 sdio_datainitstructure.DataLength = BlockSize * NumberOfBlocks;
mbed_official 235:685d5f11838f 1111 sdio_datainitstructure.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
mbed_official 235:685d5f11838f 1112 sdio_datainitstructure.TransferDir = SDIO_TRANSFER_DIR_TO_CARD;
mbed_official 235:685d5f11838f 1113 sdio_datainitstructure.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
mbed_official 235:685d5f11838f 1114 sdio_datainitstructure.DPSM = SDIO_DPSM_ENABLE;
mbed_official 235:685d5f11838f 1115 SDIO_DataConfig(hsd->Instance, &sdio_datainitstructure);
mbed_official 235:685d5f11838f 1116
mbed_official 235:685d5f11838f 1117 hsd->SdTransferErr = errorstate;
mbed_official 235:685d5f11838f 1118
mbed_official 235:685d5f11838f 1119 return errorstate;
mbed_official 235:685d5f11838f 1120 }
mbed_official 235:685d5f11838f 1121
mbed_official 235:685d5f11838f 1122 /**
mbed_official 235:685d5f11838f 1123 * @brief This function waits until the SD DMA data read transfer is finished.
mbed_official 235:685d5f11838f 1124 * This API should be called after HAL_SD_ReadBlocks_DMA() function
mbed_official 235:685d5f11838f 1125 * to insure that all data sent by the card is already transferred by the
mbed_official 235:685d5f11838f 1126 * DMA controller.
mbed_official 235:685d5f11838f 1127 * @param hsd: SD handle
mbed_official 235:685d5f11838f 1128 * @param Timeout: Timeout duration
mbed_official 235:685d5f11838f 1129 * @retval SD Card error state
mbed_official 235:685d5f11838f 1130 */
mbed_official 235:685d5f11838f 1131 HAL_SD_ErrorTypedef HAL_SD_CheckReadOperation(SD_HandleTypeDef *hsd, uint32_t Timeout)
mbed_official 235:685d5f11838f 1132 {
mbed_official 235:685d5f11838f 1133 HAL_SD_ErrorTypedef errorstate = SD_OK;
mbed_official 235:685d5f11838f 1134 uint32_t timeout = Timeout;
mbed_official 235:685d5f11838f 1135 uint32_t tmp1, tmp2;
mbed_official 235:685d5f11838f 1136 HAL_SD_ErrorTypedef tmp3;
mbed_official 235:685d5f11838f 1137
mbed_official 235:685d5f11838f 1138 /* Wait for DMA/SD transfer end or SD error variables to be in SD handle */
mbed_official 235:685d5f11838f 1139 tmp1 = hsd->DmaTransferCplt;
mbed_official 235:685d5f11838f 1140 tmp2 = hsd->SdTransferCplt;
mbed_official 235:685d5f11838f 1141 tmp3 = (HAL_SD_ErrorTypedef)hsd->SdTransferErr;
mbed_official 235:685d5f11838f 1142
mbed_official 235:685d5f11838f 1143 while ((tmp1 == 0) && (tmp2 == 0) && (tmp3 == SD_OK) && (timeout > 0))
mbed_official 235:685d5f11838f 1144 {
mbed_official 235:685d5f11838f 1145 tmp1 = hsd->DmaTransferCplt;
mbed_official 235:685d5f11838f 1146 tmp2 = hsd->SdTransferCplt;
mbed_official 235:685d5f11838f 1147 tmp3 = (HAL_SD_ErrorTypedef)hsd->SdTransferErr;
mbed_official 235:685d5f11838f 1148 timeout--;
mbed_official 235:685d5f11838f 1149 }
mbed_official 235:685d5f11838f 1150
mbed_official 235:685d5f11838f 1151 timeout = Timeout;
mbed_official 235:685d5f11838f 1152
mbed_official 235:685d5f11838f 1153 /* Wait until the Rx transfer is no longer active */
mbed_official 235:685d5f11838f 1154 while((__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXACT)) && (timeout > 0))
mbed_official 235:685d5f11838f 1155 {
mbed_official 235:685d5f11838f 1156 timeout--;
mbed_official 235:685d5f11838f 1157 }
mbed_official 235:685d5f11838f 1158
mbed_official 235:685d5f11838f 1159 /* Send stop command in multiblock read */
mbed_official 235:685d5f11838f 1160 if (hsd->SdOperation == SD_READ_MULTIPLE_BLOCK)
mbed_official 235:685d5f11838f 1161 {
mbed_official 235:685d5f11838f 1162 errorstate = HAL_SD_StopTransfer(hsd);
mbed_official 235:685d5f11838f 1163 }
mbed_official 235:685d5f11838f 1164
mbed_official 235:685d5f11838f 1165 if ((timeout == 0) && (errorstate == SD_OK))
mbed_official 235:685d5f11838f 1166 {
mbed_official 235:685d5f11838f 1167 errorstate = SD_DATA_TIMEOUT;
mbed_official 235:685d5f11838f 1168 }
mbed_official 235:685d5f11838f 1169
mbed_official 235:685d5f11838f 1170 /* Clear all the static flags */
mbed_official 235:685d5f11838f 1171 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
mbed_official 235:685d5f11838f 1172
mbed_official 235:685d5f11838f 1173 /* Return error state */
mbed_official 235:685d5f11838f 1174 if (hsd->SdTransferErr != SD_OK)
mbed_official 235:685d5f11838f 1175 {
mbed_official 235:685d5f11838f 1176 return (HAL_SD_ErrorTypedef)(hsd->SdTransferErr);
mbed_official 235:685d5f11838f 1177 }
mbed_official 235:685d5f11838f 1178
mbed_official 235:685d5f11838f 1179 return errorstate;
mbed_official 235:685d5f11838f 1180 }
mbed_official 235:685d5f11838f 1181
mbed_official 235:685d5f11838f 1182 /**
mbed_official 235:685d5f11838f 1183 * @brief This function waits until the SD DMA data write transfer is finished.
mbed_official 235:685d5f11838f 1184 * This API should be called after HAL_SD_WriteBlocks_DMA() function
mbed_official 235:685d5f11838f 1185 * to insure that all data sent by the card is already transferred by the
mbed_official 235:685d5f11838f 1186 * DMA controller.
mbed_official 235:685d5f11838f 1187 * @param hsd: SD handle
mbed_official 235:685d5f11838f 1188 * @param Timeout: Timeout duration
mbed_official 235:685d5f11838f 1189 * @retval SD Card error state
mbed_official 235:685d5f11838f 1190 */
mbed_official 235:685d5f11838f 1191 HAL_SD_ErrorTypedef HAL_SD_CheckWriteOperation(SD_HandleTypeDef *hsd, uint32_t Timeout)
mbed_official 235:685d5f11838f 1192 {
mbed_official 235:685d5f11838f 1193 HAL_SD_ErrorTypedef errorstate = SD_OK;
mbed_official 235:685d5f11838f 1194 uint32_t timeout = Timeout;
mbed_official 235:685d5f11838f 1195 uint32_t tmp1, tmp2;
mbed_official 235:685d5f11838f 1196 HAL_SD_ErrorTypedef tmp3;
mbed_official 235:685d5f11838f 1197
mbed_official 235:685d5f11838f 1198 /* Wait for DMA/SD transfer end or SD error variables to be in SD handle */
mbed_official 235:685d5f11838f 1199 tmp1 = hsd->DmaTransferCplt;
mbed_official 235:685d5f11838f 1200 tmp2 = hsd->SdTransferCplt;
mbed_official 235:685d5f11838f 1201 tmp3 = (HAL_SD_ErrorTypedef)hsd->SdTransferErr;
mbed_official 235:685d5f11838f 1202
mbed_official 235:685d5f11838f 1203 while ((tmp1 == 0) && (tmp2 == 0) && (tmp3 == SD_OK) && (timeout > 0))
mbed_official 235:685d5f11838f 1204 {
mbed_official 235:685d5f11838f 1205 tmp1 = hsd->DmaTransferCplt;
mbed_official 235:685d5f11838f 1206 tmp2 = hsd->SdTransferCplt;
mbed_official 235:685d5f11838f 1207 tmp3 = (HAL_SD_ErrorTypedef)hsd->SdTransferErr;
mbed_official 235:685d5f11838f 1208 timeout--;
mbed_official 235:685d5f11838f 1209 }
mbed_official 235:685d5f11838f 1210
mbed_official 235:685d5f11838f 1211 timeout = Timeout;
mbed_official 235:685d5f11838f 1212
mbed_official 235:685d5f11838f 1213 /* Wait until the Tx transfer is no longer active */
mbed_official 235:685d5f11838f 1214 while((__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_TXACT)) && (timeout > 0))
mbed_official 235:685d5f11838f 1215 {
mbed_official 235:685d5f11838f 1216 timeout--;
mbed_official 235:685d5f11838f 1217 }
mbed_official 235:685d5f11838f 1218
mbed_official 235:685d5f11838f 1219 /* Send stop command in multiblock write */
mbed_official 235:685d5f11838f 1220 if (hsd->SdOperation == SD_WRITE_MULTIPLE_BLOCK)
mbed_official 235:685d5f11838f 1221 {
mbed_official 235:685d5f11838f 1222 errorstate = HAL_SD_StopTransfer(hsd);
mbed_official 235:685d5f11838f 1223 }
mbed_official 235:685d5f11838f 1224
mbed_official 235:685d5f11838f 1225 if ((timeout == 0) && (errorstate == SD_OK))
mbed_official 235:685d5f11838f 1226 {
mbed_official 235:685d5f11838f 1227 errorstate = SD_DATA_TIMEOUT;
mbed_official 235:685d5f11838f 1228 }
mbed_official 235:685d5f11838f 1229
mbed_official 235:685d5f11838f 1230 /* Clear all the static flags */
mbed_official 235:685d5f11838f 1231 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
mbed_official 235:685d5f11838f 1232
mbed_official 235:685d5f11838f 1233 /* Return error state */
mbed_official 235:685d5f11838f 1234 if (hsd->SdTransferErr != SD_OK)
mbed_official 235:685d5f11838f 1235 {
mbed_official 235:685d5f11838f 1236 return (HAL_SD_ErrorTypedef)(hsd->SdTransferErr);
mbed_official 235:685d5f11838f 1237 }
mbed_official 235:685d5f11838f 1238
mbed_official 235:685d5f11838f 1239 /* Wait until write is complete */
mbed_official 235:685d5f11838f 1240 while(HAL_SD_GetStatus(hsd) != SD_TRANSFER_OK)
mbed_official 235:685d5f11838f 1241 {
mbed_official 235:685d5f11838f 1242 }
mbed_official 235:685d5f11838f 1243
mbed_official 235:685d5f11838f 1244 return errorstate;
mbed_official 235:685d5f11838f 1245 }
mbed_official 235:685d5f11838f 1246
mbed_official 235:685d5f11838f 1247 /**
mbed_official 235:685d5f11838f 1248 * @brief Erases the specified memory area of the given SD card.
mbed_official 235:685d5f11838f 1249 * @param hsd: SD handle
mbed_official 235:685d5f11838f 1250 * @param startaddr: Start byte address
mbed_official 235:685d5f11838f 1251 * @param endaddr: End byte address
mbed_official 235:685d5f11838f 1252 * @retval SD Card error state
mbed_official 235:685d5f11838f 1253 */
mbed_official 235:685d5f11838f 1254 HAL_SD_ErrorTypedef HAL_SD_Erase(SD_HandleTypeDef *hsd, uint64_t startaddr, uint64_t endaddr)
mbed_official 235:685d5f11838f 1255 {
mbed_official 235:685d5f11838f 1256 HAL_SD_ErrorTypedef errorstate = SD_OK;
mbed_official 235:685d5f11838f 1257 SDIO_CmdInitTypeDef sdio_cmdinitstructure;
mbed_official 235:685d5f11838f 1258
mbed_official 235:685d5f11838f 1259 uint32_t delay = 0;
mbed_official 235:685d5f11838f 1260 __IO uint32_t maxdelay = 0;
mbed_official 235:685d5f11838f 1261 uint8_t cardstate = 0;
mbed_official 235:685d5f11838f 1262
mbed_official 235:685d5f11838f 1263 /* Check if the card command class supports erase command */
mbed_official 235:685d5f11838f 1264 if (((hsd->CSD[1] >> 20) & SD_CCCC_ERASE) == 0)
mbed_official 235:685d5f11838f 1265 {
mbed_official 235:685d5f11838f 1266 errorstate = SD_REQUEST_NOT_APPLICABLE;
mbed_official 235:685d5f11838f 1267
mbed_official 235:685d5f11838f 1268 return errorstate;
mbed_official 235:685d5f11838f 1269 }
mbed_official 235:685d5f11838f 1270
mbed_official 235:685d5f11838f 1271 /* Get max delay value */
mbed_official 235:685d5f11838f 1272 maxdelay = 120000 / (((hsd->Instance->CLKCR) & 0xFF) + 2);
mbed_official 235:685d5f11838f 1273
mbed_official 235:685d5f11838f 1274 if((SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED) == SD_CARD_LOCKED)
mbed_official 235:685d5f11838f 1275 {
mbed_official 235:685d5f11838f 1276 errorstate = SD_LOCK_UNLOCK_FAILED;
mbed_official 235:685d5f11838f 1277
mbed_official 235:685d5f11838f 1278 return errorstate;
mbed_official 235:685d5f11838f 1279 }
mbed_official 235:685d5f11838f 1280
mbed_official 235:685d5f11838f 1281 /* Get start and end block for high capacity cards */
mbed_official 235:685d5f11838f 1282 if (hsd->CardType == HIGH_CAPACITY_SD_CARD)
mbed_official 235:685d5f11838f 1283 {
mbed_official 235:685d5f11838f 1284 startaddr /= 512;
mbed_official 235:685d5f11838f 1285 endaddr /= 512;
mbed_official 235:685d5f11838f 1286 }
mbed_official 235:685d5f11838f 1287
mbed_official 235:685d5f11838f 1288 /* According to sd-card spec 1.0 ERASE_GROUP_START (CMD32) and erase_group_end(CMD33) */
mbed_official 235:685d5f11838f 1289 if ((hsd->CardType == STD_CAPACITY_SD_CARD_V1_1) || (hsd->CardType == STD_CAPACITY_SD_CARD_V2_0) ||\
mbed_official 235:685d5f11838f 1290 (hsd->CardType == HIGH_CAPACITY_SD_CARD))
mbed_official 235:685d5f11838f 1291 {
mbed_official 235:685d5f11838f 1292 /* Send CMD32 SD_ERASE_GRP_START with argument as addr */
mbed_official 235:685d5f11838f 1293 sdio_cmdinitstructure.Argument =(uint32_t)startaddr;
mbed_official 235:685d5f11838f 1294 sdio_cmdinitstructure.CmdIndex = SD_CMD_SD_ERASE_GRP_START;
mbed_official 235:685d5f11838f 1295 sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT;
mbed_official 235:685d5f11838f 1296 sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
mbed_official 235:685d5f11838f 1297 sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE;
mbed_official 235:685d5f11838f 1298 SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
mbed_official 235:685d5f11838f 1299
mbed_official 235:685d5f11838f 1300 /* Check for error conditions */
mbed_official 235:685d5f11838f 1301 errorstate = SD_CmdResp1Error(hsd, SD_CMD_SD_ERASE_GRP_START);
mbed_official 235:685d5f11838f 1302
mbed_official 235:685d5f11838f 1303 if (errorstate != SD_OK)
mbed_official 235:685d5f11838f 1304 {
mbed_official 235:685d5f11838f 1305 return errorstate;
mbed_official 235:685d5f11838f 1306 }
mbed_official 235:685d5f11838f 1307
mbed_official 235:685d5f11838f 1308 /* Send CMD33 SD_ERASE_GRP_END with argument as addr */
mbed_official 235:685d5f11838f 1309 sdio_cmdinitstructure.Argument = (uint32_t)endaddr;
mbed_official 235:685d5f11838f 1310 sdio_cmdinitstructure.CmdIndex = SD_CMD_SD_ERASE_GRP_END;
mbed_official 235:685d5f11838f 1311 SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
mbed_official 235:685d5f11838f 1312
mbed_official 235:685d5f11838f 1313 /* Check for error conditions */
mbed_official 235:685d5f11838f 1314 errorstate = SD_CmdResp1Error(hsd, SD_CMD_SD_ERASE_GRP_END);
mbed_official 235:685d5f11838f 1315
mbed_official 235:685d5f11838f 1316 if (errorstate != SD_OK)
mbed_official 235:685d5f11838f 1317 {
mbed_official 235:685d5f11838f 1318 return errorstate;
mbed_official 235:685d5f11838f 1319 }
mbed_official 235:685d5f11838f 1320 }
mbed_official 235:685d5f11838f 1321
mbed_official 235:685d5f11838f 1322 /* Send CMD38 ERASE */
mbed_official 235:685d5f11838f 1323 sdio_cmdinitstructure.Argument = 0;
mbed_official 235:685d5f11838f 1324 sdio_cmdinitstructure.CmdIndex = SD_CMD_ERASE;
mbed_official 235:685d5f11838f 1325 SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
mbed_official 235:685d5f11838f 1326
mbed_official 235:685d5f11838f 1327 /* Check for error conditions */
mbed_official 235:685d5f11838f 1328 errorstate = SD_CmdResp1Error(hsd, SD_CMD_ERASE);
mbed_official 235:685d5f11838f 1329
mbed_official 235:685d5f11838f 1330 if (errorstate != SD_OK)
mbed_official 235:685d5f11838f 1331 {
mbed_official 235:685d5f11838f 1332 return errorstate;
mbed_official 235:685d5f11838f 1333 }
mbed_official 235:685d5f11838f 1334
mbed_official 235:685d5f11838f 1335 for (; delay < maxdelay; delay++)
mbed_official 235:685d5f11838f 1336 {
mbed_official 235:685d5f11838f 1337 }
mbed_official 235:685d5f11838f 1338
mbed_official 532:fe11edbda85c 1339 /* Wait until the card is in programming state */
mbed_official 235:685d5f11838f 1340 errorstate = SD_IsCardProgramming(hsd, &cardstate);
mbed_official 235:685d5f11838f 1341
mbed_official 235:685d5f11838f 1342 delay = SD_DATATIMEOUT;
mbed_official 235:685d5f11838f 1343
mbed_official 235:685d5f11838f 1344 while ((delay > 0) && (errorstate == SD_OK) && ((cardstate == SD_CARD_PROGRAMMING) || (cardstate == SD_CARD_RECEIVING)))
mbed_official 235:685d5f11838f 1345 {
mbed_official 235:685d5f11838f 1346 errorstate = SD_IsCardProgramming(hsd, &cardstate);
mbed_official 235:685d5f11838f 1347 delay--;
mbed_official 235:685d5f11838f 1348 }
mbed_official 235:685d5f11838f 1349
mbed_official 235:685d5f11838f 1350 return errorstate;
mbed_official 235:685d5f11838f 1351 }
mbed_official 235:685d5f11838f 1352
mbed_official 235:685d5f11838f 1353 /**
mbed_official 235:685d5f11838f 1354 * @brief This function handles SD card interrupt request.
mbed_official 235:685d5f11838f 1355 * @param hsd: SD handle
mbed_official 235:685d5f11838f 1356 * @retval None
mbed_official 235:685d5f11838f 1357 */
mbed_official 235:685d5f11838f 1358 void HAL_SD_IRQHandler(SD_HandleTypeDef *hsd)
mbed_official 235:685d5f11838f 1359 {
mbed_official 235:685d5f11838f 1360 /* Check for SDIO interrupt flags */
mbed_official 235:685d5f11838f 1361 if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_IT_DATAEND))
mbed_official 235:685d5f11838f 1362 {
mbed_official 235:685d5f11838f 1363 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_IT_DATAEND);
mbed_official 235:685d5f11838f 1364
mbed_official 235:685d5f11838f 1365 /* SD transfer is complete */
mbed_official 235:685d5f11838f 1366 hsd->SdTransferCplt = 1;
mbed_official 235:685d5f11838f 1367
mbed_official 235:685d5f11838f 1368 /* No transfer error */
mbed_official 235:685d5f11838f 1369 hsd->SdTransferErr = SD_OK;
mbed_official 235:685d5f11838f 1370
mbed_official 235:685d5f11838f 1371 HAL_SD_XferCpltCallback(hsd);
mbed_official 235:685d5f11838f 1372 }
mbed_official 235:685d5f11838f 1373 else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_IT_DCRCFAIL))
mbed_official 235:685d5f11838f 1374 {
mbed_official 235:685d5f11838f 1375 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DCRCFAIL);
mbed_official 235:685d5f11838f 1376
mbed_official 235:685d5f11838f 1377 hsd->SdTransferErr = SD_DATA_CRC_FAIL;
mbed_official 235:685d5f11838f 1378
mbed_official 235:685d5f11838f 1379 HAL_SD_XferErrorCallback(hsd);
mbed_official 235:685d5f11838f 1380
mbed_official 235:685d5f11838f 1381 }
mbed_official 235:685d5f11838f 1382 else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_IT_DTIMEOUT))
mbed_official 235:685d5f11838f 1383 {
mbed_official 235:685d5f11838f 1384 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DTIMEOUT);
mbed_official 235:685d5f11838f 1385
mbed_official 235:685d5f11838f 1386 hsd->SdTransferErr = SD_DATA_TIMEOUT;
mbed_official 235:685d5f11838f 1387
mbed_official 235:685d5f11838f 1388 HAL_SD_XferErrorCallback(hsd);
mbed_official 235:685d5f11838f 1389 }
mbed_official 235:685d5f11838f 1390 else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_IT_RXOVERR))
mbed_official 235:685d5f11838f 1391 {
mbed_official 235:685d5f11838f 1392 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_RXOVERR);
mbed_official 235:685d5f11838f 1393
mbed_official 235:685d5f11838f 1394 hsd->SdTransferErr = SD_RX_OVERRUN;
mbed_official 235:685d5f11838f 1395
mbed_official 235:685d5f11838f 1396 HAL_SD_XferErrorCallback(hsd);
mbed_official 235:685d5f11838f 1397 }
mbed_official 235:685d5f11838f 1398 else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_IT_TXUNDERR))
mbed_official 235:685d5f11838f 1399 {
mbed_official 235:685d5f11838f 1400 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_TXUNDERR);
mbed_official 235:685d5f11838f 1401
mbed_official 235:685d5f11838f 1402 hsd->SdTransferErr = SD_TX_UNDERRUN;
mbed_official 235:685d5f11838f 1403
mbed_official 235:685d5f11838f 1404 HAL_SD_XferErrorCallback(hsd);
mbed_official 235:685d5f11838f 1405 }
mbed_official 532:fe11edbda85c 1406 #ifdef SDIO_STA_STBITERR
mbed_official 235:685d5f11838f 1407 else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_IT_STBITERR))
mbed_official 235:685d5f11838f 1408 {
mbed_official 235:685d5f11838f 1409 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_STBITERR);
mbed_official 235:685d5f11838f 1410
mbed_official 235:685d5f11838f 1411 hsd->SdTransferErr = SD_START_BIT_ERR;
mbed_official 235:685d5f11838f 1412
mbed_official 235:685d5f11838f 1413 HAL_SD_XferErrorCallback(hsd);
mbed_official 235:685d5f11838f 1414 }
mbed_official 532:fe11edbda85c 1415 #endif /* SDIO_STA_STBITERR */
mbed_official 235:685d5f11838f 1416 else
mbed_official 235:685d5f11838f 1417 {
mbed_official 235:685d5f11838f 1418 /* No error flag set */
mbed_official 532:fe11edbda85c 1419 }
mbed_official 235:685d5f11838f 1420
mbed_official 235:685d5f11838f 1421 /* Disable all SDIO peripheral interrupt sources */
mbed_official 532:fe11edbda85c 1422 #ifdef SDIO_STA_STBITERR
mbed_official 235:685d5f11838f 1423 __HAL_SD_SDIO_DISABLE_IT(hsd, SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |\
mbed_official 235:685d5f11838f 1424 SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR |\
mbed_official 532:fe11edbda85c 1425 SDIO_IT_RXOVERR | SDIO_IT_STBITERR);
mbed_official 532:fe11edbda85c 1426 #else /* SDIO_STA_STBITERR not defined */
mbed_official 532:fe11edbda85c 1427 __HAL_SD_SDIO_DISABLE_IT(hsd, SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |\
mbed_official 532:fe11edbda85c 1428 SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR |\
mbed_official 532:fe11edbda85c 1429 SDIO_IT_RXOVERR);
mbed_official 532:fe11edbda85c 1430 #endif /* SDIO_STA_STBITERR */
mbed_official 235:685d5f11838f 1431 }
mbed_official 235:685d5f11838f 1432
mbed_official 235:685d5f11838f 1433
mbed_official 235:685d5f11838f 1434 /**
mbed_official 235:685d5f11838f 1435 * @brief SD end of transfer callback.
mbed_official 235:685d5f11838f 1436 * @param hsd: SD handle
mbed_official 235:685d5f11838f 1437 * @retval None
mbed_official 235:685d5f11838f 1438 */
mbed_official 235:685d5f11838f 1439 __weak void HAL_SD_XferCpltCallback(SD_HandleTypeDef *hsd)
mbed_official 235:685d5f11838f 1440 {
mbed_official 235:685d5f11838f 1441 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 235:685d5f11838f 1442 the HAL_SD_XferCpltCallback could be implemented in the user file
mbed_official 235:685d5f11838f 1443 */
mbed_official 235:685d5f11838f 1444 }
mbed_official 235:685d5f11838f 1445
mbed_official 235:685d5f11838f 1446 /**
mbed_official 235:685d5f11838f 1447 * @brief SD Transfer Error callback.
mbed_official 235:685d5f11838f 1448 * @param hsd: SD handle
mbed_official 235:685d5f11838f 1449 * @retval None
mbed_official 235:685d5f11838f 1450 */
mbed_official 235:685d5f11838f 1451 __weak void HAL_SD_XferErrorCallback(SD_HandleTypeDef *hsd)
mbed_official 235:685d5f11838f 1452 {
mbed_official 235:685d5f11838f 1453 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 235:685d5f11838f 1454 the HAL_SD_XferErrorCallback could be implemented in the user file
mbed_official 235:685d5f11838f 1455 */
mbed_official 235:685d5f11838f 1456 }
mbed_official 235:685d5f11838f 1457
mbed_official 235:685d5f11838f 1458 /**
mbed_official 235:685d5f11838f 1459 * @brief SD Transfer complete Rx callback in non blocking mode.
mbed_official 235:685d5f11838f 1460 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
mbed_official 235:685d5f11838f 1461 * the configuration information for the specified DMA module.
mbed_official 235:685d5f11838f 1462 * @retval None
mbed_official 235:685d5f11838f 1463 */
mbed_official 235:685d5f11838f 1464 __weak void HAL_SD_DMA_RxCpltCallback(DMA_HandleTypeDef *hdma)
mbed_official 235:685d5f11838f 1465 {
mbed_official 235:685d5f11838f 1466 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 235:685d5f11838f 1467 the HAL_SD_DMA_RxCpltCallback could be implemented in the user file
mbed_official 235:685d5f11838f 1468 */
mbed_official 235:685d5f11838f 1469 }
mbed_official 235:685d5f11838f 1470
mbed_official 235:685d5f11838f 1471 /**
mbed_official 235:685d5f11838f 1472 * @brief SD DMA transfer complete Rx error callback.
mbed_official 235:685d5f11838f 1473 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
mbed_official 235:685d5f11838f 1474 * the configuration information for the specified DMA module.
mbed_official 235:685d5f11838f 1475 * @retval None
mbed_official 235:685d5f11838f 1476 */
mbed_official 235:685d5f11838f 1477 __weak void HAL_SD_DMA_RxErrorCallback(DMA_HandleTypeDef *hdma)
mbed_official 235:685d5f11838f 1478 {
mbed_official 235:685d5f11838f 1479 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 235:685d5f11838f 1480 the HAL_SD_DMA_RxErrorCallback could be implemented in the user file
mbed_official 235:685d5f11838f 1481 */
mbed_official 235:685d5f11838f 1482 }
mbed_official 235:685d5f11838f 1483
mbed_official 235:685d5f11838f 1484 /**
mbed_official 235:685d5f11838f 1485 * @brief SD Transfer complete Tx callback in non blocking mode.
mbed_official 235:685d5f11838f 1486 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
mbed_official 235:685d5f11838f 1487 * the configuration information for the specified DMA module.
mbed_official 235:685d5f11838f 1488 * @retval None
mbed_official 235:685d5f11838f 1489 */
mbed_official 235:685d5f11838f 1490 __weak void HAL_SD_DMA_TxCpltCallback(DMA_HandleTypeDef *hdma)
mbed_official 235:685d5f11838f 1491 {
mbed_official 235:685d5f11838f 1492 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 235:685d5f11838f 1493 the HAL_SD_DMA_TxCpltCallback could be implemented in the user file
mbed_official 235:685d5f11838f 1494 */
mbed_official 235:685d5f11838f 1495 }
mbed_official 235:685d5f11838f 1496
mbed_official 235:685d5f11838f 1497 /**
mbed_official 235:685d5f11838f 1498 * @brief SD DMA transfer complete error Tx callback.
mbed_official 235:685d5f11838f 1499 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
mbed_official 235:685d5f11838f 1500 * the configuration information for the specified DMA module.
mbed_official 235:685d5f11838f 1501 * @retval None
mbed_official 235:685d5f11838f 1502 */
mbed_official 235:685d5f11838f 1503 __weak void HAL_SD_DMA_TxErrorCallback(DMA_HandleTypeDef *hdma)
mbed_official 235:685d5f11838f 1504 {
mbed_official 235:685d5f11838f 1505 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 235:685d5f11838f 1506 the HAL_SD_DMA_TxErrorCallback could be implemented in the user file
mbed_official 235:685d5f11838f 1507 */
mbed_official 235:685d5f11838f 1508 }
mbed_official 235:685d5f11838f 1509
mbed_official 235:685d5f11838f 1510 /**
mbed_official 235:685d5f11838f 1511 * @}
mbed_official 235:685d5f11838f 1512 */
mbed_official 235:685d5f11838f 1513
mbed_official 532:fe11edbda85c 1514 /** @addtogroup SD_Exported_Functions_Group3
mbed_official 235:685d5f11838f 1515 * @brief management functions
mbed_official 235:685d5f11838f 1516 *
mbed_official 235:685d5f11838f 1517 @verbatim
mbed_official 235:685d5f11838f 1518 ==============================================================================
mbed_official 235:685d5f11838f 1519 ##### Peripheral Control functions #####
mbed_official 235:685d5f11838f 1520 ==============================================================================
mbed_official 235:685d5f11838f 1521 [..]
mbed_official 235:685d5f11838f 1522 This subsection provides a set of functions allowing to control the SD card
mbed_official 235:685d5f11838f 1523 operations.
mbed_official 235:685d5f11838f 1524
mbed_official 235:685d5f11838f 1525 @endverbatim
mbed_official 235:685d5f11838f 1526 * @{
mbed_official 235:685d5f11838f 1527 */
mbed_official 235:685d5f11838f 1528
mbed_official 235:685d5f11838f 1529 /**
mbed_official 235:685d5f11838f 1530 * @brief Returns information about specific card.
mbed_official 235:685d5f11838f 1531 * @param hsd: SD handle
mbed_official 235:685d5f11838f 1532 * @param pCardInfo: Pointer to a HAL_SD_CardInfoTypedef structure that
mbed_official 235:685d5f11838f 1533 * contains all SD cardinformation
mbed_official 235:685d5f11838f 1534 * @retval SD Card error state
mbed_official 235:685d5f11838f 1535 */
mbed_official 235:685d5f11838f 1536 HAL_SD_ErrorTypedef HAL_SD_Get_CardInfo(SD_HandleTypeDef *hsd, HAL_SD_CardInfoTypedef *pCardInfo)
mbed_official 235:685d5f11838f 1537 {
mbed_official 235:685d5f11838f 1538 HAL_SD_ErrorTypedef errorstate = SD_OK;
mbed_official 235:685d5f11838f 1539 uint32_t tmp = 0;
mbed_official 235:685d5f11838f 1540
mbed_official 235:685d5f11838f 1541 pCardInfo->CardType = (uint8_t)(hsd->CardType);
mbed_official 235:685d5f11838f 1542 pCardInfo->RCA = (uint16_t)(hsd->RCA);
mbed_official 235:685d5f11838f 1543
mbed_official 235:685d5f11838f 1544 /* Byte 0 */
mbed_official 235:685d5f11838f 1545 tmp = (hsd->CSD[0] & 0xFF000000) >> 24;
mbed_official 235:685d5f11838f 1546 pCardInfo->SD_csd.CSDStruct = (uint8_t)((tmp & 0xC0) >> 6);
mbed_official 235:685d5f11838f 1547 pCardInfo->SD_csd.SysSpecVersion = (uint8_t)((tmp & 0x3C) >> 2);
mbed_official 235:685d5f11838f 1548 pCardInfo->SD_csd.Reserved1 = tmp & 0x03;
mbed_official 235:685d5f11838f 1549
mbed_official 235:685d5f11838f 1550 /* Byte 1 */
mbed_official 235:685d5f11838f 1551 tmp = (hsd->CSD[0] & 0x00FF0000) >> 16;
mbed_official 235:685d5f11838f 1552 pCardInfo->SD_csd.TAAC = (uint8_t)tmp;
mbed_official 235:685d5f11838f 1553
mbed_official 235:685d5f11838f 1554 /* Byte 2 */
mbed_official 235:685d5f11838f 1555 tmp = (hsd->CSD[0] & 0x0000FF00) >> 8;
mbed_official 235:685d5f11838f 1556 pCardInfo->SD_csd.NSAC = (uint8_t)tmp;
mbed_official 235:685d5f11838f 1557
mbed_official 235:685d5f11838f 1558 /* Byte 3 */
mbed_official 235:685d5f11838f 1559 tmp = hsd->CSD[0] & 0x000000FF;
mbed_official 235:685d5f11838f 1560 pCardInfo->SD_csd.MaxBusClkFrec = (uint8_t)tmp;
mbed_official 235:685d5f11838f 1561
mbed_official 235:685d5f11838f 1562 /* Byte 4 */
mbed_official 235:685d5f11838f 1563 tmp = (hsd->CSD[1] & 0xFF000000) >> 24;
mbed_official 235:685d5f11838f 1564 pCardInfo->SD_csd.CardComdClasses = (uint16_t)(tmp << 4);
mbed_official 235:685d5f11838f 1565
mbed_official 235:685d5f11838f 1566 /* Byte 5 */
mbed_official 235:685d5f11838f 1567 tmp = (hsd->CSD[1] & 0x00FF0000) >> 16;
mbed_official 235:685d5f11838f 1568 pCardInfo->SD_csd.CardComdClasses |= (uint16_t)((tmp & 0xF0) >> 4);
mbed_official 235:685d5f11838f 1569 pCardInfo->SD_csd.RdBlockLen = (uint8_t)(tmp & 0x0F);
mbed_official 235:685d5f11838f 1570
mbed_official 235:685d5f11838f 1571 /* Byte 6 */
mbed_official 235:685d5f11838f 1572 tmp = (hsd->CSD[1] & 0x0000FF00) >> 8;
mbed_official 235:685d5f11838f 1573 pCardInfo->SD_csd.PartBlockRead = (uint8_t)((tmp & 0x80) >> 7);
mbed_official 235:685d5f11838f 1574 pCardInfo->SD_csd.WrBlockMisalign = (uint8_t)((tmp & 0x40) >> 6);
mbed_official 235:685d5f11838f 1575 pCardInfo->SD_csd.RdBlockMisalign = (uint8_t)((tmp & 0x20) >> 5);
mbed_official 235:685d5f11838f 1576 pCardInfo->SD_csd.DSRImpl = (uint8_t)((tmp & 0x10) >> 4);
mbed_official 235:685d5f11838f 1577 pCardInfo->SD_csd.Reserved2 = 0; /*!< Reserved */
mbed_official 235:685d5f11838f 1578
mbed_official 235:685d5f11838f 1579 if ((hsd->CardType == STD_CAPACITY_SD_CARD_V1_1) || (hsd->CardType == STD_CAPACITY_SD_CARD_V2_0))
mbed_official 235:685d5f11838f 1580 {
mbed_official 235:685d5f11838f 1581 pCardInfo->SD_csd.DeviceSize = (tmp & 0x03) << 10;
mbed_official 235:685d5f11838f 1582
mbed_official 235:685d5f11838f 1583 /* Byte 7 */
mbed_official 235:685d5f11838f 1584 tmp = (uint8_t)(hsd->CSD[1] & 0x000000FF);
mbed_official 235:685d5f11838f 1585 pCardInfo->SD_csd.DeviceSize |= (tmp) << 2;
mbed_official 235:685d5f11838f 1586
mbed_official 235:685d5f11838f 1587 /* Byte 8 */
mbed_official 235:685d5f11838f 1588 tmp = (uint8_t)((hsd->CSD[2] & 0xFF000000) >> 24);
mbed_official 235:685d5f11838f 1589 pCardInfo->SD_csd.DeviceSize |= (tmp & 0xC0) >> 6;
mbed_official 235:685d5f11838f 1590
mbed_official 235:685d5f11838f 1591 pCardInfo->SD_csd.MaxRdCurrentVDDMin = (tmp & 0x38) >> 3;
mbed_official 235:685d5f11838f 1592 pCardInfo->SD_csd.MaxRdCurrentVDDMax = (tmp & 0x07);
mbed_official 235:685d5f11838f 1593
mbed_official 235:685d5f11838f 1594 /* Byte 9 */
mbed_official 235:685d5f11838f 1595 tmp = (uint8_t)((hsd->CSD[2] & 0x00FF0000) >> 16);
mbed_official 235:685d5f11838f 1596 pCardInfo->SD_csd.MaxWrCurrentVDDMin = (tmp & 0xE0) >> 5;
mbed_official 235:685d5f11838f 1597 pCardInfo->SD_csd.MaxWrCurrentVDDMax = (tmp & 0x1C) >> 2;
mbed_official 235:685d5f11838f 1598 pCardInfo->SD_csd.DeviceSizeMul = (tmp & 0x03) << 1;
mbed_official 235:685d5f11838f 1599 /* Byte 10 */
mbed_official 235:685d5f11838f 1600 tmp = (uint8_t)((hsd->CSD[2] & 0x0000FF00) >> 8);
mbed_official 235:685d5f11838f 1601 pCardInfo->SD_csd.DeviceSizeMul |= (tmp & 0x80) >> 7;
mbed_official 235:685d5f11838f 1602
mbed_official 235:685d5f11838f 1603 pCardInfo->CardCapacity = (pCardInfo->SD_csd.DeviceSize + 1) ;
mbed_official 235:685d5f11838f 1604 pCardInfo->CardCapacity *= (1 << (pCardInfo->SD_csd.DeviceSizeMul + 2));
mbed_official 235:685d5f11838f 1605 pCardInfo->CardBlockSize = 1 << (pCardInfo->SD_csd.RdBlockLen);
mbed_official 235:685d5f11838f 1606 pCardInfo->CardCapacity *= pCardInfo->CardBlockSize;
mbed_official 235:685d5f11838f 1607 }
mbed_official 235:685d5f11838f 1608 else if (hsd->CardType == HIGH_CAPACITY_SD_CARD)
mbed_official 235:685d5f11838f 1609 {
mbed_official 235:685d5f11838f 1610 /* Byte 7 */
mbed_official 235:685d5f11838f 1611 tmp = (uint8_t)(hsd->CSD[1] & 0x000000FF);
mbed_official 235:685d5f11838f 1612 pCardInfo->SD_csd.DeviceSize = (tmp & 0x3F) << 16;
mbed_official 235:685d5f11838f 1613
mbed_official 235:685d5f11838f 1614 /* Byte 8 */
mbed_official 235:685d5f11838f 1615 tmp = (uint8_t)((hsd->CSD[2] & 0xFF000000) >> 24);
mbed_official 235:685d5f11838f 1616
mbed_official 235:685d5f11838f 1617 pCardInfo->SD_csd.DeviceSize |= (tmp << 8);
mbed_official 235:685d5f11838f 1618
mbed_official 235:685d5f11838f 1619 /* Byte 9 */
mbed_official 235:685d5f11838f 1620 tmp = (uint8_t)((hsd->CSD[2] & 0x00FF0000) >> 16);
mbed_official 235:685d5f11838f 1621
mbed_official 235:685d5f11838f 1622 pCardInfo->SD_csd.DeviceSize |= (tmp);
mbed_official 235:685d5f11838f 1623
mbed_official 235:685d5f11838f 1624 /* Byte 10 */
mbed_official 235:685d5f11838f 1625 tmp = (uint8_t)((hsd->CSD[2] & 0x0000FF00) >> 8);
mbed_official 235:685d5f11838f 1626
mbed_official 532:fe11edbda85c 1627 pCardInfo->CardCapacity = (uint64_t)((((uint64_t)pCardInfo->SD_csd.DeviceSize + 1)) * 512 * 1024);
mbed_official 235:685d5f11838f 1628 pCardInfo->CardBlockSize = 512;
mbed_official 235:685d5f11838f 1629 }
mbed_official 235:685d5f11838f 1630 else
mbed_official 235:685d5f11838f 1631 {
mbed_official 235:685d5f11838f 1632 /* Not supported card type */
mbed_official 235:685d5f11838f 1633 errorstate = SD_ERROR;
mbed_official 235:685d5f11838f 1634 }
mbed_official 532:fe11edbda85c 1635
mbed_official 235:685d5f11838f 1636 pCardInfo->SD_csd.EraseGrSize = (tmp & 0x40) >> 6;
mbed_official 235:685d5f11838f 1637 pCardInfo->SD_csd.EraseGrMul = (tmp & 0x3F) << 1;
mbed_official 235:685d5f11838f 1638
mbed_official 235:685d5f11838f 1639 /* Byte 11 */
mbed_official 235:685d5f11838f 1640 tmp = (uint8_t)(hsd->CSD[2] & 0x000000FF);
mbed_official 235:685d5f11838f 1641 pCardInfo->SD_csd.EraseGrMul |= (tmp & 0x80) >> 7;
mbed_official 235:685d5f11838f 1642 pCardInfo->SD_csd.WrProtectGrSize = (tmp & 0x7F);
mbed_official 235:685d5f11838f 1643
mbed_official 235:685d5f11838f 1644 /* Byte 12 */
mbed_official 235:685d5f11838f 1645 tmp = (uint8_t)((hsd->CSD[3] & 0xFF000000) >> 24);
mbed_official 235:685d5f11838f 1646 pCardInfo->SD_csd.WrProtectGrEnable = (tmp & 0x80) >> 7;
mbed_official 235:685d5f11838f 1647 pCardInfo->SD_csd.ManDeflECC = (tmp & 0x60) >> 5;
mbed_official 235:685d5f11838f 1648 pCardInfo->SD_csd.WrSpeedFact = (tmp & 0x1C) >> 2;
mbed_official 235:685d5f11838f 1649 pCardInfo->SD_csd.MaxWrBlockLen = (tmp & 0x03) << 2;
mbed_official 235:685d5f11838f 1650
mbed_official 235:685d5f11838f 1651 /* Byte 13 */
mbed_official 235:685d5f11838f 1652 tmp = (uint8_t)((hsd->CSD[3] & 0x00FF0000) >> 16);
mbed_official 235:685d5f11838f 1653 pCardInfo->SD_csd.MaxWrBlockLen |= (tmp & 0xC0) >> 6;
mbed_official 235:685d5f11838f 1654 pCardInfo->SD_csd.WriteBlockPaPartial = (tmp & 0x20) >> 5;
mbed_official 235:685d5f11838f 1655 pCardInfo->SD_csd.Reserved3 = 0;
mbed_official 235:685d5f11838f 1656 pCardInfo->SD_csd.ContentProtectAppli = (tmp & 0x01);
mbed_official 235:685d5f11838f 1657
mbed_official 235:685d5f11838f 1658 /* Byte 14 */
mbed_official 235:685d5f11838f 1659 tmp = (uint8_t)((hsd->CSD[3] & 0x0000FF00) >> 8);
mbed_official 235:685d5f11838f 1660 pCardInfo->SD_csd.FileFormatGrouop = (tmp & 0x80) >> 7;
mbed_official 235:685d5f11838f 1661 pCardInfo->SD_csd.CopyFlag = (tmp & 0x40) >> 6;
mbed_official 235:685d5f11838f 1662 pCardInfo->SD_csd.PermWrProtect = (tmp & 0x20) >> 5;
mbed_official 235:685d5f11838f 1663 pCardInfo->SD_csd.TempWrProtect = (tmp & 0x10) >> 4;
mbed_official 235:685d5f11838f 1664 pCardInfo->SD_csd.FileFormat = (tmp & 0x0C) >> 2;
mbed_official 235:685d5f11838f 1665 pCardInfo->SD_csd.ECC = (tmp & 0x03);
mbed_official 235:685d5f11838f 1666
mbed_official 235:685d5f11838f 1667 /* Byte 15 */
mbed_official 235:685d5f11838f 1668 tmp = (uint8_t)(hsd->CSD[3] & 0x000000FF);
mbed_official 235:685d5f11838f 1669 pCardInfo->SD_csd.CSD_CRC = (tmp & 0xFE) >> 1;
mbed_official 235:685d5f11838f 1670 pCardInfo->SD_csd.Reserved4 = 1;
mbed_official 235:685d5f11838f 1671
mbed_official 235:685d5f11838f 1672 /* Byte 0 */
mbed_official 235:685d5f11838f 1673 tmp = (uint8_t)((hsd->CID[0] & 0xFF000000) >> 24);
mbed_official 235:685d5f11838f 1674 pCardInfo->SD_cid.ManufacturerID = tmp;
mbed_official 235:685d5f11838f 1675
mbed_official 235:685d5f11838f 1676 /* Byte 1 */
mbed_official 235:685d5f11838f 1677 tmp = (uint8_t)((hsd->CID[0] & 0x00FF0000) >> 16);
mbed_official 235:685d5f11838f 1678 pCardInfo->SD_cid.OEM_AppliID = tmp << 8;
mbed_official 235:685d5f11838f 1679
mbed_official 235:685d5f11838f 1680 /* Byte 2 */
mbed_official 235:685d5f11838f 1681 tmp = (uint8_t)((hsd->CID[0] & 0x000000FF00) >> 8);
mbed_official 235:685d5f11838f 1682 pCardInfo->SD_cid.OEM_AppliID |= tmp;
mbed_official 235:685d5f11838f 1683
mbed_official 235:685d5f11838f 1684 /* Byte 3 */
mbed_official 235:685d5f11838f 1685 tmp = (uint8_t)(hsd->CID[0] & 0x000000FF);
mbed_official 235:685d5f11838f 1686 pCardInfo->SD_cid.ProdName1 = tmp << 24;
mbed_official 235:685d5f11838f 1687
mbed_official 235:685d5f11838f 1688 /* Byte 4 */
mbed_official 235:685d5f11838f 1689 tmp = (uint8_t)((hsd->CID[1] & 0xFF000000) >> 24);
mbed_official 235:685d5f11838f 1690 pCardInfo->SD_cid.ProdName1 |= tmp << 16;
mbed_official 235:685d5f11838f 1691
mbed_official 235:685d5f11838f 1692 /* Byte 5 */
mbed_official 235:685d5f11838f 1693 tmp = (uint8_t)((hsd->CID[1] & 0x00FF0000) >> 16);
mbed_official 235:685d5f11838f 1694 pCardInfo->SD_cid.ProdName1 |= tmp << 8;
mbed_official 235:685d5f11838f 1695
mbed_official 235:685d5f11838f 1696 /* Byte 6 */
mbed_official 235:685d5f11838f 1697 tmp = (uint8_t)((hsd->CID[1] & 0x0000FF00) >> 8);
mbed_official 235:685d5f11838f 1698 pCardInfo->SD_cid.ProdName1 |= tmp;
mbed_official 235:685d5f11838f 1699
mbed_official 235:685d5f11838f 1700 /* Byte 7 */
mbed_official 235:685d5f11838f 1701 tmp = (uint8_t)(hsd->CID[1] & 0x000000FF);
mbed_official 235:685d5f11838f 1702 pCardInfo->SD_cid.ProdName2 = tmp;
mbed_official 235:685d5f11838f 1703
mbed_official 235:685d5f11838f 1704 /* Byte 8 */
mbed_official 235:685d5f11838f 1705 tmp = (uint8_t)((hsd->CID[2] & 0xFF000000) >> 24);
mbed_official 235:685d5f11838f 1706 pCardInfo->SD_cid.ProdRev = tmp;
mbed_official 235:685d5f11838f 1707
mbed_official 235:685d5f11838f 1708 /* Byte 9 */
mbed_official 235:685d5f11838f 1709 tmp = (uint8_t)((hsd->CID[2] & 0x00FF0000) >> 16);
mbed_official 235:685d5f11838f 1710 pCardInfo->SD_cid.ProdSN = tmp << 24;
mbed_official 235:685d5f11838f 1711
mbed_official 235:685d5f11838f 1712 /* Byte 10 */
mbed_official 235:685d5f11838f 1713 tmp = (uint8_t)((hsd->CID[2] & 0x0000FF00) >> 8);
mbed_official 235:685d5f11838f 1714 pCardInfo->SD_cid.ProdSN |= tmp << 16;
mbed_official 235:685d5f11838f 1715
mbed_official 235:685d5f11838f 1716 /* Byte 11 */
mbed_official 235:685d5f11838f 1717 tmp = (uint8_t)(hsd->CID[2] & 0x000000FF);
mbed_official 235:685d5f11838f 1718 pCardInfo->SD_cid.ProdSN |= tmp << 8;
mbed_official 235:685d5f11838f 1719
mbed_official 235:685d5f11838f 1720 /* Byte 12 */
mbed_official 235:685d5f11838f 1721 tmp = (uint8_t)((hsd->CID[3] & 0xFF000000) >> 24);
mbed_official 235:685d5f11838f 1722 pCardInfo->SD_cid.ProdSN |= tmp;
mbed_official 235:685d5f11838f 1723
mbed_official 235:685d5f11838f 1724 /* Byte 13 */
mbed_official 235:685d5f11838f 1725 tmp = (uint8_t)((hsd->CID[3] & 0x00FF0000) >> 16);
mbed_official 235:685d5f11838f 1726 pCardInfo->SD_cid.Reserved1 |= (tmp & 0xF0) >> 4;
mbed_official 235:685d5f11838f 1727 pCardInfo->SD_cid.ManufactDate = (tmp & 0x0F) << 8;
mbed_official 235:685d5f11838f 1728
mbed_official 235:685d5f11838f 1729 /* Byte 14 */
mbed_official 235:685d5f11838f 1730 tmp = (uint8_t)((hsd->CID[3] & 0x0000FF00) >> 8);
mbed_official 235:685d5f11838f 1731 pCardInfo->SD_cid.ManufactDate |= tmp;
mbed_official 235:685d5f11838f 1732
mbed_official 235:685d5f11838f 1733 /* Byte 15 */
mbed_official 235:685d5f11838f 1734 tmp = (uint8_t)(hsd->CID[3] & 0x000000FF);
mbed_official 235:685d5f11838f 1735 pCardInfo->SD_cid.CID_CRC = (tmp & 0xFE) >> 1;
mbed_official 235:685d5f11838f 1736 pCardInfo->SD_cid.Reserved2 = 1;
mbed_official 235:685d5f11838f 1737
mbed_official 235:685d5f11838f 1738 return errorstate;
mbed_official 235:685d5f11838f 1739 }
mbed_official 235:685d5f11838f 1740
mbed_official 235:685d5f11838f 1741 /**
mbed_official 235:685d5f11838f 1742 * @brief Enables wide bus operation for the requested card if supported by
mbed_official 235:685d5f11838f 1743 * card.
mbed_official 235:685d5f11838f 1744 * @param hsd: SD handle
mbed_official 235:685d5f11838f 1745 * @param WideMode: Specifies the SD card wide bus mode
mbed_official 235:685d5f11838f 1746 * This parameter can be one of the following values:
mbed_official 235:685d5f11838f 1747 * @arg SDIO_BUS_WIDE_8B: 8-bit data transfer (Only for MMC)
mbed_official 235:685d5f11838f 1748 * @arg SDIO_BUS_WIDE_4B: 4-bit data transfer
mbed_official 235:685d5f11838f 1749 * @arg SDIO_BUS_WIDE_1B: 1-bit data transfer
mbed_official 235:685d5f11838f 1750 * @retval SD Card error state
mbed_official 235:685d5f11838f 1751 */
mbed_official 235:685d5f11838f 1752 HAL_SD_ErrorTypedef HAL_SD_WideBusOperation_Config(SD_HandleTypeDef *hsd, uint32_t WideMode)
mbed_official 235:685d5f11838f 1753 {
mbed_official 235:685d5f11838f 1754 HAL_SD_ErrorTypedef errorstate = SD_OK;
mbed_official 235:685d5f11838f 1755 SDIO_InitTypeDef tmpinit;
mbed_official 235:685d5f11838f 1756
mbed_official 235:685d5f11838f 1757 /* MMC Card does not support this feature */
mbed_official 235:685d5f11838f 1758 if (hsd->CardType == MULTIMEDIA_CARD)
mbed_official 235:685d5f11838f 1759 {
mbed_official 235:685d5f11838f 1760 errorstate = SD_UNSUPPORTED_FEATURE;
mbed_official 235:685d5f11838f 1761
mbed_official 235:685d5f11838f 1762 return errorstate;
mbed_official 235:685d5f11838f 1763 }
mbed_official 235:685d5f11838f 1764 else if ((hsd->CardType == STD_CAPACITY_SD_CARD_V1_1) || (hsd->CardType == STD_CAPACITY_SD_CARD_V2_0) ||\
mbed_official 235:685d5f11838f 1765 (hsd->CardType == HIGH_CAPACITY_SD_CARD))
mbed_official 235:685d5f11838f 1766 {
mbed_official 235:685d5f11838f 1767 if (WideMode == SDIO_BUS_WIDE_8B)
mbed_official 235:685d5f11838f 1768 {
mbed_official 235:685d5f11838f 1769 errorstate = SD_UNSUPPORTED_FEATURE;
mbed_official 235:685d5f11838f 1770 }
mbed_official 235:685d5f11838f 1771 else if (WideMode == SDIO_BUS_WIDE_4B)
mbed_official 235:685d5f11838f 1772 {
mbed_official 235:685d5f11838f 1773 errorstate = SD_WideBus_Enable(hsd);
mbed_official 235:685d5f11838f 1774 }
mbed_official 235:685d5f11838f 1775 else if (WideMode == SDIO_BUS_WIDE_1B)
mbed_official 235:685d5f11838f 1776 {
mbed_official 235:685d5f11838f 1777 errorstate = SD_WideBus_Disable(hsd);
mbed_official 235:685d5f11838f 1778 }
mbed_official 235:685d5f11838f 1779 else
mbed_official 235:685d5f11838f 1780 {
mbed_official 235:685d5f11838f 1781 /* WideMode is not a valid argument*/
mbed_official 235:685d5f11838f 1782 errorstate = SD_INVALID_PARAMETER;
mbed_official 235:685d5f11838f 1783 }
mbed_official 235:685d5f11838f 1784
mbed_official 235:685d5f11838f 1785 if (errorstate == SD_OK)
mbed_official 235:685d5f11838f 1786 {
mbed_official 235:685d5f11838f 1787 /* Configure the SDIO peripheral */
mbed_official 235:685d5f11838f 1788 tmpinit.ClockEdge = hsd->Init.ClockEdge;
mbed_official 235:685d5f11838f 1789 tmpinit.ClockBypass = hsd->Init.ClockBypass;
mbed_official 235:685d5f11838f 1790 tmpinit.ClockPowerSave = hsd->Init.ClockPowerSave;
mbed_official 235:685d5f11838f 1791 tmpinit.BusWide = WideMode;
mbed_official 235:685d5f11838f 1792 tmpinit.HardwareFlowControl = hsd->Init.HardwareFlowControl;
mbed_official 235:685d5f11838f 1793 tmpinit.ClockDiv = hsd->Init.ClockDiv;
mbed_official 235:685d5f11838f 1794 SDIO_Init(hsd->Instance, tmpinit);
mbed_official 235:685d5f11838f 1795 }
mbed_official 235:685d5f11838f 1796 }
mbed_official 235:685d5f11838f 1797
mbed_official 235:685d5f11838f 1798 return errorstate;
mbed_official 235:685d5f11838f 1799 }
mbed_official 235:685d5f11838f 1800
mbed_official 235:685d5f11838f 1801 /**
mbed_official 235:685d5f11838f 1802 * @brief Aborts an ongoing data transfer.
mbed_official 235:685d5f11838f 1803 * @param hsd: SD handle
mbed_official 235:685d5f11838f 1804 * @retval SD Card error state
mbed_official 235:685d5f11838f 1805 */
mbed_official 235:685d5f11838f 1806 HAL_SD_ErrorTypedef HAL_SD_StopTransfer(SD_HandleTypeDef *hsd)
mbed_official 235:685d5f11838f 1807 {
mbed_official 235:685d5f11838f 1808 SDIO_CmdInitTypeDef sdio_cmdinitstructure;
mbed_official 235:685d5f11838f 1809 HAL_SD_ErrorTypedef errorstate = SD_OK;
mbed_official 235:685d5f11838f 1810
mbed_official 235:685d5f11838f 1811 /* Send CMD12 STOP_TRANSMISSION */
mbed_official 235:685d5f11838f 1812 sdio_cmdinitstructure.Argument = 0;
mbed_official 235:685d5f11838f 1813 sdio_cmdinitstructure.CmdIndex = SD_CMD_STOP_TRANSMISSION;
mbed_official 235:685d5f11838f 1814 sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT;
mbed_official 235:685d5f11838f 1815 sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
mbed_official 235:685d5f11838f 1816 sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE;
mbed_official 235:685d5f11838f 1817 SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
mbed_official 235:685d5f11838f 1818
mbed_official 235:685d5f11838f 1819 /* Check for error conditions */
mbed_official 235:685d5f11838f 1820 errorstate = SD_CmdResp1Error(hsd, SD_CMD_STOP_TRANSMISSION);
mbed_official 235:685d5f11838f 1821
mbed_official 235:685d5f11838f 1822 return errorstate;
mbed_official 235:685d5f11838f 1823 }
mbed_official 235:685d5f11838f 1824
mbed_official 235:685d5f11838f 1825 /**
mbed_official 235:685d5f11838f 1826 * @brief Switches the SD card to High Speed mode.
mbed_official 235:685d5f11838f 1827 * This API must be used after "Transfer State"
mbed_official 235:685d5f11838f 1828 * @note This operation should be followed by the configuration
mbed_official 235:685d5f11838f 1829 * of PLL to have SDIOCK clock between 67 and 75 MHz
mbed_official 235:685d5f11838f 1830 * @param hsd: SD handle
mbed_official 235:685d5f11838f 1831 * @retval SD Card error state
mbed_official 235:685d5f11838f 1832 */
mbed_official 235:685d5f11838f 1833 HAL_SD_ErrorTypedef HAL_SD_HighSpeed (SD_HandleTypeDef *hsd)
mbed_official 235:685d5f11838f 1834 {
mbed_official 235:685d5f11838f 1835 HAL_SD_ErrorTypedef errorstate = SD_OK;
mbed_official 235:685d5f11838f 1836 SDIO_CmdInitTypeDef sdio_cmdinitstructure;
mbed_official 235:685d5f11838f 1837 SDIO_DataInitTypeDef sdio_datainitstructure;
mbed_official 235:685d5f11838f 1838
mbed_official 235:685d5f11838f 1839 uint8_t SD_hs[64] = {0};
mbed_official 235:685d5f11838f 1840 uint32_t SD_scr[2] = {0, 0};
mbed_official 235:685d5f11838f 1841 uint32_t SD_SPEC = 0 ;
mbed_official 235:685d5f11838f 1842 uint32_t count = 0, *tempbuff = (uint32_t *)SD_hs;
mbed_official 235:685d5f11838f 1843
mbed_official 235:685d5f11838f 1844 /* Initialize the Data control register */
mbed_official 235:685d5f11838f 1845 hsd->Instance->DCTRL = 0;
mbed_official 235:685d5f11838f 1846
mbed_official 235:685d5f11838f 1847 /* Get SCR Register */
mbed_official 235:685d5f11838f 1848 errorstate = SD_FindSCR(hsd, SD_scr);
mbed_official 235:685d5f11838f 1849
mbed_official 235:685d5f11838f 1850 if (errorstate != SD_OK)
mbed_official 235:685d5f11838f 1851 {
mbed_official 235:685d5f11838f 1852 return errorstate;
mbed_official 235:685d5f11838f 1853 }
mbed_official 235:685d5f11838f 1854
mbed_official 235:685d5f11838f 1855 /* Test the Version supported by the card*/
mbed_official 235:685d5f11838f 1856 SD_SPEC = (SD_scr[1] & 0x01000000) | (SD_scr[1] & 0x02000000);
mbed_official 235:685d5f11838f 1857
mbed_official 235:685d5f11838f 1858 if (SD_SPEC != SD_ALLZERO)
mbed_official 235:685d5f11838f 1859 {
mbed_official 235:685d5f11838f 1860 /* Set Block Size for Card */
mbed_official 235:685d5f11838f 1861 sdio_cmdinitstructure.Argument = (uint32_t)64;
mbed_official 235:685d5f11838f 1862 sdio_cmdinitstructure.CmdIndex = SD_CMD_SET_BLOCKLEN;
mbed_official 235:685d5f11838f 1863 sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT;
mbed_official 235:685d5f11838f 1864 sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
mbed_official 235:685d5f11838f 1865 sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE;
mbed_official 235:685d5f11838f 1866 SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
mbed_official 235:685d5f11838f 1867
mbed_official 235:685d5f11838f 1868 /* Check for error conditions */
mbed_official 235:685d5f11838f 1869 errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN);
mbed_official 235:685d5f11838f 1870
mbed_official 235:685d5f11838f 1871 if (errorstate != SD_OK)
mbed_official 235:685d5f11838f 1872 {
mbed_official 235:685d5f11838f 1873 return errorstate;
mbed_official 235:685d5f11838f 1874 }
mbed_official 235:685d5f11838f 1875
mbed_official 235:685d5f11838f 1876 /* Configure the SD DPSM (Data Path State Machine) */
mbed_official 235:685d5f11838f 1877 sdio_datainitstructure.DataTimeOut = SD_DATATIMEOUT;
mbed_official 235:685d5f11838f 1878 sdio_datainitstructure.DataLength = 64;
mbed_official 235:685d5f11838f 1879 sdio_datainitstructure.DataBlockSize = SDIO_DATABLOCK_SIZE_64B ;
mbed_official 235:685d5f11838f 1880 sdio_datainitstructure.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO;
mbed_official 235:685d5f11838f 1881 sdio_datainitstructure.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
mbed_official 235:685d5f11838f 1882 sdio_datainitstructure.DPSM = SDIO_DPSM_ENABLE;
mbed_official 235:685d5f11838f 1883 SDIO_DataConfig(hsd->Instance, &sdio_datainitstructure);
mbed_official 235:685d5f11838f 1884
mbed_official 235:685d5f11838f 1885 /* Send CMD6 switch mode */
mbed_official 235:685d5f11838f 1886 sdio_cmdinitstructure.Argument = 0x80FFFF01;
mbed_official 235:685d5f11838f 1887 sdio_cmdinitstructure.CmdIndex = SD_CMD_HS_SWITCH;
mbed_official 235:685d5f11838f 1888 SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
mbed_official 235:685d5f11838f 1889
mbed_official 235:685d5f11838f 1890 /* Check for error conditions */
mbed_official 235:685d5f11838f 1891 errorstate = SD_CmdResp1Error(hsd, SD_CMD_HS_SWITCH);
mbed_official 235:685d5f11838f 1892
mbed_official 235:685d5f11838f 1893 if (errorstate != SD_OK)
mbed_official 235:685d5f11838f 1894 {
mbed_official 235:685d5f11838f 1895 return errorstate;
mbed_official 235:685d5f11838f 1896 }
mbed_official 532:fe11edbda85c 1897 #ifdef SDIO_STA_STBITERR
mbed_official 235:685d5f11838f 1898 while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR))
mbed_official 532:fe11edbda85c 1899 #else /* SDIO_STA_STBITERR */
mbed_official 532:fe11edbda85c 1900 while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND))
mbed_official 532:fe11edbda85c 1901 #endif /* SDIO_STA_STBITERR */
mbed_official 235:685d5f11838f 1902 {
mbed_official 235:685d5f11838f 1903 if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXFIFOHF))
mbed_official 235:685d5f11838f 1904 {
mbed_official 235:685d5f11838f 1905 for (count = 0; count < 8; count++)
mbed_official 235:685d5f11838f 1906 {
mbed_official 235:685d5f11838f 1907 *(tempbuff + count) = SDIO_ReadFIFO(hsd->Instance);
mbed_official 235:685d5f11838f 1908 }
mbed_official 235:685d5f11838f 1909
mbed_official 235:685d5f11838f 1910 tempbuff += 8;
mbed_official 235:685d5f11838f 1911 }
mbed_official 235:685d5f11838f 1912 }
mbed_official 235:685d5f11838f 1913
mbed_official 235:685d5f11838f 1914 if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT))
mbed_official 235:685d5f11838f 1915 {
mbed_official 235:685d5f11838f 1916 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DTIMEOUT);
mbed_official 235:685d5f11838f 1917
mbed_official 235:685d5f11838f 1918 errorstate = SD_DATA_TIMEOUT;
mbed_official 235:685d5f11838f 1919
mbed_official 235:685d5f11838f 1920 return errorstate;
mbed_official 235:685d5f11838f 1921 }
mbed_official 235:685d5f11838f 1922 else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL))
mbed_official 235:685d5f11838f 1923 {
mbed_official 235:685d5f11838f 1924 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DCRCFAIL);
mbed_official 235:685d5f11838f 1925
mbed_official 235:685d5f11838f 1926 errorstate = SD_DATA_CRC_FAIL;
mbed_official 235:685d5f11838f 1927
mbed_official 235:685d5f11838f 1928 return errorstate;
mbed_official 235:685d5f11838f 1929 }
mbed_official 235:685d5f11838f 1930 else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR))
mbed_official 235:685d5f11838f 1931 {
mbed_official 235:685d5f11838f 1932 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_RXOVERR);
mbed_official 235:685d5f11838f 1933
mbed_official 235:685d5f11838f 1934 errorstate = SD_RX_OVERRUN;
mbed_official 235:685d5f11838f 1935
mbed_official 235:685d5f11838f 1936 return errorstate;
mbed_official 235:685d5f11838f 1937 }
mbed_official 532:fe11edbda85c 1938 #ifdef SDIO_STA_STBITERR
mbed_official 235:685d5f11838f 1939 else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_STBITERR))
mbed_official 235:685d5f11838f 1940 {
mbed_official 235:685d5f11838f 1941 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_STBITERR);
mbed_official 235:685d5f11838f 1942
mbed_official 235:685d5f11838f 1943 errorstate = SD_START_BIT_ERR;
mbed_official 235:685d5f11838f 1944
mbed_official 235:685d5f11838f 1945 return errorstate;
mbed_official 235:685d5f11838f 1946 }
mbed_official 532:fe11edbda85c 1947 #endif /* SDIO_STA_STBITERR */
mbed_official 235:685d5f11838f 1948 else
mbed_official 235:685d5f11838f 1949 {
mbed_official 235:685d5f11838f 1950 /* No error flag set */
mbed_official 235:685d5f11838f 1951 }
mbed_official 532:fe11edbda85c 1952
mbed_official 235:685d5f11838f 1953 count = SD_DATATIMEOUT;
mbed_official 235:685d5f11838f 1954
mbed_official 235:685d5f11838f 1955 while ((__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXDAVL)) && (count > 0))
mbed_official 235:685d5f11838f 1956 {
mbed_official 235:685d5f11838f 1957 *tempbuff = SDIO_ReadFIFO(hsd->Instance);
mbed_official 235:685d5f11838f 1958 tempbuff++;
mbed_official 235:685d5f11838f 1959 count--;
mbed_official 235:685d5f11838f 1960 }
mbed_official 235:685d5f11838f 1961
mbed_official 235:685d5f11838f 1962 /* Clear all the static flags */
mbed_official 235:685d5f11838f 1963 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
mbed_official 235:685d5f11838f 1964
mbed_official 235:685d5f11838f 1965 /* Test if the switch mode HS is ok */
mbed_official 235:685d5f11838f 1966 if ((SD_hs[13]& 2) != 2)
mbed_official 235:685d5f11838f 1967 {
mbed_official 235:685d5f11838f 1968 errorstate = SD_UNSUPPORTED_FEATURE;
mbed_official 235:685d5f11838f 1969 }
mbed_official 235:685d5f11838f 1970 }
mbed_official 235:685d5f11838f 1971
mbed_official 235:685d5f11838f 1972 return errorstate;
mbed_official 235:685d5f11838f 1973 }
mbed_official 235:685d5f11838f 1974
mbed_official 235:685d5f11838f 1975 /**
mbed_official 235:685d5f11838f 1976 * @}
mbed_official 235:685d5f11838f 1977 */
mbed_official 235:685d5f11838f 1978
mbed_official 532:fe11edbda85c 1979 /** @addtogroup SD_Exported_Functions_Group4
mbed_official 235:685d5f11838f 1980 * @brief Peripheral State functions
mbed_official 235:685d5f11838f 1981 *
mbed_official 235:685d5f11838f 1982 @verbatim
mbed_official 235:685d5f11838f 1983 ==============================================================================
mbed_official 235:685d5f11838f 1984 ##### Peripheral State functions #####
mbed_official 235:685d5f11838f 1985 ==============================================================================
mbed_official 235:685d5f11838f 1986 [..]
mbed_official 235:685d5f11838f 1987 This subsection permits to get in runtime the status of the peripheral
mbed_official 235:685d5f11838f 1988 and the data flow.
mbed_official 235:685d5f11838f 1989
mbed_official 235:685d5f11838f 1990 @endverbatim
mbed_official 235:685d5f11838f 1991 * @{
mbed_official 235:685d5f11838f 1992 */
mbed_official 235:685d5f11838f 1993
mbed_official 235:685d5f11838f 1994 /**
mbed_official 235:685d5f11838f 1995 * @brief Returns the current SD card's status.
mbed_official 235:685d5f11838f 1996 * @param hsd: SD handle
mbed_official 235:685d5f11838f 1997 * @param pSDstatus: Pointer to the buffer that will contain the SD card status
mbed_official 235:685d5f11838f 1998 * SD Status register)
mbed_official 235:685d5f11838f 1999 * @retval SD Card error state
mbed_official 235:685d5f11838f 2000 */
mbed_official 235:685d5f11838f 2001 HAL_SD_ErrorTypedef HAL_SD_SendSDStatus(SD_HandleTypeDef *hsd, uint32_t *pSDstatus)
mbed_official 235:685d5f11838f 2002 {
mbed_official 235:685d5f11838f 2003 SDIO_CmdInitTypeDef sdio_cmdinitstructure;
mbed_official 235:685d5f11838f 2004 SDIO_DataInitTypeDef sdio_datainitstructure;
mbed_official 235:685d5f11838f 2005 HAL_SD_ErrorTypedef errorstate = SD_OK;
mbed_official 235:685d5f11838f 2006 uint32_t count = 0;
mbed_official 235:685d5f11838f 2007
mbed_official 235:685d5f11838f 2008 /* Check SD response */
mbed_official 235:685d5f11838f 2009 if ((SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED) == SD_CARD_LOCKED)
mbed_official 235:685d5f11838f 2010 {
mbed_official 235:685d5f11838f 2011 errorstate = SD_LOCK_UNLOCK_FAILED;
mbed_official 235:685d5f11838f 2012
mbed_official 235:685d5f11838f 2013 return errorstate;
mbed_official 235:685d5f11838f 2014 }
mbed_official 235:685d5f11838f 2015
mbed_official 235:685d5f11838f 2016 /* Set block size for card if it is not equal to current block size for card */
mbed_official 235:685d5f11838f 2017 sdio_cmdinitstructure.Argument = 64;
mbed_official 235:685d5f11838f 2018 sdio_cmdinitstructure.CmdIndex = SD_CMD_SET_BLOCKLEN;
mbed_official 235:685d5f11838f 2019 sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT;
mbed_official 235:685d5f11838f 2020 sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
mbed_official 235:685d5f11838f 2021 sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE;
mbed_official 235:685d5f11838f 2022 SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
mbed_official 235:685d5f11838f 2023
mbed_official 235:685d5f11838f 2024 /* Check for error conditions */
mbed_official 235:685d5f11838f 2025 errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN);
mbed_official 235:685d5f11838f 2026
mbed_official 235:685d5f11838f 2027 if (errorstate != SD_OK)
mbed_official 235:685d5f11838f 2028 {
mbed_official 235:685d5f11838f 2029 return errorstate;
mbed_official 235:685d5f11838f 2030 }
mbed_official 235:685d5f11838f 2031
mbed_official 235:685d5f11838f 2032 /* Send CMD55 */
mbed_official 235:685d5f11838f 2033 sdio_cmdinitstructure.Argument = (uint32_t)(hsd->RCA << 16);
mbed_official 235:685d5f11838f 2034 sdio_cmdinitstructure.CmdIndex = SD_CMD_APP_CMD;
mbed_official 235:685d5f11838f 2035 SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
mbed_official 235:685d5f11838f 2036
mbed_official 235:685d5f11838f 2037 /* Check for error conditions */
mbed_official 235:685d5f11838f 2038 errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_CMD);
mbed_official 235:685d5f11838f 2039
mbed_official 235:685d5f11838f 2040 if (errorstate != SD_OK)
mbed_official 235:685d5f11838f 2041 {
mbed_official 235:685d5f11838f 2042 return errorstate;
mbed_official 235:685d5f11838f 2043 }
mbed_official 235:685d5f11838f 2044
mbed_official 235:685d5f11838f 2045 /* Configure the SD DPSM (Data Path State Machine) */
mbed_official 235:685d5f11838f 2046 sdio_datainitstructure.DataTimeOut = SD_DATATIMEOUT;
mbed_official 235:685d5f11838f 2047 sdio_datainitstructure.DataLength = 64;
mbed_official 235:685d5f11838f 2048 sdio_datainitstructure.DataBlockSize = SDIO_DATABLOCK_SIZE_64B;
mbed_official 235:685d5f11838f 2049 sdio_datainitstructure.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO;
mbed_official 235:685d5f11838f 2050 sdio_datainitstructure.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
mbed_official 235:685d5f11838f 2051 sdio_datainitstructure.DPSM = SDIO_DPSM_ENABLE;
mbed_official 235:685d5f11838f 2052 SDIO_DataConfig(hsd->Instance, &sdio_datainitstructure);
mbed_official 235:685d5f11838f 2053
mbed_official 532:fe11edbda85c 2054 /* Send ACMD13 (SD_APP_STATUS) with argument as card's RCA */
mbed_official 235:685d5f11838f 2055 sdio_cmdinitstructure.Argument = 0;
mbed_official 532:fe11edbda85c 2056 sdio_cmdinitstructure.CmdIndex = SD_CMD_SD_APP_STATUS;
mbed_official 235:685d5f11838f 2057 SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
mbed_official 235:685d5f11838f 2058
mbed_official 235:685d5f11838f 2059 /* Check for error conditions */
mbed_official 532:fe11edbda85c 2060 errorstate = SD_CmdResp1Error(hsd, SD_CMD_SD_APP_STATUS);
mbed_official 235:685d5f11838f 2061
mbed_official 235:685d5f11838f 2062 if (errorstate != SD_OK)
mbed_official 235:685d5f11838f 2063 {
mbed_official 235:685d5f11838f 2064 return errorstate;
mbed_official 235:685d5f11838f 2065 }
mbed_official 235:685d5f11838f 2066
mbed_official 235:685d5f11838f 2067 /* Get status data */
mbed_official 532:fe11edbda85c 2068 #ifdef SDIO_STA_STBITERR
mbed_official 235:685d5f11838f 2069 while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR))
mbed_official 532:fe11edbda85c 2070 #else /* SDIO_STA_STBITERR not defined */
mbed_official 532:fe11edbda85c 2071 while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND))
mbed_official 532:fe11edbda85c 2072 #endif /* SDIO_STA_STBITERR */
mbed_official 235:685d5f11838f 2073 {
mbed_official 235:685d5f11838f 2074 if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXFIFOHF))
mbed_official 235:685d5f11838f 2075 {
mbed_official 235:685d5f11838f 2076 for (count = 0; count < 8; count++)
mbed_official 235:685d5f11838f 2077 {
mbed_official 235:685d5f11838f 2078 *(pSDstatus + count) = SDIO_ReadFIFO(hsd->Instance);
mbed_official 235:685d5f11838f 2079 }
mbed_official 235:685d5f11838f 2080
mbed_official 235:685d5f11838f 2081 pSDstatus += 8;
mbed_official 235:685d5f11838f 2082 }
mbed_official 235:685d5f11838f 2083 }
mbed_official 235:685d5f11838f 2084
mbed_official 235:685d5f11838f 2085 if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT))
mbed_official 235:685d5f11838f 2086 {
mbed_official 235:685d5f11838f 2087 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DTIMEOUT);
mbed_official 235:685d5f11838f 2088
mbed_official 235:685d5f11838f 2089 errorstate = SD_DATA_TIMEOUT;
mbed_official 235:685d5f11838f 2090
mbed_official 235:685d5f11838f 2091 return errorstate;
mbed_official 235:685d5f11838f 2092 }
mbed_official 235:685d5f11838f 2093 else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL))
mbed_official 235:685d5f11838f 2094 {
mbed_official 235:685d5f11838f 2095 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DCRCFAIL);
mbed_official 235:685d5f11838f 2096
mbed_official 235:685d5f11838f 2097 errorstate = SD_DATA_CRC_FAIL;
mbed_official 235:685d5f11838f 2098
mbed_official 235:685d5f11838f 2099 return errorstate;
mbed_official 235:685d5f11838f 2100 }
mbed_official 235:685d5f11838f 2101 else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR))
mbed_official 235:685d5f11838f 2102 {
mbed_official 235:685d5f11838f 2103 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_RXOVERR);
mbed_official 235:685d5f11838f 2104
mbed_official 235:685d5f11838f 2105 errorstate = SD_RX_OVERRUN;
mbed_official 235:685d5f11838f 2106
mbed_official 235:685d5f11838f 2107 return errorstate;
mbed_official 235:685d5f11838f 2108 }
mbed_official 532:fe11edbda85c 2109 #ifdef SDIO_STA_STBITERR
mbed_official 235:685d5f11838f 2110 else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_STBITERR))
mbed_official 235:685d5f11838f 2111 {
mbed_official 235:685d5f11838f 2112 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_STBITERR);
mbed_official 235:685d5f11838f 2113
mbed_official 235:685d5f11838f 2114 errorstate = SD_START_BIT_ERR;
mbed_official 235:685d5f11838f 2115
mbed_official 235:685d5f11838f 2116 return errorstate;
mbed_official 235:685d5f11838f 2117 }
mbed_official 532:fe11edbda85c 2118 #endif /* SDIO_STA_STBITERR */
mbed_official 235:685d5f11838f 2119 else
mbed_official 235:685d5f11838f 2120 {
mbed_official 235:685d5f11838f 2121 /* No error flag set */
mbed_official 235:685d5f11838f 2122 }
mbed_official 235:685d5f11838f 2123
mbed_official 235:685d5f11838f 2124 count = SD_DATATIMEOUT;
mbed_official 235:685d5f11838f 2125 while ((__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXDAVL)) && (count > 0))
mbed_official 235:685d5f11838f 2126 {
mbed_official 235:685d5f11838f 2127 *pSDstatus = SDIO_ReadFIFO(hsd->Instance);
mbed_official 235:685d5f11838f 2128 pSDstatus++;
mbed_official 235:685d5f11838f 2129 count--;
mbed_official 235:685d5f11838f 2130 }
mbed_official 235:685d5f11838f 2131
mbed_official 235:685d5f11838f 2132 /* Clear all the static status flags*/
mbed_official 235:685d5f11838f 2133 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
mbed_official 235:685d5f11838f 2134
mbed_official 235:685d5f11838f 2135 return errorstate;
mbed_official 235:685d5f11838f 2136 }
mbed_official 235:685d5f11838f 2137
mbed_official 235:685d5f11838f 2138 /**
mbed_official 235:685d5f11838f 2139 * @brief Gets the current sd card data status.
mbed_official 235:685d5f11838f 2140 * @param hsd: SD handle
mbed_official 235:685d5f11838f 2141 * @retval Data Transfer state
mbed_official 235:685d5f11838f 2142 */
mbed_official 235:685d5f11838f 2143 HAL_SD_TransferStateTypedef HAL_SD_GetStatus(SD_HandleTypeDef *hsd)
mbed_official 235:685d5f11838f 2144 {
mbed_official 235:685d5f11838f 2145 HAL_SD_CardStateTypedef cardstate = SD_CARD_TRANSFER;
mbed_official 235:685d5f11838f 2146
mbed_official 235:685d5f11838f 2147 /* Get SD card state */
mbed_official 235:685d5f11838f 2148 cardstate = SD_GetState(hsd);
mbed_official 235:685d5f11838f 2149
mbed_official 235:685d5f11838f 2150 /* Find SD status according to card state*/
mbed_official 235:685d5f11838f 2151 if (cardstate == SD_CARD_TRANSFER)
mbed_official 235:685d5f11838f 2152 {
mbed_official 235:685d5f11838f 2153 return SD_TRANSFER_OK;
mbed_official 235:685d5f11838f 2154 }
mbed_official 235:685d5f11838f 2155 else if(cardstate == SD_CARD_ERROR)
mbed_official 235:685d5f11838f 2156 {
mbed_official 235:685d5f11838f 2157 return SD_TRANSFER_ERROR;
mbed_official 235:685d5f11838f 2158 }
mbed_official 235:685d5f11838f 2159 else
mbed_official 235:685d5f11838f 2160 {
mbed_official 235:685d5f11838f 2161 return SD_TRANSFER_BUSY;
mbed_official 235:685d5f11838f 2162 }
mbed_official 235:685d5f11838f 2163 }
mbed_official 235:685d5f11838f 2164
mbed_official 235:685d5f11838f 2165 /**
mbed_official 235:685d5f11838f 2166 * @brief Gets the SD card status.
mbed_official 235:685d5f11838f 2167 * @param hsd: SD handle
mbed_official 235:685d5f11838f 2168 * @param pCardStatus: Pointer to the HAL_SD_CardStatusTypedef structure that
mbed_official 235:685d5f11838f 2169 * will contain the SD card status information
mbed_official 235:685d5f11838f 2170 * @retval SD Card error state
mbed_official 235:685d5f11838f 2171 */
mbed_official 235:685d5f11838f 2172 HAL_SD_ErrorTypedef HAL_SD_GetCardStatus(SD_HandleTypeDef *hsd, HAL_SD_CardStatusTypedef *pCardStatus)
mbed_official 235:685d5f11838f 2173 {
mbed_official 235:685d5f11838f 2174 HAL_SD_ErrorTypedef errorstate = SD_OK;
mbed_official 235:685d5f11838f 2175 uint32_t tmp = 0;
mbed_official 235:685d5f11838f 2176 uint32_t sd_status[16];
mbed_official 235:685d5f11838f 2177
mbed_official 235:685d5f11838f 2178 errorstate = HAL_SD_SendSDStatus(hsd, sd_status);
mbed_official 235:685d5f11838f 2179
mbed_official 235:685d5f11838f 2180 if (errorstate != SD_OK)
mbed_official 235:685d5f11838f 2181 {
mbed_official 235:685d5f11838f 2182 return errorstate;
mbed_official 235:685d5f11838f 2183 }
mbed_official 235:685d5f11838f 2184
mbed_official 235:685d5f11838f 2185 /* Byte 0 */
mbed_official 235:685d5f11838f 2186 tmp = (sd_status[0] & 0xC0) >> 6;
mbed_official 235:685d5f11838f 2187 pCardStatus->DAT_BUS_WIDTH = (uint8_t)tmp;
mbed_official 235:685d5f11838f 2188
mbed_official 235:685d5f11838f 2189 /* Byte 0 */
mbed_official 235:685d5f11838f 2190 tmp = (sd_status[0] & 0x20) >> 5;
mbed_official 235:685d5f11838f 2191 pCardStatus->SECURED_MODE = (uint8_t)tmp;
mbed_official 235:685d5f11838f 2192
mbed_official 235:685d5f11838f 2193 /* Byte 2 */
mbed_official 235:685d5f11838f 2194 tmp = (sd_status[2] & 0xFF);
mbed_official 235:685d5f11838f 2195 pCardStatus->SD_CARD_TYPE = (uint8_t)(tmp << 8);
mbed_official 235:685d5f11838f 2196
mbed_official 235:685d5f11838f 2197 /* Byte 3 */
mbed_official 235:685d5f11838f 2198 tmp = (sd_status[3] & 0xFF);
mbed_official 235:685d5f11838f 2199 pCardStatus->SD_CARD_TYPE |= (uint8_t)tmp;
mbed_official 235:685d5f11838f 2200
mbed_official 235:685d5f11838f 2201 /* Byte 4 */
mbed_official 235:685d5f11838f 2202 tmp = (sd_status[4] & 0xFF);
mbed_official 235:685d5f11838f 2203 pCardStatus->SIZE_OF_PROTECTED_AREA = (uint8_t)(tmp << 24);
mbed_official 235:685d5f11838f 2204
mbed_official 235:685d5f11838f 2205 /* Byte 5 */
mbed_official 235:685d5f11838f 2206 tmp = (sd_status[5] & 0xFF);
mbed_official 235:685d5f11838f 2207 pCardStatus->SIZE_OF_PROTECTED_AREA |= (uint8_t)(tmp << 16);
mbed_official 235:685d5f11838f 2208
mbed_official 235:685d5f11838f 2209 /* Byte 6 */
mbed_official 235:685d5f11838f 2210 tmp = (sd_status[6] & 0xFF);
mbed_official 235:685d5f11838f 2211 pCardStatus->SIZE_OF_PROTECTED_AREA |= (uint8_t)(tmp << 8);
mbed_official 235:685d5f11838f 2212
mbed_official 235:685d5f11838f 2213 /* Byte 7 */
mbed_official 235:685d5f11838f 2214 tmp = (sd_status[7] & 0xFF);
mbed_official 235:685d5f11838f 2215 pCardStatus->SIZE_OF_PROTECTED_AREA |= (uint8_t)tmp;
mbed_official 235:685d5f11838f 2216
mbed_official 235:685d5f11838f 2217 /* Byte 8 */
mbed_official 235:685d5f11838f 2218 tmp = (sd_status[8] & 0xFF);
mbed_official 235:685d5f11838f 2219 pCardStatus->SPEED_CLASS = (uint8_t)tmp;
mbed_official 235:685d5f11838f 2220
mbed_official 235:685d5f11838f 2221 /* Byte 9 */
mbed_official 235:685d5f11838f 2222 tmp = (sd_status[9] & 0xFF);
mbed_official 235:685d5f11838f 2223 pCardStatus->PERFORMANCE_MOVE = (uint8_t)tmp;
mbed_official 235:685d5f11838f 2224
mbed_official 235:685d5f11838f 2225 /* Byte 10 */
mbed_official 235:685d5f11838f 2226 tmp = (sd_status[10] & 0xF0) >> 4;
mbed_official 235:685d5f11838f 2227 pCardStatus->AU_SIZE = (uint8_t)tmp;
mbed_official 235:685d5f11838f 2228
mbed_official 235:685d5f11838f 2229 /* Byte 11 */
mbed_official 235:685d5f11838f 2230 tmp = (sd_status[11] & 0xFF);
mbed_official 235:685d5f11838f 2231 pCardStatus->ERASE_SIZE = (uint8_t)(tmp << 8);
mbed_official 235:685d5f11838f 2232
mbed_official 235:685d5f11838f 2233 /* Byte 12 */
mbed_official 235:685d5f11838f 2234 tmp = (sd_status[12] & 0xFF);
mbed_official 235:685d5f11838f 2235 pCardStatus->ERASE_SIZE |= (uint8_t)tmp;
mbed_official 235:685d5f11838f 2236
mbed_official 235:685d5f11838f 2237 /* Byte 13 */
mbed_official 235:685d5f11838f 2238 tmp = (sd_status[13] & 0xFC) >> 2;
mbed_official 235:685d5f11838f 2239 pCardStatus->ERASE_TIMEOUT = (uint8_t)tmp;
mbed_official 235:685d5f11838f 2240
mbed_official 235:685d5f11838f 2241 /* Byte 13 */
mbed_official 235:685d5f11838f 2242 tmp = (sd_status[13] & 0x3);
mbed_official 235:685d5f11838f 2243 pCardStatus->ERASE_OFFSET = (uint8_t)tmp;
mbed_official 235:685d5f11838f 2244
mbed_official 235:685d5f11838f 2245 return errorstate;
mbed_official 235:685d5f11838f 2246 }
mbed_official 235:685d5f11838f 2247
mbed_official 235:685d5f11838f 2248 /**
mbed_official 235:685d5f11838f 2249 * @}
mbed_official 235:685d5f11838f 2250 */
mbed_official 235:685d5f11838f 2251
mbed_official 235:685d5f11838f 2252 /**
mbed_official 235:685d5f11838f 2253 * @}
mbed_official 235:685d5f11838f 2254 */
mbed_official 532:fe11edbda85c 2255
mbed_official 532:fe11edbda85c 2256 /* Private function ----------------------------------------------------------*/
mbed_official 235:685d5f11838f 2257 /** @addtogroup SD_Private_Functions
mbed_official 235:685d5f11838f 2258 * @{
mbed_official 235:685d5f11838f 2259 */
mbed_official 235:685d5f11838f 2260
mbed_official 235:685d5f11838f 2261 /**
mbed_official 235:685d5f11838f 2262 * @brief SD DMA transfer complete Rx callback.
mbed_official 235:685d5f11838f 2263 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
mbed_official 235:685d5f11838f 2264 * the configuration information for the specified DMA module.
mbed_official 235:685d5f11838f 2265 * @retval None
mbed_official 235:685d5f11838f 2266 */
mbed_official 235:685d5f11838f 2267 static void SD_DMA_RxCplt(DMA_HandleTypeDef *hdma)
mbed_official 235:685d5f11838f 2268 {
mbed_official 235:685d5f11838f 2269 SD_HandleTypeDef *hsd = (SD_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
mbed_official 235:685d5f11838f 2270
mbed_official 235:685d5f11838f 2271 /* DMA transfer is complete */
mbed_official 235:685d5f11838f 2272 hsd->DmaTransferCplt = 1;
mbed_official 235:685d5f11838f 2273
mbed_official 235:685d5f11838f 2274 /* Wait until SD transfer is complete */
mbed_official 235:685d5f11838f 2275 while(hsd->SdTransferCplt == 0)
mbed_official 235:685d5f11838f 2276 {
mbed_official 235:685d5f11838f 2277 }
mbed_official 235:685d5f11838f 2278
mbed_official 532:fe11edbda85c 2279 /* Disable the DMA channel */
mbed_official 532:fe11edbda85c 2280 HAL_DMA_Abort(hdma);
mbed_official 532:fe11edbda85c 2281
mbed_official 235:685d5f11838f 2282 /* Transfer complete user callback */
mbed_official 235:685d5f11838f 2283 HAL_SD_DMA_RxCpltCallback(hsd->hdmarx);
mbed_official 235:685d5f11838f 2284 }
mbed_official 235:685d5f11838f 2285
mbed_official 235:685d5f11838f 2286 /**
mbed_official 235:685d5f11838f 2287 * @brief SD DMA transfer Error Rx callback.
mbed_official 235:685d5f11838f 2288 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
mbed_official 235:685d5f11838f 2289 * the configuration information for the specified DMA module.
mbed_official 235:685d5f11838f 2290 * @retval None
mbed_official 235:685d5f11838f 2291 */
mbed_official 235:685d5f11838f 2292 static void SD_DMA_RxError(DMA_HandleTypeDef *hdma)
mbed_official 235:685d5f11838f 2293 {
mbed_official 235:685d5f11838f 2294 SD_HandleTypeDef *hsd = (SD_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
mbed_official 235:685d5f11838f 2295
mbed_official 235:685d5f11838f 2296 /* Transfer complete user callback */
mbed_official 235:685d5f11838f 2297 HAL_SD_DMA_RxErrorCallback(hsd->hdmarx);
mbed_official 235:685d5f11838f 2298 }
mbed_official 235:685d5f11838f 2299
mbed_official 235:685d5f11838f 2300 /**
mbed_official 235:685d5f11838f 2301 * @brief SD DMA transfer complete Tx callback.
mbed_official 235:685d5f11838f 2302 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
mbed_official 235:685d5f11838f 2303 * the configuration information for the specified DMA module.
mbed_official 235:685d5f11838f 2304 * @retval None
mbed_official 235:685d5f11838f 2305 */
mbed_official 235:685d5f11838f 2306 static void SD_DMA_TxCplt(DMA_HandleTypeDef *hdma)
mbed_official 235:685d5f11838f 2307 {
mbed_official 235:685d5f11838f 2308 SD_HandleTypeDef *hsd = (SD_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
mbed_official 235:685d5f11838f 2309
mbed_official 235:685d5f11838f 2310 /* DMA transfer is complete */
mbed_official 235:685d5f11838f 2311 hsd->DmaTransferCplt = 1;
mbed_official 235:685d5f11838f 2312
mbed_official 235:685d5f11838f 2313 /* Wait until SD transfer is complete */
mbed_official 235:685d5f11838f 2314 while(hsd->SdTransferCplt == 0)
mbed_official 235:685d5f11838f 2315 {
mbed_official 235:685d5f11838f 2316 }
mbed_official 532:fe11edbda85c 2317
mbed_official 532:fe11edbda85c 2318 /* Disable the DMA channel */
mbed_official 532:fe11edbda85c 2319 HAL_DMA_Abort(hdma);
mbed_official 532:fe11edbda85c 2320
mbed_official 235:685d5f11838f 2321 /* Transfer complete user callback */
mbed_official 235:685d5f11838f 2322 HAL_SD_DMA_TxCpltCallback(hsd->hdmatx);
mbed_official 235:685d5f11838f 2323 }
mbed_official 235:685d5f11838f 2324
mbed_official 235:685d5f11838f 2325 /**
mbed_official 235:685d5f11838f 2326 * @brief SD DMA transfer Error Tx callback.
mbed_official 235:685d5f11838f 2327 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
mbed_official 235:685d5f11838f 2328 * the configuration information for the specified DMA module.
mbed_official 235:685d5f11838f 2329 * @retval None
mbed_official 235:685d5f11838f 2330 */
mbed_official 235:685d5f11838f 2331 static void SD_DMA_TxError(DMA_HandleTypeDef *hdma)
mbed_official 235:685d5f11838f 2332 {
mbed_official 235:685d5f11838f 2333 SD_HandleTypeDef *hsd = ( SD_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 235:685d5f11838f 2334
mbed_official 235:685d5f11838f 2335 /* Transfer complete user callback */
mbed_official 235:685d5f11838f 2336 HAL_SD_DMA_TxErrorCallback(hsd->hdmatx);
mbed_official 235:685d5f11838f 2337 }
mbed_official 235:685d5f11838f 2338
mbed_official 235:685d5f11838f 2339 /**
mbed_official 235:685d5f11838f 2340 * @brief Returns the SD current state.
mbed_official 235:685d5f11838f 2341 * @param hsd: SD handle
mbed_official 235:685d5f11838f 2342 * @retval SD card current state
mbed_official 235:685d5f11838f 2343 */
mbed_official 235:685d5f11838f 2344 static HAL_SD_CardStateTypedef SD_GetState(SD_HandleTypeDef *hsd)
mbed_official 235:685d5f11838f 2345 {
mbed_official 235:685d5f11838f 2346 uint32_t resp1 = 0;
mbed_official 235:685d5f11838f 2347
mbed_official 235:685d5f11838f 2348 if (SD_SendStatus(hsd, &resp1) != SD_OK)
mbed_official 235:685d5f11838f 2349 {
mbed_official 235:685d5f11838f 2350 return SD_CARD_ERROR;
mbed_official 235:685d5f11838f 2351 }
mbed_official 235:685d5f11838f 2352 else
mbed_official 235:685d5f11838f 2353 {
mbed_official 235:685d5f11838f 2354 return (HAL_SD_CardStateTypedef)((resp1 >> 9) & 0x0F);
mbed_official 235:685d5f11838f 2355 }
mbed_official 235:685d5f11838f 2356 }
mbed_official 235:685d5f11838f 2357
mbed_official 235:685d5f11838f 2358 /**
mbed_official 235:685d5f11838f 2359 * @brief Initializes all cards or single card as the case may be Card(s) come
mbed_official 235:685d5f11838f 2360 * into standby state.
mbed_official 235:685d5f11838f 2361 * @param hsd: SD handle
mbed_official 235:685d5f11838f 2362 * @retval SD Card error state
mbed_official 235:685d5f11838f 2363 */
mbed_official 235:685d5f11838f 2364 static HAL_SD_ErrorTypedef SD_Initialize_Cards(SD_HandleTypeDef *hsd)
mbed_official 235:685d5f11838f 2365 {
mbed_official 235:685d5f11838f 2366 SDIO_CmdInitTypeDef sdio_cmdinitstructure;
mbed_official 235:685d5f11838f 2367 HAL_SD_ErrorTypedef errorstate = SD_OK;
mbed_official 235:685d5f11838f 2368 uint16_t sd_rca = 1;
mbed_official 235:685d5f11838f 2369
mbed_official 235:685d5f11838f 2370 if(SDIO_GetPowerState(hsd->Instance) == 0) /* Power off */
mbed_official 235:685d5f11838f 2371 {
mbed_official 235:685d5f11838f 2372 errorstate = SD_REQUEST_NOT_APPLICABLE;
mbed_official 235:685d5f11838f 2373
mbed_official 235:685d5f11838f 2374 return errorstate;
mbed_official 235:685d5f11838f 2375 }
mbed_official 235:685d5f11838f 2376
mbed_official 235:685d5f11838f 2377 if(hsd->CardType != SECURE_DIGITAL_IO_CARD)
mbed_official 235:685d5f11838f 2378 {
mbed_official 235:685d5f11838f 2379 /* Send CMD2 ALL_SEND_CID */
mbed_official 235:685d5f11838f 2380 sdio_cmdinitstructure.Argument = 0;
mbed_official 235:685d5f11838f 2381 sdio_cmdinitstructure.CmdIndex = SD_CMD_ALL_SEND_CID;
mbed_official 235:685d5f11838f 2382 sdio_cmdinitstructure.Response = SDIO_RESPONSE_LONG;
mbed_official 235:685d5f11838f 2383 sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
mbed_official 235:685d5f11838f 2384 sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE;
mbed_official 235:685d5f11838f 2385 SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
mbed_official 235:685d5f11838f 2386
mbed_official 235:685d5f11838f 2387 /* Check for error conditions */
mbed_official 235:685d5f11838f 2388 errorstate = SD_CmdResp2Error(hsd);
mbed_official 235:685d5f11838f 2389
mbed_official 235:685d5f11838f 2390 if(errorstate != SD_OK)
mbed_official 235:685d5f11838f 2391 {
mbed_official 235:685d5f11838f 2392 return errorstate;
mbed_official 235:685d5f11838f 2393 }
mbed_official 235:685d5f11838f 2394
mbed_official 235:685d5f11838f 2395 /* Get Card identification number data */
mbed_official 235:685d5f11838f 2396 hsd->CID[0] = SDIO_GetResponse(SDIO_RESP1);
mbed_official 235:685d5f11838f 2397 hsd->CID[1] = SDIO_GetResponse(SDIO_RESP2);
mbed_official 235:685d5f11838f 2398 hsd->CID[2] = SDIO_GetResponse(SDIO_RESP3);
mbed_official 235:685d5f11838f 2399 hsd->CID[3] = SDIO_GetResponse(SDIO_RESP4);
mbed_official 235:685d5f11838f 2400 }
mbed_official 235:685d5f11838f 2401
mbed_official 235:685d5f11838f 2402 if((hsd->CardType == STD_CAPACITY_SD_CARD_V1_1) || (hsd->CardType == STD_CAPACITY_SD_CARD_V2_0) ||\
mbed_official 235:685d5f11838f 2403 (hsd->CardType == SECURE_DIGITAL_IO_COMBO_CARD) || (hsd->CardType == HIGH_CAPACITY_SD_CARD))
mbed_official 235:685d5f11838f 2404 {
mbed_official 235:685d5f11838f 2405 /* Send CMD3 SET_REL_ADDR with argument 0 */
mbed_official 235:685d5f11838f 2406 /* SD Card publishes its RCA. */
mbed_official 235:685d5f11838f 2407 sdio_cmdinitstructure.CmdIndex = SD_CMD_SET_REL_ADDR;
mbed_official 235:685d5f11838f 2408 sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT;
mbed_official 235:685d5f11838f 2409 SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
mbed_official 235:685d5f11838f 2410
mbed_official 235:685d5f11838f 2411 /* Check for error conditions */
mbed_official 235:685d5f11838f 2412 errorstate = SD_CmdResp6Error(hsd, SD_CMD_SET_REL_ADDR, &sd_rca);
mbed_official 235:685d5f11838f 2413
mbed_official 235:685d5f11838f 2414 if(errorstate != SD_OK)
mbed_official 235:685d5f11838f 2415 {
mbed_official 235:685d5f11838f 2416 return errorstate;
mbed_official 235:685d5f11838f 2417 }
mbed_official 235:685d5f11838f 2418 }
mbed_official 235:685d5f11838f 2419
mbed_official 235:685d5f11838f 2420 if (hsd->CardType != SECURE_DIGITAL_IO_CARD)
mbed_official 235:685d5f11838f 2421 {
mbed_official 235:685d5f11838f 2422 /* Get the SD card RCA */
mbed_official 235:685d5f11838f 2423 hsd->RCA = sd_rca;
mbed_official 235:685d5f11838f 2424
mbed_official 235:685d5f11838f 2425 /* Send CMD9 SEND_CSD with argument as card's RCA */
mbed_official 235:685d5f11838f 2426 sdio_cmdinitstructure.Argument = (uint32_t)(hsd->RCA << 16);
mbed_official 235:685d5f11838f 2427 sdio_cmdinitstructure.CmdIndex = SD_CMD_SEND_CSD;
mbed_official 235:685d5f11838f 2428 sdio_cmdinitstructure.Response = SDIO_RESPONSE_LONG;
mbed_official 235:685d5f11838f 2429 SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
mbed_official 235:685d5f11838f 2430
mbed_official 235:685d5f11838f 2431 /* Check for error conditions */
mbed_official 235:685d5f11838f 2432 errorstate = SD_CmdResp2Error(hsd);
mbed_official 235:685d5f11838f 2433
mbed_official 235:685d5f11838f 2434 if(errorstate != SD_OK)
mbed_official 235:685d5f11838f 2435 {
mbed_official 235:685d5f11838f 2436 return errorstate;
mbed_official 235:685d5f11838f 2437 }
mbed_official 235:685d5f11838f 2438
mbed_official 235:685d5f11838f 2439 /* Get Card Specific Data */
mbed_official 235:685d5f11838f 2440 hsd->CSD[0] = SDIO_GetResponse(SDIO_RESP1);
mbed_official 235:685d5f11838f 2441 hsd->CSD[1] = SDIO_GetResponse(SDIO_RESP2);
mbed_official 235:685d5f11838f 2442 hsd->CSD[2] = SDIO_GetResponse(SDIO_RESP3);
mbed_official 235:685d5f11838f 2443 hsd->CSD[3] = SDIO_GetResponse(SDIO_RESP4);
mbed_official 235:685d5f11838f 2444 }
mbed_official 235:685d5f11838f 2445
mbed_official 235:685d5f11838f 2446 /* All cards are initialized */
mbed_official 235:685d5f11838f 2447 return errorstate;
mbed_official 235:685d5f11838f 2448 }
mbed_official 235:685d5f11838f 2449
mbed_official 235:685d5f11838f 2450 /**
mbed_official 532:fe11edbda85c 2451 * @brief Selects of Deselects the corresponding card.
mbed_official 235:685d5f11838f 2452 * @param hsd: SD handle
mbed_official 235:685d5f11838f 2453 * @param addr: Address of the card to be selected
mbed_official 235:685d5f11838f 2454 * @retval SD Card error state
mbed_official 235:685d5f11838f 2455 */
mbed_official 235:685d5f11838f 2456 static HAL_SD_ErrorTypedef SD_Select_Deselect(SD_HandleTypeDef *hsd, uint64_t addr)
mbed_official 235:685d5f11838f 2457 {
mbed_official 235:685d5f11838f 2458 SDIO_CmdInitTypeDef sdio_cmdinitstructure;
mbed_official 235:685d5f11838f 2459 HAL_SD_ErrorTypedef errorstate = SD_OK;
mbed_official 235:685d5f11838f 2460
mbed_official 235:685d5f11838f 2461 /* Send CMD7 SDIO_SEL_DESEL_CARD */
mbed_official 235:685d5f11838f 2462 sdio_cmdinitstructure.Argument = (uint32_t)addr;
mbed_official 235:685d5f11838f 2463 sdio_cmdinitstructure.CmdIndex = SD_CMD_SEL_DESEL_CARD;
mbed_official 235:685d5f11838f 2464 sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT;
mbed_official 235:685d5f11838f 2465 sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
mbed_official 235:685d5f11838f 2466 sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE;
mbed_official 235:685d5f11838f 2467 SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
mbed_official 235:685d5f11838f 2468
mbed_official 235:685d5f11838f 2469 /* Check for error conditions */
mbed_official 235:685d5f11838f 2470 errorstate = SD_CmdResp1Error(hsd, SD_CMD_SEL_DESEL_CARD);
mbed_official 235:685d5f11838f 2471
mbed_official 235:685d5f11838f 2472 return errorstate;
mbed_official 235:685d5f11838f 2473 }
mbed_official 235:685d5f11838f 2474
mbed_official 235:685d5f11838f 2475 /**
mbed_official 235:685d5f11838f 2476 * @brief Enquires cards about their operating voltage and configures clock
mbed_official 235:685d5f11838f 2477 * controls and stores SD information that will be needed in future
mbed_official 235:685d5f11838f 2478 * in the SD handle.
mbed_official 235:685d5f11838f 2479 * @param hsd: SD handle
mbed_official 235:685d5f11838f 2480 * @retval SD Card error state
mbed_official 235:685d5f11838f 2481 */
mbed_official 235:685d5f11838f 2482 static HAL_SD_ErrorTypedef SD_PowerON(SD_HandleTypeDef *hsd)
mbed_official 235:685d5f11838f 2483 {
mbed_official 235:685d5f11838f 2484 SDIO_CmdInitTypeDef sdio_cmdinitstructure;
mbed_official 235:685d5f11838f 2485 __IO HAL_SD_ErrorTypedef errorstate = SD_OK;
mbed_official 235:685d5f11838f 2486 uint32_t response = 0, count = 0, validvoltage = 0;
mbed_official 235:685d5f11838f 2487 uint32_t sdtype = SD_STD_CAPACITY;
mbed_official 235:685d5f11838f 2488
mbed_official 235:685d5f11838f 2489 /* Power ON Sequence -------------------------------------------------------*/
mbed_official 235:685d5f11838f 2490 /* Disable SDIO Clock */
mbed_official 235:685d5f11838f 2491 __HAL_SD_SDIO_DISABLE();
mbed_official 235:685d5f11838f 2492
mbed_official 235:685d5f11838f 2493 /* Set Power State to ON */
mbed_official 235:685d5f11838f 2494 SDIO_PowerState_ON(hsd->Instance);
mbed_official 235:685d5f11838f 2495
mbed_official 532:fe11edbda85c 2496 /* 1ms: required power up waiting time before starting the SD initialization
mbed_official 532:fe11edbda85c 2497 sequence */
mbed_official 532:fe11edbda85c 2498 HAL_Delay(1);
mbed_official 532:fe11edbda85c 2499
mbed_official 235:685d5f11838f 2500 /* Enable SDIO Clock */
mbed_official 235:685d5f11838f 2501 __HAL_SD_SDIO_ENABLE();
mbed_official 235:685d5f11838f 2502
mbed_official 235:685d5f11838f 2503 /* CMD0: GO_IDLE_STATE -----------------------------------------------------*/
mbed_official 235:685d5f11838f 2504 /* No CMD response required */
mbed_official 235:685d5f11838f 2505 sdio_cmdinitstructure.Argument = 0;
mbed_official 235:685d5f11838f 2506 sdio_cmdinitstructure.CmdIndex = SD_CMD_GO_IDLE_STATE;
mbed_official 235:685d5f11838f 2507 sdio_cmdinitstructure.Response = SDIO_RESPONSE_NO;
mbed_official 235:685d5f11838f 2508 sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
mbed_official 235:685d5f11838f 2509 sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE;
mbed_official 235:685d5f11838f 2510 SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
mbed_official 235:685d5f11838f 2511
mbed_official 235:685d5f11838f 2512 /* Check for error conditions */
mbed_official 235:685d5f11838f 2513 errorstate = SD_CmdError(hsd);
mbed_official 235:685d5f11838f 2514
mbed_official 235:685d5f11838f 2515 if(errorstate != SD_OK)
mbed_official 235:685d5f11838f 2516 {
mbed_official 532:fe11edbda85c 2517 /* CMD Response Timeout (wait for CMDSENT flag) */
mbed_official 235:685d5f11838f 2518 return errorstate;
mbed_official 235:685d5f11838f 2519 }
mbed_official 235:685d5f11838f 2520
mbed_official 235:685d5f11838f 2521 /* CMD8: SEND_IF_COND ------------------------------------------------------*/
mbed_official 235:685d5f11838f 2522 /* Send CMD8 to verify SD card interface operating condition */
mbed_official 235:685d5f11838f 2523 /* Argument: - [31:12]: Reserved (shall be set to '0')
mbed_official 235:685d5f11838f 2524 - [11:8]: Supply Voltage (VHS) 0x1 (Range: 2.7-3.6 V)
mbed_official 235:685d5f11838f 2525 - [7:0]: Check Pattern (recommended 0xAA) */
mbed_official 235:685d5f11838f 2526 /* CMD Response: R7 */
mbed_official 235:685d5f11838f 2527 sdio_cmdinitstructure.Argument = SD_CHECK_PATTERN;
mbed_official 235:685d5f11838f 2528 sdio_cmdinitstructure.CmdIndex = SD_SDIO_SEND_IF_COND;
mbed_official 235:685d5f11838f 2529 sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT;
mbed_official 235:685d5f11838f 2530 SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
mbed_official 235:685d5f11838f 2531
mbed_official 235:685d5f11838f 2532 /* Check for error conditions */
mbed_official 235:685d5f11838f 2533 errorstate = SD_CmdResp7Error(hsd);
mbed_official 235:685d5f11838f 2534
mbed_official 235:685d5f11838f 2535 if (errorstate == SD_OK)
mbed_official 235:685d5f11838f 2536 {
mbed_official 235:685d5f11838f 2537 /* SD Card 2.0 */
mbed_official 235:685d5f11838f 2538 hsd->CardType = STD_CAPACITY_SD_CARD_V2_0;
mbed_official 235:685d5f11838f 2539 sdtype = SD_HIGH_CAPACITY;
mbed_official 235:685d5f11838f 2540 }
mbed_official 235:685d5f11838f 2541
mbed_official 235:685d5f11838f 2542 /* Send CMD55 */
mbed_official 235:685d5f11838f 2543 sdio_cmdinitstructure.Argument = 0;
mbed_official 235:685d5f11838f 2544 sdio_cmdinitstructure.CmdIndex = SD_CMD_APP_CMD;
mbed_official 235:685d5f11838f 2545 SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
mbed_official 235:685d5f11838f 2546
mbed_official 235:685d5f11838f 2547 /* Check for error conditions */
mbed_official 235:685d5f11838f 2548 errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_CMD);
mbed_official 235:685d5f11838f 2549
mbed_official 532:fe11edbda85c 2550 /* If errorstate is Command Timeout, it is a MMC card */
mbed_official 235:685d5f11838f 2551 /* If errorstate is SD_OK it is a SD card: SD card 2.0 (voltage range mismatch)
mbed_official 235:685d5f11838f 2552 or SD card 1.x */
mbed_official 235:685d5f11838f 2553 if(errorstate == SD_OK)
mbed_official 235:685d5f11838f 2554 {
mbed_official 235:685d5f11838f 2555 /* SD CARD */
mbed_official 235:685d5f11838f 2556 /* Send ACMD41 SD_APP_OP_COND with Argument 0x80100000 */
mbed_official 235:685d5f11838f 2557 while((!validvoltage) && (count < SD_MAX_VOLT_TRIAL))
mbed_official 235:685d5f11838f 2558 {
mbed_official 235:685d5f11838f 2559
mbed_official 235:685d5f11838f 2560 /* SEND CMD55 APP_CMD with RCA as 0 */
mbed_official 235:685d5f11838f 2561 sdio_cmdinitstructure.Argument = 0;
mbed_official 235:685d5f11838f 2562 sdio_cmdinitstructure.CmdIndex = SD_CMD_APP_CMD;
mbed_official 235:685d5f11838f 2563 sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT;
mbed_official 235:685d5f11838f 2564 sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
mbed_official 235:685d5f11838f 2565 sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE;
mbed_official 235:685d5f11838f 2566 SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
mbed_official 235:685d5f11838f 2567
mbed_official 235:685d5f11838f 2568 /* Check for error conditions */
mbed_official 235:685d5f11838f 2569 errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_CMD);
mbed_official 235:685d5f11838f 2570
mbed_official 235:685d5f11838f 2571 if(errorstate != SD_OK)
mbed_official 235:685d5f11838f 2572 {
mbed_official 235:685d5f11838f 2573 return errorstate;
mbed_official 235:685d5f11838f 2574 }
mbed_official 235:685d5f11838f 2575
mbed_official 235:685d5f11838f 2576 /* Send CMD41 */
mbed_official 235:685d5f11838f 2577 sdio_cmdinitstructure.Argument = SD_VOLTAGE_WINDOW_SD | sdtype;
mbed_official 235:685d5f11838f 2578 sdio_cmdinitstructure.CmdIndex = SD_CMD_SD_APP_OP_COND;
mbed_official 235:685d5f11838f 2579 sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT;
mbed_official 235:685d5f11838f 2580 sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
mbed_official 235:685d5f11838f 2581 sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE;
mbed_official 235:685d5f11838f 2582 SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
mbed_official 235:685d5f11838f 2583
mbed_official 235:685d5f11838f 2584 /* Check for error conditions */
mbed_official 235:685d5f11838f 2585 errorstate = SD_CmdResp3Error(hsd);
mbed_official 235:685d5f11838f 2586
mbed_official 235:685d5f11838f 2587 if(errorstate != SD_OK)
mbed_official 235:685d5f11838f 2588 {
mbed_official 235:685d5f11838f 2589 return errorstate;
mbed_official 235:685d5f11838f 2590 }
mbed_official 235:685d5f11838f 2591
mbed_official 235:685d5f11838f 2592 /* Get command response */
mbed_official 235:685d5f11838f 2593 response = SDIO_GetResponse(SDIO_RESP1);
mbed_official 235:685d5f11838f 2594
mbed_official 235:685d5f11838f 2595 /* Get operating voltage*/
mbed_official 235:685d5f11838f 2596 validvoltage = (((response >> 31) == 1) ? 1 : 0);
mbed_official 235:685d5f11838f 2597
mbed_official 235:685d5f11838f 2598 count++;
mbed_official 235:685d5f11838f 2599 }
mbed_official 235:685d5f11838f 2600
mbed_official 235:685d5f11838f 2601 if(count >= SD_MAX_VOLT_TRIAL)
mbed_official 235:685d5f11838f 2602 {
mbed_official 235:685d5f11838f 2603 errorstate = SD_INVALID_VOLTRANGE;
mbed_official 235:685d5f11838f 2604
mbed_official 235:685d5f11838f 2605 return errorstate;
mbed_official 235:685d5f11838f 2606 }
mbed_official 235:685d5f11838f 2607
mbed_official 235:685d5f11838f 2608 if((response & SD_HIGH_CAPACITY) == SD_HIGH_CAPACITY) /* (response &= SD_HIGH_CAPACITY) */
mbed_official 235:685d5f11838f 2609 {
mbed_official 235:685d5f11838f 2610 hsd->CardType = HIGH_CAPACITY_SD_CARD;
mbed_official 235:685d5f11838f 2611 }
mbed_official 235:685d5f11838f 2612
mbed_official 235:685d5f11838f 2613 } /* else MMC Card */
mbed_official 235:685d5f11838f 2614
mbed_official 235:685d5f11838f 2615 return errorstate;
mbed_official 235:685d5f11838f 2616 }
mbed_official 235:685d5f11838f 2617
mbed_official 235:685d5f11838f 2618 /**
mbed_official 235:685d5f11838f 2619 * @brief Turns the SDIO output signals off.
mbed_official 235:685d5f11838f 2620 * @param hsd: SD handle
mbed_official 235:685d5f11838f 2621 * @retval SD Card error state
mbed_official 235:685d5f11838f 2622 */
mbed_official 235:685d5f11838f 2623 static HAL_SD_ErrorTypedef SD_PowerOFF(SD_HandleTypeDef *hsd)
mbed_official 235:685d5f11838f 2624 {
mbed_official 235:685d5f11838f 2625 HAL_SD_ErrorTypedef errorstate = SD_OK;
mbed_official 235:685d5f11838f 2626
mbed_official 235:685d5f11838f 2627 /* Set Power State to OFF */
mbed_official 235:685d5f11838f 2628 SDIO_PowerState_OFF(hsd->Instance);
mbed_official 235:685d5f11838f 2629
mbed_official 235:685d5f11838f 2630 return errorstate;
mbed_official 235:685d5f11838f 2631 }
mbed_official 235:685d5f11838f 2632
mbed_official 235:685d5f11838f 2633 /**
mbed_official 235:685d5f11838f 2634 * @brief Returns the current card's status.
mbed_official 235:685d5f11838f 2635 * @param hsd: SD handle
mbed_official 235:685d5f11838f 2636 * @param pCardStatus: pointer to the buffer that will contain the SD card
mbed_official 235:685d5f11838f 2637 * status (Card Status register)
mbed_official 235:685d5f11838f 2638 * @retval SD Card error state
mbed_official 235:685d5f11838f 2639 */
mbed_official 235:685d5f11838f 2640 static HAL_SD_ErrorTypedef SD_SendStatus(SD_HandleTypeDef *hsd, uint32_t *pCardStatus)
mbed_official 235:685d5f11838f 2641 {
mbed_official 235:685d5f11838f 2642 SDIO_CmdInitTypeDef sdio_cmdinitstructure;
mbed_official 235:685d5f11838f 2643 HAL_SD_ErrorTypedef errorstate = SD_OK;
mbed_official 235:685d5f11838f 2644
mbed_official 613:bc40b8d2aec4 2645 if(pCardStatus == NULL)
mbed_official 235:685d5f11838f 2646 {
mbed_official 235:685d5f11838f 2647 errorstate = SD_INVALID_PARAMETER;
mbed_official 235:685d5f11838f 2648
mbed_official 235:685d5f11838f 2649 return errorstate;
mbed_official 235:685d5f11838f 2650 }
mbed_official 235:685d5f11838f 2651
mbed_official 235:685d5f11838f 2652 /* Send Status command */
mbed_official 235:685d5f11838f 2653 sdio_cmdinitstructure.Argument = (uint32_t)(hsd->RCA << 16);
mbed_official 235:685d5f11838f 2654 sdio_cmdinitstructure.CmdIndex = SD_CMD_SEND_STATUS;
mbed_official 235:685d5f11838f 2655 sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT;
mbed_official 235:685d5f11838f 2656 sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
mbed_official 235:685d5f11838f 2657 sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE;
mbed_official 235:685d5f11838f 2658 SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
mbed_official 235:685d5f11838f 2659
mbed_official 235:685d5f11838f 2660 /* Check for error conditions */
mbed_official 235:685d5f11838f 2661 errorstate = SD_CmdResp1Error(hsd, SD_CMD_SEND_STATUS);
mbed_official 235:685d5f11838f 2662
mbed_official 235:685d5f11838f 2663 if(errorstate != SD_OK)
mbed_official 235:685d5f11838f 2664 {
mbed_official 235:685d5f11838f 2665 return errorstate;
mbed_official 235:685d5f11838f 2666 }
mbed_official 235:685d5f11838f 2667
mbed_official 235:685d5f11838f 2668 /* Get SD card status */
mbed_official 235:685d5f11838f 2669 *pCardStatus = SDIO_GetResponse(SDIO_RESP1);
mbed_official 235:685d5f11838f 2670
mbed_official 235:685d5f11838f 2671 return errorstate;
mbed_official 235:685d5f11838f 2672 }
mbed_official 235:685d5f11838f 2673
mbed_official 235:685d5f11838f 2674 /**
mbed_official 235:685d5f11838f 2675 * @brief Checks for error conditions for CMD0.
mbed_official 235:685d5f11838f 2676 * @param hsd: SD handle
mbed_official 235:685d5f11838f 2677 * @retval SD Card error state
mbed_official 235:685d5f11838f 2678 */
mbed_official 235:685d5f11838f 2679 static HAL_SD_ErrorTypedef SD_CmdError(SD_HandleTypeDef *hsd)
mbed_official 235:685d5f11838f 2680 {
mbed_official 235:685d5f11838f 2681 HAL_SD_ErrorTypedef errorstate = SD_OK;
mbed_official 235:685d5f11838f 2682 uint32_t timeout, tmp;
mbed_official 235:685d5f11838f 2683
mbed_official 235:685d5f11838f 2684 timeout = SDIO_CMD0TIMEOUT;
mbed_official 235:685d5f11838f 2685
mbed_official 235:685d5f11838f 2686 tmp = __HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CMDSENT);
mbed_official 235:685d5f11838f 2687
mbed_official 235:685d5f11838f 2688 while((timeout > 0) && (!tmp))
mbed_official 235:685d5f11838f 2689 {
mbed_official 235:685d5f11838f 2690 tmp = __HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CMDSENT);
mbed_official 235:685d5f11838f 2691 timeout--;
mbed_official 235:685d5f11838f 2692 }
mbed_official 235:685d5f11838f 2693
mbed_official 235:685d5f11838f 2694 if(timeout == 0)
mbed_official 235:685d5f11838f 2695 {
mbed_official 235:685d5f11838f 2696 errorstate = SD_CMD_RSP_TIMEOUT;
mbed_official 235:685d5f11838f 2697 return errorstate;
mbed_official 235:685d5f11838f 2698 }
mbed_official 235:685d5f11838f 2699
mbed_official 235:685d5f11838f 2700 /* Clear all the static flags */
mbed_official 235:685d5f11838f 2701 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
mbed_official 235:685d5f11838f 2702
mbed_official 235:685d5f11838f 2703 return errorstate;
mbed_official 235:685d5f11838f 2704 }
mbed_official 235:685d5f11838f 2705
mbed_official 235:685d5f11838f 2706 /**
mbed_official 235:685d5f11838f 2707 * @brief Checks for error conditions for R7 response.
mbed_official 235:685d5f11838f 2708 * @param hsd: SD handle
mbed_official 235:685d5f11838f 2709 * @retval SD Card error state
mbed_official 235:685d5f11838f 2710 */
mbed_official 235:685d5f11838f 2711 static HAL_SD_ErrorTypedef SD_CmdResp7Error(SD_HandleTypeDef *hsd)
mbed_official 235:685d5f11838f 2712 {
mbed_official 235:685d5f11838f 2713 HAL_SD_ErrorTypedef errorstate = SD_ERROR;
mbed_official 235:685d5f11838f 2714 uint32_t timeout = SDIO_CMD0TIMEOUT, tmp;
mbed_official 235:685d5f11838f 2715
mbed_official 235:685d5f11838f 2716 tmp = __HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT);
mbed_official 235:685d5f11838f 2717
mbed_official 235:685d5f11838f 2718 while((!tmp) && (timeout > 0))
mbed_official 235:685d5f11838f 2719 {
mbed_official 235:685d5f11838f 2720 tmp = __HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT);
mbed_official 235:685d5f11838f 2721 timeout--;
mbed_official 235:685d5f11838f 2722 }
mbed_official 235:685d5f11838f 2723
mbed_official 235:685d5f11838f 2724 tmp = __HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CTIMEOUT);
mbed_official 235:685d5f11838f 2725
mbed_official 235:685d5f11838f 2726 if((timeout == 0) || tmp)
mbed_official 235:685d5f11838f 2727 {
mbed_official 235:685d5f11838f 2728 /* Card is not V2.0 compliant or card does not support the set voltage range */
mbed_official 235:685d5f11838f 2729 errorstate = SD_CMD_RSP_TIMEOUT;
mbed_official 235:685d5f11838f 2730
mbed_official 235:685d5f11838f 2731 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CTIMEOUT);
mbed_official 235:685d5f11838f 2732
mbed_official 235:685d5f11838f 2733 return errorstate;
mbed_official 235:685d5f11838f 2734 }
mbed_official 235:685d5f11838f 2735
mbed_official 235:685d5f11838f 2736 if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CMDREND))
mbed_official 235:685d5f11838f 2737 {
mbed_official 235:685d5f11838f 2738 /* Card is SD V2.0 compliant */
mbed_official 235:685d5f11838f 2739 errorstate = SD_OK;
mbed_official 235:685d5f11838f 2740
mbed_official 235:685d5f11838f 2741 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CMDREND);
mbed_official 235:685d5f11838f 2742
mbed_official 235:685d5f11838f 2743 return errorstate;
mbed_official 235:685d5f11838f 2744 }
mbed_official 235:685d5f11838f 2745
mbed_official 235:685d5f11838f 2746 return errorstate;
mbed_official 235:685d5f11838f 2747 }
mbed_official 235:685d5f11838f 2748
mbed_official 235:685d5f11838f 2749 /**
mbed_official 235:685d5f11838f 2750 * @brief Checks for error conditions for R1 response.
mbed_official 235:685d5f11838f 2751 * @param hsd: SD handle
mbed_official 235:685d5f11838f 2752 * @param SD_CMD: The sent command index
mbed_official 235:685d5f11838f 2753 * @retval SD Card error state
mbed_official 235:685d5f11838f 2754 */
mbed_official 235:685d5f11838f 2755 static HAL_SD_ErrorTypedef SD_CmdResp1Error(SD_HandleTypeDef *hsd, uint8_t SD_CMD)
mbed_official 235:685d5f11838f 2756 {
mbed_official 235:685d5f11838f 2757 HAL_SD_ErrorTypedef errorstate = SD_OK;
mbed_official 235:685d5f11838f 2758 uint32_t response_r1;
mbed_official 235:685d5f11838f 2759
mbed_official 235:685d5f11838f 2760 while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT))
mbed_official 235:685d5f11838f 2761 {
mbed_official 235:685d5f11838f 2762 }
mbed_official 235:685d5f11838f 2763
mbed_official 235:685d5f11838f 2764 if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CTIMEOUT))
mbed_official 235:685d5f11838f 2765 {
mbed_official 235:685d5f11838f 2766 errorstate = SD_CMD_RSP_TIMEOUT;
mbed_official 235:685d5f11838f 2767
mbed_official 235:685d5f11838f 2768 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CTIMEOUT);
mbed_official 235:685d5f11838f 2769
mbed_official 235:685d5f11838f 2770 return errorstate;
mbed_official 235:685d5f11838f 2771 }
mbed_official 235:685d5f11838f 2772 else if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL))
mbed_official 235:685d5f11838f 2773 {
mbed_official 235:685d5f11838f 2774 errorstate = SD_CMD_CRC_FAIL;
mbed_official 235:685d5f11838f 2775
mbed_official 235:685d5f11838f 2776 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CCRCFAIL);
mbed_official 235:685d5f11838f 2777
mbed_official 235:685d5f11838f 2778 return errorstate;
mbed_official 235:685d5f11838f 2779 }
mbed_official 235:685d5f11838f 2780
mbed_official 235:685d5f11838f 2781 /* Check response received is of desired command */
mbed_official 235:685d5f11838f 2782 if(SDIO_GetCommandResponse(hsd->Instance) != SD_CMD)
mbed_official 235:685d5f11838f 2783 {
mbed_official 235:685d5f11838f 2784 errorstate = SD_ILLEGAL_CMD;
mbed_official 235:685d5f11838f 2785
mbed_official 235:685d5f11838f 2786 return errorstate;
mbed_official 235:685d5f11838f 2787 }
mbed_official 235:685d5f11838f 2788
mbed_official 235:685d5f11838f 2789 /* Clear all the static flags */
mbed_official 235:685d5f11838f 2790 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
mbed_official 235:685d5f11838f 2791
mbed_official 235:685d5f11838f 2792 /* We have received response, retrieve it for analysis */
mbed_official 235:685d5f11838f 2793 response_r1 = SDIO_GetResponse(SDIO_RESP1);
mbed_official 235:685d5f11838f 2794
mbed_official 235:685d5f11838f 2795 if((response_r1 & SD_OCR_ERRORBITS) == SD_ALLZERO)
mbed_official 235:685d5f11838f 2796 {
mbed_official 235:685d5f11838f 2797 return errorstate;
mbed_official 235:685d5f11838f 2798 }
mbed_official 235:685d5f11838f 2799
mbed_official 235:685d5f11838f 2800 if((response_r1 & SD_OCR_ADDR_OUT_OF_RANGE) == SD_OCR_ADDR_OUT_OF_RANGE)
mbed_official 235:685d5f11838f 2801 {
mbed_official 235:685d5f11838f 2802 return(SD_ADDR_OUT_OF_RANGE);
mbed_official 235:685d5f11838f 2803 }
mbed_official 235:685d5f11838f 2804
mbed_official 235:685d5f11838f 2805 if((response_r1 & SD_OCR_ADDR_MISALIGNED) == SD_OCR_ADDR_MISALIGNED)
mbed_official 235:685d5f11838f 2806 {
mbed_official 235:685d5f11838f 2807 return(SD_ADDR_MISALIGNED);
mbed_official 235:685d5f11838f 2808 }
mbed_official 235:685d5f11838f 2809
mbed_official 235:685d5f11838f 2810 if((response_r1 & SD_OCR_BLOCK_LEN_ERR) == SD_OCR_BLOCK_LEN_ERR)
mbed_official 235:685d5f11838f 2811 {
mbed_official 235:685d5f11838f 2812 return(SD_BLOCK_LEN_ERR);
mbed_official 235:685d5f11838f 2813 }
mbed_official 235:685d5f11838f 2814
mbed_official 235:685d5f11838f 2815 if((response_r1 & SD_OCR_ERASE_SEQ_ERR) == SD_OCR_ERASE_SEQ_ERR)
mbed_official 235:685d5f11838f 2816 {
mbed_official 235:685d5f11838f 2817 return(SD_ERASE_SEQ_ERR);
mbed_official 235:685d5f11838f 2818 }
mbed_official 235:685d5f11838f 2819
mbed_official 235:685d5f11838f 2820 if((response_r1 & SD_OCR_BAD_ERASE_PARAM) == SD_OCR_BAD_ERASE_PARAM)
mbed_official 235:685d5f11838f 2821 {
mbed_official 235:685d5f11838f 2822 return(SD_BAD_ERASE_PARAM);
mbed_official 235:685d5f11838f 2823 }
mbed_official 235:685d5f11838f 2824
mbed_official 235:685d5f11838f 2825 if((response_r1 & SD_OCR_WRITE_PROT_VIOLATION) == SD_OCR_WRITE_PROT_VIOLATION)
mbed_official 235:685d5f11838f 2826 {
mbed_official 235:685d5f11838f 2827 return(SD_WRITE_PROT_VIOLATION);
mbed_official 235:685d5f11838f 2828 }
mbed_official 235:685d5f11838f 2829
mbed_official 235:685d5f11838f 2830 if((response_r1 & SD_OCR_LOCK_UNLOCK_FAILED) == SD_OCR_LOCK_UNLOCK_FAILED)
mbed_official 235:685d5f11838f 2831 {
mbed_official 235:685d5f11838f 2832 return(SD_LOCK_UNLOCK_FAILED);
mbed_official 235:685d5f11838f 2833 }
mbed_official 235:685d5f11838f 2834
mbed_official 235:685d5f11838f 2835 if((response_r1 & SD_OCR_COM_CRC_FAILED) == SD_OCR_COM_CRC_FAILED)
mbed_official 235:685d5f11838f 2836 {
mbed_official 235:685d5f11838f 2837 return(SD_COM_CRC_FAILED);
mbed_official 235:685d5f11838f 2838 }
mbed_official 235:685d5f11838f 2839
mbed_official 235:685d5f11838f 2840 if((response_r1 & SD_OCR_ILLEGAL_CMD) == SD_OCR_ILLEGAL_CMD)
mbed_official 235:685d5f11838f 2841 {
mbed_official 235:685d5f11838f 2842 return(SD_ILLEGAL_CMD);
mbed_official 235:685d5f11838f 2843 }
mbed_official 235:685d5f11838f 2844
mbed_official 235:685d5f11838f 2845 if((response_r1 & SD_OCR_CARD_ECC_FAILED) == SD_OCR_CARD_ECC_FAILED)
mbed_official 235:685d5f11838f 2846 {
mbed_official 235:685d5f11838f 2847 return(SD_CARD_ECC_FAILED);
mbed_official 235:685d5f11838f 2848 }
mbed_official 235:685d5f11838f 2849
mbed_official 235:685d5f11838f 2850 if((response_r1 & SD_OCR_CC_ERROR) == SD_OCR_CC_ERROR)
mbed_official 235:685d5f11838f 2851 {
mbed_official 235:685d5f11838f 2852 return(SD_CC_ERROR);
mbed_official 235:685d5f11838f 2853 }
mbed_official 235:685d5f11838f 2854
mbed_official 235:685d5f11838f 2855 if((response_r1 & SD_OCR_GENERAL_UNKNOWN_ERROR) == SD_OCR_GENERAL_UNKNOWN_ERROR)
mbed_official 235:685d5f11838f 2856 {
mbed_official 235:685d5f11838f 2857 return(SD_GENERAL_UNKNOWN_ERROR);
mbed_official 235:685d5f11838f 2858 }
mbed_official 235:685d5f11838f 2859
mbed_official 235:685d5f11838f 2860 if((response_r1 & SD_OCR_STREAM_READ_UNDERRUN) == SD_OCR_STREAM_READ_UNDERRUN)
mbed_official 235:685d5f11838f 2861 {
mbed_official 235:685d5f11838f 2862 return(SD_STREAM_READ_UNDERRUN);
mbed_official 235:685d5f11838f 2863 }
mbed_official 235:685d5f11838f 2864
mbed_official 235:685d5f11838f 2865 if((response_r1 & SD_OCR_STREAM_WRITE_OVERRUN) == SD_OCR_STREAM_WRITE_OVERRUN)
mbed_official 235:685d5f11838f 2866 {
mbed_official 235:685d5f11838f 2867 return(SD_STREAM_WRITE_OVERRUN);
mbed_official 235:685d5f11838f 2868 }
mbed_official 235:685d5f11838f 2869
mbed_official 532:fe11edbda85c 2870 if((response_r1 & SD_OCR_CID_CSD_OVERWRITE) == SD_OCR_CID_CSD_OVERWRITE)
mbed_official 235:685d5f11838f 2871 {
mbed_official 235:685d5f11838f 2872 return(SD_CID_CSD_OVERWRITE);
mbed_official 235:685d5f11838f 2873 }
mbed_official 235:685d5f11838f 2874
mbed_official 235:685d5f11838f 2875 if((response_r1 & SD_OCR_WP_ERASE_SKIP) == SD_OCR_WP_ERASE_SKIP)
mbed_official 235:685d5f11838f 2876 {
mbed_official 235:685d5f11838f 2877 return(SD_WP_ERASE_SKIP);
mbed_official 235:685d5f11838f 2878 }
mbed_official 235:685d5f11838f 2879
mbed_official 235:685d5f11838f 2880 if((response_r1 & SD_OCR_CARD_ECC_DISABLED) == SD_OCR_CARD_ECC_DISABLED)
mbed_official 235:685d5f11838f 2881 {
mbed_official 235:685d5f11838f 2882 return(SD_CARD_ECC_DISABLED);
mbed_official 235:685d5f11838f 2883 }
mbed_official 235:685d5f11838f 2884
mbed_official 235:685d5f11838f 2885 if((response_r1 & SD_OCR_ERASE_RESET) == SD_OCR_ERASE_RESET)
mbed_official 235:685d5f11838f 2886 {
mbed_official 235:685d5f11838f 2887 return(SD_ERASE_RESET);
mbed_official 235:685d5f11838f 2888 }
mbed_official 235:685d5f11838f 2889
mbed_official 235:685d5f11838f 2890 if((response_r1 & SD_OCR_AKE_SEQ_ERROR) == SD_OCR_AKE_SEQ_ERROR)
mbed_official 235:685d5f11838f 2891 {
mbed_official 235:685d5f11838f 2892 return(SD_AKE_SEQ_ERROR);
mbed_official 235:685d5f11838f 2893 }
mbed_official 235:685d5f11838f 2894
mbed_official 235:685d5f11838f 2895 return errorstate;
mbed_official 235:685d5f11838f 2896 }
mbed_official 235:685d5f11838f 2897
mbed_official 235:685d5f11838f 2898 /**
mbed_official 235:685d5f11838f 2899 * @brief Checks for error conditions for R3 (OCR) response.
mbed_official 235:685d5f11838f 2900 * @param hsd: SD handle
mbed_official 235:685d5f11838f 2901 * @retval SD Card error state
mbed_official 235:685d5f11838f 2902 */
mbed_official 235:685d5f11838f 2903 static HAL_SD_ErrorTypedef SD_CmdResp3Error(SD_HandleTypeDef *hsd)
mbed_official 235:685d5f11838f 2904 {
mbed_official 235:685d5f11838f 2905 HAL_SD_ErrorTypedef errorstate = SD_OK;
mbed_official 235:685d5f11838f 2906
mbed_official 235:685d5f11838f 2907 while (!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT))
mbed_official 235:685d5f11838f 2908 {
mbed_official 235:685d5f11838f 2909 }
mbed_official 235:685d5f11838f 2910
mbed_official 235:685d5f11838f 2911 if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CTIMEOUT))
mbed_official 235:685d5f11838f 2912 {
mbed_official 235:685d5f11838f 2913 errorstate = SD_CMD_RSP_TIMEOUT;
mbed_official 235:685d5f11838f 2914
mbed_official 235:685d5f11838f 2915 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CTIMEOUT);
mbed_official 235:685d5f11838f 2916
mbed_official 235:685d5f11838f 2917 return errorstate;
mbed_official 235:685d5f11838f 2918 }
mbed_official 235:685d5f11838f 2919
mbed_official 235:685d5f11838f 2920 /* Clear all the static flags */
mbed_official 235:685d5f11838f 2921 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
mbed_official 235:685d5f11838f 2922
mbed_official 235:685d5f11838f 2923 return errorstate;
mbed_official 235:685d5f11838f 2924 }
mbed_official 235:685d5f11838f 2925
mbed_official 235:685d5f11838f 2926 /**
mbed_official 235:685d5f11838f 2927 * @brief Checks for error conditions for R2 (CID or CSD) response.
mbed_official 235:685d5f11838f 2928 * @param hsd: SD handle
mbed_official 235:685d5f11838f 2929 * @retval SD Card error state
mbed_official 235:685d5f11838f 2930 */
mbed_official 235:685d5f11838f 2931 static HAL_SD_ErrorTypedef SD_CmdResp2Error(SD_HandleTypeDef *hsd)
mbed_official 235:685d5f11838f 2932 {
mbed_official 235:685d5f11838f 2933 HAL_SD_ErrorTypedef errorstate = SD_OK;
mbed_official 235:685d5f11838f 2934
mbed_official 235:685d5f11838f 2935 while (!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT))
mbed_official 235:685d5f11838f 2936 {
mbed_official 235:685d5f11838f 2937 }
mbed_official 235:685d5f11838f 2938
mbed_official 235:685d5f11838f 2939 if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CTIMEOUT))
mbed_official 235:685d5f11838f 2940 {
mbed_official 235:685d5f11838f 2941 errorstate = SD_CMD_RSP_TIMEOUT;
mbed_official 235:685d5f11838f 2942
mbed_official 235:685d5f11838f 2943 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CTIMEOUT);
mbed_official 235:685d5f11838f 2944
mbed_official 235:685d5f11838f 2945 return errorstate;
mbed_official 235:685d5f11838f 2946 }
mbed_official 235:685d5f11838f 2947 else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL))
mbed_official 235:685d5f11838f 2948 {
mbed_official 235:685d5f11838f 2949 errorstate = SD_CMD_CRC_FAIL;
mbed_official 235:685d5f11838f 2950
mbed_official 235:685d5f11838f 2951 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CCRCFAIL);
mbed_official 235:685d5f11838f 2952
mbed_official 235:685d5f11838f 2953 return errorstate;
mbed_official 235:685d5f11838f 2954 }
mbed_official 235:685d5f11838f 2955 else
mbed_official 235:685d5f11838f 2956 {
mbed_official 235:685d5f11838f 2957 /* No error flag set */
mbed_official 532:fe11edbda85c 2958 }
mbed_official 235:685d5f11838f 2959
mbed_official 235:685d5f11838f 2960 /* Clear all the static flags */
mbed_official 235:685d5f11838f 2961 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
mbed_official 235:685d5f11838f 2962
mbed_official 235:685d5f11838f 2963 return errorstate;
mbed_official 235:685d5f11838f 2964 }
mbed_official 235:685d5f11838f 2965
mbed_official 235:685d5f11838f 2966 /**
mbed_official 235:685d5f11838f 2967 * @brief Checks for error conditions for R6 (RCA) response.
mbed_official 235:685d5f11838f 2968 * @param hsd: SD handle
mbed_official 235:685d5f11838f 2969 * @param SD_CMD: The sent command index
mbed_official 235:685d5f11838f 2970 * @param pRCA: Pointer to the variable that will contain the SD card relative
mbed_official 235:685d5f11838f 2971 * address RCA
mbed_official 235:685d5f11838f 2972 * @retval SD Card error state
mbed_official 235:685d5f11838f 2973 */
mbed_official 235:685d5f11838f 2974 static HAL_SD_ErrorTypedef SD_CmdResp6Error(SD_HandleTypeDef *hsd, uint8_t SD_CMD, uint16_t *pRCA)
mbed_official 235:685d5f11838f 2975 {
mbed_official 235:685d5f11838f 2976 HAL_SD_ErrorTypedef errorstate = SD_OK;
mbed_official 235:685d5f11838f 2977 uint32_t response_r1;
mbed_official 235:685d5f11838f 2978
mbed_official 235:685d5f11838f 2979 while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT))
mbed_official 235:685d5f11838f 2980 {
mbed_official 235:685d5f11838f 2981 }
mbed_official 235:685d5f11838f 2982
mbed_official 235:685d5f11838f 2983 if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CTIMEOUT))
mbed_official 235:685d5f11838f 2984 {
mbed_official 235:685d5f11838f 2985 errorstate = SD_CMD_RSP_TIMEOUT;
mbed_official 235:685d5f11838f 2986
mbed_official 235:685d5f11838f 2987 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CTIMEOUT);
mbed_official 235:685d5f11838f 2988
mbed_official 235:685d5f11838f 2989 return errorstate;
mbed_official 235:685d5f11838f 2990 }
mbed_official 235:685d5f11838f 2991 else if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL))
mbed_official 235:685d5f11838f 2992 {
mbed_official 235:685d5f11838f 2993 errorstate = SD_CMD_CRC_FAIL;
mbed_official 235:685d5f11838f 2994
mbed_official 235:685d5f11838f 2995 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CCRCFAIL);
mbed_official 235:685d5f11838f 2996
mbed_official 235:685d5f11838f 2997 return errorstate;
mbed_official 235:685d5f11838f 2998 }
mbed_official 235:685d5f11838f 2999 else
mbed_official 235:685d5f11838f 3000 {
mbed_official 235:685d5f11838f 3001 /* No error flag set */
mbed_official 532:fe11edbda85c 3002 }
mbed_official 235:685d5f11838f 3003
mbed_official 235:685d5f11838f 3004 /* Check response received is of desired command */
mbed_official 235:685d5f11838f 3005 if(SDIO_GetCommandResponse(hsd->Instance) != SD_CMD)
mbed_official 235:685d5f11838f 3006 {
mbed_official 235:685d5f11838f 3007 errorstate = SD_ILLEGAL_CMD;
mbed_official 235:685d5f11838f 3008
mbed_official 235:685d5f11838f 3009 return errorstate;
mbed_official 235:685d5f11838f 3010 }
mbed_official 235:685d5f11838f 3011
mbed_official 235:685d5f11838f 3012 /* Clear all the static flags */
mbed_official 235:685d5f11838f 3013 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
mbed_official 235:685d5f11838f 3014
mbed_official 235:685d5f11838f 3015 /* We have received response, retrieve it. */
mbed_official 235:685d5f11838f 3016 response_r1 = SDIO_GetResponse(SDIO_RESP1);
mbed_official 235:685d5f11838f 3017
mbed_official 235:685d5f11838f 3018 if((response_r1 & (SD_R6_GENERAL_UNKNOWN_ERROR | SD_R6_ILLEGAL_CMD | SD_R6_COM_CRC_FAILED)) == SD_ALLZERO)
mbed_official 235:685d5f11838f 3019 {
mbed_official 235:685d5f11838f 3020 *pRCA = (uint16_t) (response_r1 >> 16);
mbed_official 235:685d5f11838f 3021
mbed_official 235:685d5f11838f 3022 return errorstate;
mbed_official 235:685d5f11838f 3023 }
mbed_official 235:685d5f11838f 3024
mbed_official 235:685d5f11838f 3025 if((response_r1 & SD_R6_GENERAL_UNKNOWN_ERROR) == SD_R6_GENERAL_UNKNOWN_ERROR)
mbed_official 235:685d5f11838f 3026 {
mbed_official 235:685d5f11838f 3027 return(SD_GENERAL_UNKNOWN_ERROR);
mbed_official 235:685d5f11838f 3028 }
mbed_official 235:685d5f11838f 3029
mbed_official 235:685d5f11838f 3030 if((response_r1 & SD_R6_ILLEGAL_CMD) == SD_R6_ILLEGAL_CMD)
mbed_official 235:685d5f11838f 3031 {
mbed_official 235:685d5f11838f 3032 return(SD_ILLEGAL_CMD);
mbed_official 235:685d5f11838f 3033 }
mbed_official 235:685d5f11838f 3034
mbed_official 235:685d5f11838f 3035 if((response_r1 & SD_R6_COM_CRC_FAILED) == SD_R6_COM_CRC_FAILED)
mbed_official 235:685d5f11838f 3036 {
mbed_official 235:685d5f11838f 3037 return(SD_COM_CRC_FAILED);
mbed_official 235:685d5f11838f 3038 }
mbed_official 235:685d5f11838f 3039
mbed_official 235:685d5f11838f 3040 return errorstate;
mbed_official 235:685d5f11838f 3041 }
mbed_official 235:685d5f11838f 3042
mbed_official 235:685d5f11838f 3043 /**
mbed_official 235:685d5f11838f 3044 * @brief Enables the SDIO wide bus mode.
mbed_official 235:685d5f11838f 3045 * @param hsd: SD handle
mbed_official 235:685d5f11838f 3046 * @retval SD Card error state
mbed_official 235:685d5f11838f 3047 */
mbed_official 235:685d5f11838f 3048 static HAL_SD_ErrorTypedef SD_WideBus_Enable(SD_HandleTypeDef *hsd)
mbed_official 235:685d5f11838f 3049 {
mbed_official 235:685d5f11838f 3050 SDIO_CmdInitTypeDef sdio_cmdinitstructure;
mbed_official 235:685d5f11838f 3051 HAL_SD_ErrorTypedef errorstate = SD_OK;
mbed_official 235:685d5f11838f 3052
mbed_official 235:685d5f11838f 3053 uint32_t scr[2] = {0, 0};
mbed_official 235:685d5f11838f 3054
mbed_official 235:685d5f11838f 3055 if((SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED) == SD_CARD_LOCKED)
mbed_official 235:685d5f11838f 3056 {
mbed_official 235:685d5f11838f 3057 errorstate = SD_LOCK_UNLOCK_FAILED;
mbed_official 235:685d5f11838f 3058
mbed_official 235:685d5f11838f 3059 return errorstate;
mbed_official 235:685d5f11838f 3060 }
mbed_official 235:685d5f11838f 3061
mbed_official 235:685d5f11838f 3062 /* Get SCR Register */
mbed_official 235:685d5f11838f 3063 errorstate = SD_FindSCR(hsd, scr);
mbed_official 235:685d5f11838f 3064
mbed_official 235:685d5f11838f 3065 if(errorstate != SD_OK)
mbed_official 235:685d5f11838f 3066 {
mbed_official 235:685d5f11838f 3067 return errorstate;
mbed_official 235:685d5f11838f 3068 }
mbed_official 235:685d5f11838f 3069
mbed_official 235:685d5f11838f 3070 /* If requested card supports wide bus operation */
mbed_official 235:685d5f11838f 3071 if((scr[1] & SD_WIDE_BUS_SUPPORT) != SD_ALLZERO)
mbed_official 235:685d5f11838f 3072 {
mbed_official 235:685d5f11838f 3073 /* Send CMD55 APP_CMD with argument as card's RCA.*/
mbed_official 235:685d5f11838f 3074 sdio_cmdinitstructure.Argument = (uint32_t)(hsd->RCA << 16);
mbed_official 235:685d5f11838f 3075 sdio_cmdinitstructure.CmdIndex = SD_CMD_APP_CMD;
mbed_official 235:685d5f11838f 3076 sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT;
mbed_official 235:685d5f11838f 3077 sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
mbed_official 235:685d5f11838f 3078 sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE;
mbed_official 235:685d5f11838f 3079 SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
mbed_official 235:685d5f11838f 3080
mbed_official 235:685d5f11838f 3081 /* Check for error conditions */
mbed_official 235:685d5f11838f 3082 errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_CMD);
mbed_official 235:685d5f11838f 3083
mbed_official 235:685d5f11838f 3084 if(errorstate != SD_OK)
mbed_official 235:685d5f11838f 3085 {
mbed_official 235:685d5f11838f 3086 return errorstate;
mbed_official 235:685d5f11838f 3087 }
mbed_official 235:685d5f11838f 3088
mbed_official 235:685d5f11838f 3089 /* Send ACMD6 APP_CMD with argument as 2 for wide bus mode */
mbed_official 235:685d5f11838f 3090 sdio_cmdinitstructure.Argument = 2;
mbed_official 235:685d5f11838f 3091 sdio_cmdinitstructure.CmdIndex = SD_CMD_APP_SD_SET_BUSWIDTH;
mbed_official 235:685d5f11838f 3092 SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
mbed_official 235:685d5f11838f 3093
mbed_official 235:685d5f11838f 3094 /* Check for error conditions */
mbed_official 235:685d5f11838f 3095 errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_SD_SET_BUSWIDTH);
mbed_official 235:685d5f11838f 3096
mbed_official 235:685d5f11838f 3097 if(errorstate != SD_OK)
mbed_official 235:685d5f11838f 3098 {
mbed_official 235:685d5f11838f 3099 return errorstate;
mbed_official 235:685d5f11838f 3100 }
mbed_official 235:685d5f11838f 3101
mbed_official 235:685d5f11838f 3102 return errorstate;
mbed_official 235:685d5f11838f 3103 }
mbed_official 235:685d5f11838f 3104 else
mbed_official 235:685d5f11838f 3105 {
mbed_official 235:685d5f11838f 3106 errorstate = SD_REQUEST_NOT_APPLICABLE;
mbed_official 235:685d5f11838f 3107
mbed_official 235:685d5f11838f 3108 return errorstate;
mbed_official 235:685d5f11838f 3109 }
mbed_official 235:685d5f11838f 3110 }
mbed_official 235:685d5f11838f 3111
mbed_official 235:685d5f11838f 3112 /**
mbed_official 235:685d5f11838f 3113 * @brief Disables the SDIO wide bus mode.
mbed_official 235:685d5f11838f 3114 * @param hsd: SD handle
mbed_official 235:685d5f11838f 3115 * @retval SD Card error state
mbed_official 235:685d5f11838f 3116 */
mbed_official 235:685d5f11838f 3117 static HAL_SD_ErrorTypedef SD_WideBus_Disable(SD_HandleTypeDef *hsd)
mbed_official 235:685d5f11838f 3118 {
mbed_official 235:685d5f11838f 3119 SDIO_CmdInitTypeDef sdio_cmdinitstructure;
mbed_official 235:685d5f11838f 3120 HAL_SD_ErrorTypedef errorstate = SD_OK;
mbed_official 235:685d5f11838f 3121
mbed_official 235:685d5f11838f 3122 uint32_t scr[2] = {0, 0};
mbed_official 235:685d5f11838f 3123
mbed_official 235:685d5f11838f 3124 if((SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED) == SD_CARD_LOCKED)
mbed_official 235:685d5f11838f 3125 {
mbed_official 235:685d5f11838f 3126 errorstate = SD_LOCK_UNLOCK_FAILED;
mbed_official 235:685d5f11838f 3127
mbed_official 235:685d5f11838f 3128 return errorstate;
mbed_official 235:685d5f11838f 3129 }
mbed_official 235:685d5f11838f 3130
mbed_official 235:685d5f11838f 3131 /* Get SCR Register */
mbed_official 235:685d5f11838f 3132 errorstate = SD_FindSCR(hsd, scr);
mbed_official 235:685d5f11838f 3133
mbed_official 235:685d5f11838f 3134 if(errorstate != SD_OK)
mbed_official 235:685d5f11838f 3135 {
mbed_official 235:685d5f11838f 3136 return errorstate;
mbed_official 235:685d5f11838f 3137 }
mbed_official 235:685d5f11838f 3138
mbed_official 235:685d5f11838f 3139 /* If requested card supports 1 bit mode operation */
mbed_official 235:685d5f11838f 3140 if((scr[1] & SD_SINGLE_BUS_SUPPORT) != SD_ALLZERO)
mbed_official 235:685d5f11838f 3141 {
mbed_official 235:685d5f11838f 3142 /* Send CMD55 APP_CMD with argument as card's RCA */
mbed_official 235:685d5f11838f 3143 sdio_cmdinitstructure.Argument = (uint32_t)(hsd->RCA << 16);
mbed_official 235:685d5f11838f 3144 sdio_cmdinitstructure.CmdIndex = SD_CMD_APP_CMD;
mbed_official 235:685d5f11838f 3145 sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT;
mbed_official 235:685d5f11838f 3146 sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
mbed_official 235:685d5f11838f 3147 sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE;
mbed_official 235:685d5f11838f 3148 SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
mbed_official 235:685d5f11838f 3149
mbed_official 235:685d5f11838f 3150 /* Check for error conditions */
mbed_official 235:685d5f11838f 3151 errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_CMD);
mbed_official 235:685d5f11838f 3152
mbed_official 235:685d5f11838f 3153 if(errorstate != SD_OK)
mbed_official 235:685d5f11838f 3154 {
mbed_official 235:685d5f11838f 3155 return errorstate;
mbed_official 235:685d5f11838f 3156 }
mbed_official 235:685d5f11838f 3157
mbed_official 235:685d5f11838f 3158 /* Send ACMD6 APP_CMD with argument as 0 for single bus mode */
mbed_official 235:685d5f11838f 3159 sdio_cmdinitstructure.Argument = 0;
mbed_official 235:685d5f11838f 3160 sdio_cmdinitstructure.CmdIndex = SD_CMD_APP_SD_SET_BUSWIDTH;
mbed_official 235:685d5f11838f 3161 SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
mbed_official 235:685d5f11838f 3162
mbed_official 235:685d5f11838f 3163 /* Check for error conditions */
mbed_official 235:685d5f11838f 3164 errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_SD_SET_BUSWIDTH);
mbed_official 235:685d5f11838f 3165
mbed_official 235:685d5f11838f 3166 if(errorstate != SD_OK)
mbed_official 235:685d5f11838f 3167 {
mbed_official 235:685d5f11838f 3168 return errorstate;
mbed_official 235:685d5f11838f 3169 }
mbed_official 235:685d5f11838f 3170
mbed_official 235:685d5f11838f 3171 return errorstate;
mbed_official 235:685d5f11838f 3172 }
mbed_official 235:685d5f11838f 3173 else
mbed_official 235:685d5f11838f 3174 {
mbed_official 235:685d5f11838f 3175 errorstate = SD_REQUEST_NOT_APPLICABLE;
mbed_official 235:685d5f11838f 3176
mbed_official 235:685d5f11838f 3177 return errorstate;
mbed_official 235:685d5f11838f 3178 }
mbed_official 235:685d5f11838f 3179 }
mbed_official 235:685d5f11838f 3180
mbed_official 235:685d5f11838f 3181
mbed_official 235:685d5f11838f 3182 /**
mbed_official 235:685d5f11838f 3183 * @brief Finds the SD card SCR register value.
mbed_official 235:685d5f11838f 3184 * @param hsd: SD handle
mbed_official 235:685d5f11838f 3185 * @param pSCR: pointer to the buffer that will contain the SCR value
mbed_official 235:685d5f11838f 3186 * @retval SD Card error state
mbed_official 235:685d5f11838f 3187 */
mbed_official 235:685d5f11838f 3188 static HAL_SD_ErrorTypedef SD_FindSCR(SD_HandleTypeDef *hsd, uint32_t *pSCR)
mbed_official 235:685d5f11838f 3189 {
mbed_official 235:685d5f11838f 3190 SDIO_CmdInitTypeDef sdio_cmdinitstructure;
mbed_official 235:685d5f11838f 3191 SDIO_DataInitTypeDef sdio_datainitstructure;
mbed_official 235:685d5f11838f 3192 HAL_SD_ErrorTypedef errorstate = SD_OK;
mbed_official 235:685d5f11838f 3193 uint32_t index = 0;
mbed_official 235:685d5f11838f 3194 uint32_t tempscr[2] = {0, 0};
mbed_official 235:685d5f11838f 3195
mbed_official 235:685d5f11838f 3196 /* Set Block Size To 8 Bytes */
mbed_official 235:685d5f11838f 3197 /* Send CMD55 APP_CMD with argument as card's RCA */
mbed_official 235:685d5f11838f 3198 sdio_cmdinitstructure.Argument = (uint32_t)8;
mbed_official 235:685d5f11838f 3199 sdio_cmdinitstructure.CmdIndex = SD_CMD_SET_BLOCKLEN;
mbed_official 235:685d5f11838f 3200 sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT;
mbed_official 235:685d5f11838f 3201 sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
mbed_official 235:685d5f11838f 3202 sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE;
mbed_official 235:685d5f11838f 3203 SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
mbed_official 235:685d5f11838f 3204
mbed_official 235:685d5f11838f 3205 /* Check for error conditions */
mbed_official 235:685d5f11838f 3206 errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN);
mbed_official 235:685d5f11838f 3207
mbed_official 235:685d5f11838f 3208 if(errorstate != SD_OK)
mbed_official 235:685d5f11838f 3209 {
mbed_official 235:685d5f11838f 3210 return errorstate;
mbed_official 235:685d5f11838f 3211 }
mbed_official 235:685d5f11838f 3212
mbed_official 235:685d5f11838f 3213 /* Send CMD55 APP_CMD with argument as card's RCA */
mbed_official 235:685d5f11838f 3214 sdio_cmdinitstructure.Argument = (uint32_t)((hsd->RCA) << 16);
mbed_official 235:685d5f11838f 3215 sdio_cmdinitstructure.CmdIndex = SD_CMD_APP_CMD;
mbed_official 235:685d5f11838f 3216 SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
mbed_official 235:685d5f11838f 3217
mbed_official 235:685d5f11838f 3218 /* Check for error conditions */
mbed_official 235:685d5f11838f 3219 errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_CMD);
mbed_official 235:685d5f11838f 3220
mbed_official 235:685d5f11838f 3221 if(errorstate != SD_OK)
mbed_official 235:685d5f11838f 3222 {
mbed_official 235:685d5f11838f 3223 return errorstate;
mbed_official 235:685d5f11838f 3224 }
mbed_official 235:685d5f11838f 3225 sdio_datainitstructure.DataTimeOut = SD_DATATIMEOUT;
mbed_official 235:685d5f11838f 3226 sdio_datainitstructure.DataLength = 8;
mbed_official 235:685d5f11838f 3227 sdio_datainitstructure.DataBlockSize = SDIO_DATABLOCK_SIZE_8B;
mbed_official 235:685d5f11838f 3228 sdio_datainitstructure.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO;
mbed_official 235:685d5f11838f 3229 sdio_datainitstructure.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
mbed_official 235:685d5f11838f 3230 sdio_datainitstructure.DPSM = SDIO_DPSM_ENABLE;
mbed_official 235:685d5f11838f 3231 SDIO_DataConfig(hsd->Instance, &sdio_datainitstructure);
mbed_official 235:685d5f11838f 3232
mbed_official 235:685d5f11838f 3233 /* Send ACMD51 SD_APP_SEND_SCR with argument as 0 */
mbed_official 235:685d5f11838f 3234 sdio_cmdinitstructure.Argument = 0;
mbed_official 235:685d5f11838f 3235 sdio_cmdinitstructure.CmdIndex = SD_CMD_SD_APP_SEND_SCR;
mbed_official 235:685d5f11838f 3236 SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
mbed_official 235:685d5f11838f 3237
mbed_official 235:685d5f11838f 3238 /* Check for error conditions */
mbed_official 235:685d5f11838f 3239 errorstate = SD_CmdResp1Error(hsd, SD_CMD_SD_APP_SEND_SCR);
mbed_official 235:685d5f11838f 3240
mbed_official 235:685d5f11838f 3241 if(errorstate != SD_OK)
mbed_official 235:685d5f11838f 3242 {
mbed_official 235:685d5f11838f 3243 return errorstate;
mbed_official 235:685d5f11838f 3244 }
mbed_official 532:fe11edbda85c 3245 #ifdef SDIO_STA_STBITERR
mbed_official 235:685d5f11838f 3246 while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR))
mbed_official 532:fe11edbda85c 3247 #else /* SDIO_STA_STBITERR not defined */
mbed_official 532:fe11edbda85c 3248 while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND))
mbed_official 532:fe11edbda85c 3249 #endif /* SDIO_STA_STBITERR */
mbed_official 235:685d5f11838f 3250 {
mbed_official 235:685d5f11838f 3251 if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXDAVL))
mbed_official 235:685d5f11838f 3252 {
mbed_official 235:685d5f11838f 3253 *(tempscr + index) = SDIO_ReadFIFO(hsd->Instance);
mbed_official 235:685d5f11838f 3254 index++;
mbed_official 235:685d5f11838f 3255 }
mbed_official 235:685d5f11838f 3256 }
mbed_official 235:685d5f11838f 3257
mbed_official 235:685d5f11838f 3258 if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT))
mbed_official 235:685d5f11838f 3259 {
mbed_official 235:685d5f11838f 3260 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DTIMEOUT);
mbed_official 235:685d5f11838f 3261
mbed_official 235:685d5f11838f 3262 errorstate = SD_DATA_TIMEOUT;
mbed_official 235:685d5f11838f 3263
mbed_official 235:685d5f11838f 3264 return errorstate;
mbed_official 235:685d5f11838f 3265 }
mbed_official 235:685d5f11838f 3266 else if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL))
mbed_official 235:685d5f11838f 3267 {
mbed_official 235:685d5f11838f 3268 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DCRCFAIL);
mbed_official 235:685d5f11838f 3269
mbed_official 235:685d5f11838f 3270 errorstate = SD_DATA_CRC_FAIL;
mbed_official 235:685d5f11838f 3271
mbed_official 235:685d5f11838f 3272 return errorstate;
mbed_official 235:685d5f11838f 3273 }
mbed_official 235:685d5f11838f 3274 else if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR))
mbed_official 235:685d5f11838f 3275 {
mbed_official 235:685d5f11838f 3276 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_RXOVERR);
mbed_official 235:685d5f11838f 3277
mbed_official 235:685d5f11838f 3278 errorstate = SD_RX_OVERRUN;
mbed_official 235:685d5f11838f 3279
mbed_official 235:685d5f11838f 3280 return errorstate;
mbed_official 235:685d5f11838f 3281 }
mbed_official 532:fe11edbda85c 3282 #ifdef SDIO_STA_STBITERR
mbed_official 235:685d5f11838f 3283 else if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_STBITERR))
mbed_official 235:685d5f11838f 3284 {
mbed_official 235:685d5f11838f 3285 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_STBITERR);
mbed_official 235:685d5f11838f 3286
mbed_official 235:685d5f11838f 3287 errorstate = SD_START_BIT_ERR;
mbed_official 235:685d5f11838f 3288
mbed_official 235:685d5f11838f 3289 return errorstate;
mbed_official 235:685d5f11838f 3290 }
mbed_official 532:fe11edbda85c 3291 #endif /* SDIO_STA_STBITERR */
mbed_official 235:685d5f11838f 3292 else
mbed_official 235:685d5f11838f 3293 {
mbed_official 235:685d5f11838f 3294 /* No error flag set */
mbed_official 235:685d5f11838f 3295 }
mbed_official 235:685d5f11838f 3296
mbed_official 235:685d5f11838f 3297 /* Clear all the static flags */
mbed_official 235:685d5f11838f 3298 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
mbed_official 235:685d5f11838f 3299
mbed_official 235:685d5f11838f 3300 *(pSCR + 1) = ((tempscr[0] & SD_0TO7BITS) << 24) | ((tempscr[0] & SD_8TO15BITS) << 8) |\
mbed_official 235:685d5f11838f 3301 ((tempscr[0] & SD_16TO23BITS) >> 8) | ((tempscr[0] & SD_24TO31BITS) >> 24);
mbed_official 235:685d5f11838f 3302
mbed_official 235:685d5f11838f 3303 *(pSCR) = ((tempscr[1] & SD_0TO7BITS) << 24) | ((tempscr[1] & SD_8TO15BITS) << 8) |\
mbed_official 235:685d5f11838f 3304 ((tempscr[1] & SD_16TO23BITS) >> 8) | ((tempscr[1] & SD_24TO31BITS) >> 24);
mbed_official 235:685d5f11838f 3305
mbed_official 235:685d5f11838f 3306 return errorstate;
mbed_official 235:685d5f11838f 3307 }
mbed_official 235:685d5f11838f 3308
mbed_official 235:685d5f11838f 3309 /**
mbed_official 235:685d5f11838f 3310 * @brief Checks if the SD card is in programming state.
mbed_official 235:685d5f11838f 3311 * @param hsd: SD handle
mbed_official 235:685d5f11838f 3312 * @param pStatus: pointer to the variable that will contain the SD card state
mbed_official 235:685d5f11838f 3313 * @retval SD Card error state
mbed_official 235:685d5f11838f 3314 */
mbed_official 235:685d5f11838f 3315 static HAL_SD_ErrorTypedef SD_IsCardProgramming(SD_HandleTypeDef *hsd, uint8_t *pStatus)
mbed_official 235:685d5f11838f 3316 {
mbed_official 235:685d5f11838f 3317 SDIO_CmdInitTypeDef sdio_cmdinitstructure;
mbed_official 235:685d5f11838f 3318 HAL_SD_ErrorTypedef errorstate = SD_OK;
mbed_official 235:685d5f11838f 3319 __IO uint32_t responseR1 = 0;
mbed_official 235:685d5f11838f 3320
mbed_official 235:685d5f11838f 3321 sdio_cmdinitstructure.Argument = (uint32_t)(hsd->RCA << 16);
mbed_official 235:685d5f11838f 3322 sdio_cmdinitstructure.CmdIndex = SD_CMD_SEND_STATUS;
mbed_official 235:685d5f11838f 3323 sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT;
mbed_official 235:685d5f11838f 3324 sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
mbed_official 235:685d5f11838f 3325 sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE;
mbed_official 235:685d5f11838f 3326 SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
mbed_official 235:685d5f11838f 3327
mbed_official 235:685d5f11838f 3328 while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT))
mbed_official 235:685d5f11838f 3329 {
mbed_official 235:685d5f11838f 3330 }
mbed_official 235:685d5f11838f 3331
mbed_official 235:685d5f11838f 3332 if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CTIMEOUT))
mbed_official 235:685d5f11838f 3333 {
mbed_official 235:685d5f11838f 3334 errorstate = SD_CMD_RSP_TIMEOUT;
mbed_official 235:685d5f11838f 3335
mbed_official 235:685d5f11838f 3336 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CTIMEOUT);
mbed_official 235:685d5f11838f 3337
mbed_official 235:685d5f11838f 3338 return errorstate;
mbed_official 235:685d5f11838f 3339 }
mbed_official 235:685d5f11838f 3340 else if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL))
mbed_official 235:685d5f11838f 3341 {
mbed_official 235:685d5f11838f 3342 errorstate = SD_CMD_CRC_FAIL;
mbed_official 235:685d5f11838f 3343
mbed_official 235:685d5f11838f 3344 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CCRCFAIL);
mbed_official 235:685d5f11838f 3345
mbed_official 235:685d5f11838f 3346 return errorstate;
mbed_official 235:685d5f11838f 3347 }
mbed_official 235:685d5f11838f 3348 else
mbed_official 235:685d5f11838f 3349 {
mbed_official 235:685d5f11838f 3350 /* No error flag set */
mbed_official 235:685d5f11838f 3351 }
mbed_official 235:685d5f11838f 3352
mbed_official 235:685d5f11838f 3353 /* Check response received is of desired command */
mbed_official 235:685d5f11838f 3354 if((uint32_t)SDIO_GetCommandResponse(hsd->Instance) != SD_CMD_SEND_STATUS)
mbed_official 235:685d5f11838f 3355 {
mbed_official 235:685d5f11838f 3356 errorstate = SD_ILLEGAL_CMD;
mbed_official 235:685d5f11838f 3357
mbed_official 235:685d5f11838f 3358 return errorstate;
mbed_official 235:685d5f11838f 3359 }
mbed_official 235:685d5f11838f 3360
mbed_official 235:685d5f11838f 3361 /* Clear all the static flags */
mbed_official 235:685d5f11838f 3362 __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
mbed_official 235:685d5f11838f 3363
mbed_official 235:685d5f11838f 3364
mbed_official 235:685d5f11838f 3365 /* We have received response, retrieve it for analysis */
mbed_official 235:685d5f11838f 3366 responseR1 = SDIO_GetResponse(SDIO_RESP1);
mbed_official 235:685d5f11838f 3367
mbed_official 235:685d5f11838f 3368 /* Find out card status */
mbed_official 235:685d5f11838f 3369 *pStatus = (uint8_t)((responseR1 >> 9) & 0x0000000F);
mbed_official 235:685d5f11838f 3370
mbed_official 235:685d5f11838f 3371 if((responseR1 & SD_OCR_ERRORBITS) == SD_ALLZERO)
mbed_official 235:685d5f11838f 3372 {
mbed_official 235:685d5f11838f 3373 return errorstate;
mbed_official 235:685d5f11838f 3374 }
mbed_official 235:685d5f11838f 3375
mbed_official 235:685d5f11838f 3376 if((responseR1 & SD_OCR_ADDR_OUT_OF_RANGE) == SD_OCR_ADDR_OUT_OF_RANGE)
mbed_official 235:685d5f11838f 3377 {
mbed_official 235:685d5f11838f 3378 return(SD_ADDR_OUT_OF_RANGE);
mbed_official 235:685d5f11838f 3379 }
mbed_official 235:685d5f11838f 3380
mbed_official 235:685d5f11838f 3381 if((responseR1 & SD_OCR_ADDR_MISALIGNED) == SD_OCR_ADDR_MISALIGNED)
mbed_official 235:685d5f11838f 3382 {
mbed_official 235:685d5f11838f 3383 return(SD_ADDR_MISALIGNED);
mbed_official 235:685d5f11838f 3384 }
mbed_official 235:685d5f11838f 3385
mbed_official 235:685d5f11838f 3386 if((responseR1 & SD_OCR_BLOCK_LEN_ERR) == SD_OCR_BLOCK_LEN_ERR)
mbed_official 235:685d5f11838f 3387 {
mbed_official 235:685d5f11838f 3388 return(SD_BLOCK_LEN_ERR);
mbed_official 235:685d5f11838f 3389 }
mbed_official 235:685d5f11838f 3390
mbed_official 235:685d5f11838f 3391 if((responseR1 & SD_OCR_ERASE_SEQ_ERR) == SD_OCR_ERASE_SEQ_ERR)
mbed_official 235:685d5f11838f 3392 {
mbed_official 235:685d5f11838f 3393 return(SD_ERASE_SEQ_ERR);
mbed_official 235:685d5f11838f 3394 }
mbed_official 235:685d5f11838f 3395
mbed_official 235:685d5f11838f 3396 if((responseR1 & SD_OCR_BAD_ERASE_PARAM) == SD_OCR_BAD_ERASE_PARAM)
mbed_official 235:685d5f11838f 3397 {
mbed_official 235:685d5f11838f 3398 return(SD_BAD_ERASE_PARAM);
mbed_official 235:685d5f11838f 3399 }
mbed_official 235:685d5f11838f 3400
mbed_official 235:685d5f11838f 3401 if((responseR1 & SD_OCR_WRITE_PROT_VIOLATION) == SD_OCR_WRITE_PROT_VIOLATION)
mbed_official 235:685d5f11838f 3402 {
mbed_official 235:685d5f11838f 3403 return(SD_WRITE_PROT_VIOLATION);
mbed_official 235:685d5f11838f 3404 }
mbed_official 235:685d5f11838f 3405
mbed_official 235:685d5f11838f 3406 if((responseR1 & SD_OCR_LOCK_UNLOCK_FAILED) == SD_OCR_LOCK_UNLOCK_FAILED)
mbed_official 235:685d5f11838f 3407 {
mbed_official 235:685d5f11838f 3408 return(SD_LOCK_UNLOCK_FAILED);
mbed_official 235:685d5f11838f 3409 }
mbed_official 235:685d5f11838f 3410
mbed_official 235:685d5f11838f 3411 if((responseR1 & SD_OCR_COM_CRC_FAILED) == SD_OCR_COM_CRC_FAILED)
mbed_official 235:685d5f11838f 3412 {
mbed_official 235:685d5f11838f 3413 return(SD_COM_CRC_FAILED);
mbed_official 235:685d5f11838f 3414 }
mbed_official 235:685d5f11838f 3415
mbed_official 235:685d5f11838f 3416 if((responseR1 & SD_OCR_ILLEGAL_CMD) == SD_OCR_ILLEGAL_CMD)
mbed_official 235:685d5f11838f 3417 {
mbed_official 235:685d5f11838f 3418 return(SD_ILLEGAL_CMD);
mbed_official 235:685d5f11838f 3419 }
mbed_official 235:685d5f11838f 3420
mbed_official 235:685d5f11838f 3421 if((responseR1 & SD_OCR_CARD_ECC_FAILED) == SD_OCR_CARD_ECC_FAILED)
mbed_official 235:685d5f11838f 3422 {
mbed_official 235:685d5f11838f 3423 return(SD_CARD_ECC_FAILED);
mbed_official 235:685d5f11838f 3424 }
mbed_official 235:685d5f11838f 3425
mbed_official 235:685d5f11838f 3426 if((responseR1 & SD_OCR_CC_ERROR) == SD_OCR_CC_ERROR)
mbed_official 235:685d5f11838f 3427 {
mbed_official 235:685d5f11838f 3428 return(SD_CC_ERROR);
mbed_official 235:685d5f11838f 3429 }
mbed_official 235:685d5f11838f 3430
mbed_official 235:685d5f11838f 3431 if((responseR1 & SD_OCR_GENERAL_UNKNOWN_ERROR) == SD_OCR_GENERAL_UNKNOWN_ERROR)
mbed_official 235:685d5f11838f 3432 {
mbed_official 235:685d5f11838f 3433 return(SD_GENERAL_UNKNOWN_ERROR);
mbed_official 235:685d5f11838f 3434 }
mbed_official 235:685d5f11838f 3435
mbed_official 235:685d5f11838f 3436 if((responseR1 & SD_OCR_STREAM_READ_UNDERRUN) == SD_OCR_STREAM_READ_UNDERRUN)
mbed_official 235:685d5f11838f 3437 {
mbed_official 235:685d5f11838f 3438 return(SD_STREAM_READ_UNDERRUN);
mbed_official 235:685d5f11838f 3439 }
mbed_official 235:685d5f11838f 3440
mbed_official 235:685d5f11838f 3441 if((responseR1 & SD_OCR_STREAM_WRITE_OVERRUN) == SD_OCR_STREAM_WRITE_OVERRUN)
mbed_official 235:685d5f11838f 3442 {
mbed_official 235:685d5f11838f 3443 return(SD_STREAM_WRITE_OVERRUN);
mbed_official 235:685d5f11838f 3444 }
mbed_official 235:685d5f11838f 3445
mbed_official 532:fe11edbda85c 3446 if((responseR1 & SD_OCR_CID_CSD_OVERWRITE) == SD_OCR_CID_CSD_OVERWRITE)
mbed_official 235:685d5f11838f 3447 {
mbed_official 235:685d5f11838f 3448 return(SD_CID_CSD_OVERWRITE);
mbed_official 235:685d5f11838f 3449 }
mbed_official 235:685d5f11838f 3450
mbed_official 235:685d5f11838f 3451 if((responseR1 & SD_OCR_WP_ERASE_SKIP) == SD_OCR_WP_ERASE_SKIP)
mbed_official 235:685d5f11838f 3452 {
mbed_official 235:685d5f11838f 3453 return(SD_WP_ERASE_SKIP);
mbed_official 235:685d5f11838f 3454 }
mbed_official 235:685d5f11838f 3455
mbed_official 235:685d5f11838f 3456 if((responseR1 & SD_OCR_CARD_ECC_DISABLED) == SD_OCR_CARD_ECC_DISABLED)
mbed_official 235:685d5f11838f 3457 {
mbed_official 235:685d5f11838f 3458 return(SD_CARD_ECC_DISABLED);
mbed_official 235:685d5f11838f 3459 }
mbed_official 235:685d5f11838f 3460
mbed_official 235:685d5f11838f 3461 if((responseR1 & SD_OCR_ERASE_RESET) == SD_OCR_ERASE_RESET)
mbed_official 235:685d5f11838f 3462 {
mbed_official 235:685d5f11838f 3463 return(SD_ERASE_RESET);
mbed_official 235:685d5f11838f 3464 }
mbed_official 235:685d5f11838f 3465
mbed_official 235:685d5f11838f 3466 if((responseR1 & SD_OCR_AKE_SEQ_ERROR) == SD_OCR_AKE_SEQ_ERROR)
mbed_official 235:685d5f11838f 3467 {
mbed_official 235:685d5f11838f 3468 return(SD_AKE_SEQ_ERROR);
mbed_official 235:685d5f11838f 3469 }
mbed_official 235:685d5f11838f 3470
mbed_official 235:685d5f11838f 3471 return errorstate;
mbed_official 235:685d5f11838f 3472 }
mbed_official 235:685d5f11838f 3473
mbed_official 235:685d5f11838f 3474 /**
mbed_official 235:685d5f11838f 3475 * @}
mbed_official 235:685d5f11838f 3476 */
mbed_official 235:685d5f11838f 3477
mbed_official 235:685d5f11838f 3478 #endif /* HAL_SD_MODULE_ENABLED */
mbed_official 532:fe11edbda85c 3479
mbed_official 235:685d5f11838f 3480 /**
mbed_official 235:685d5f11838f 3481 * @}
mbed_official 235:685d5f11838f 3482 */
mbed_official 235:685d5f11838f 3483
mbed_official 235:685d5f11838f 3484 /**
mbed_official 235:685d5f11838f 3485 * @}
mbed_official 235:685d5f11838f 3486 */
mbed_official 235:685d5f11838f 3487
mbed_official 235:685d5f11838f 3488 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/