fix LPC812 PWM

Dependents:   IR_LED_Send

Fork of mbed-dev by mbed official

Committer:
mbed_official
Date:
Tue Nov 10 09:30:11 2015 +0000
Revision:
19:112740acecfa
Parent:
0:9b334a45a8ff
Synchronized with git revision 7218418919aeaf775fb8d386ea7ee0dfc0c80ff9

Full URL: https://github.com/mbedmicro/mbed/commit/7218418919aeaf775fb8d386ea7ee0dfc0c80ff9/

DISCO_F469NI - add disco F469NI support

Who changed what in which revision?

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