mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

This library was superseded by mbed-dev - https://os.mbed.com/users/mbed_official/code/mbed-dev/.

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Committer:
mbed_official
Date:
Mon Nov 03 10:15:07 2014 +0000
Revision:
380:510f0c3515e3
Parent:
targets/cmsis/TARGET_STM/TARGET_NUCLEO_F411RE/stm32f4xx_hal_sd.c@352:95e80f5e68f6
Child:
532:fe11edbda85c
Synchronized with git revision 417f470ba9f4882d7079611cbc576afd9c49b0ef

Full URL: https://github.com/mbedmicro/mbed/commit/417f470ba9f4882d7079611cbc576afd9c49b0ef/

Targets: Factorisation of NUCLEO_F401RE and F411RE cmsis folders

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 352:95e80f5e68f6 2577 if(pCardStatus == HAL_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****/