mbed library sources

Dependents:   frdm_kl05z_gpio_test

Fork of mbed-src by mbed official

Committer:
shaoziyang
Date:
Sat Sep 13 14:25:46 2014 +0000
Revision:
323:9e901b0a5aa1
Parent:
235:685d5f11838f
test with CLOCK_SETUP = 0

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