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:
Wed Jul 01 09:45:11 2015 +0100
Revision:
579:53297373a894
Parent:
394:83f921546702
Synchronized with git revision d5b4d2ab9c47edb4dc5776e7177b0c2263459081

Full URL: https://github.com/mbedmicro/mbed/commit/d5b4d2ab9c47edb4dc5776e7177b0c2263459081/

Initial version of drivers for SAMR21

Who changed what in which revision?

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