mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
186:707f6e361f3e
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 167:e84263d55307 1 /**
AnnaBridge 167:e84263d55307 2 ******************************************************************************
AnnaBridge 167:e84263d55307 3 * @file stm32f2xx_hal_mmc.c
AnnaBridge 167:e84263d55307 4 * @author MCD Application Team
AnnaBridge 167:e84263d55307 5 * @version V1.2.1
AnnaBridge 167:e84263d55307 6 * @date 14-April-2017
AnnaBridge 167:e84263d55307 7 * @brief MMC card HAL module driver.
AnnaBridge 167:e84263d55307 8 * This file provides firmware functions to manage the following
AnnaBridge 167:e84263d55307 9 * functionalities of the Secure Digital (MMC) peripheral:
AnnaBridge 167:e84263d55307 10 * + Initialization and de-initialization functions
AnnaBridge 167:e84263d55307 11 * + IO operation functions
AnnaBridge 167:e84263d55307 12 * + Peripheral Control functions
AnnaBridge 167:e84263d55307 13 * + MMC card Control functions
AnnaBridge 167:e84263d55307 14 *
AnnaBridge 167:e84263d55307 15 @verbatim
AnnaBridge 167:e84263d55307 16 ==============================================================================
AnnaBridge 167:e84263d55307 17 ##### How to use this driver #####
AnnaBridge 167:e84263d55307 18 ==============================================================================
AnnaBridge 167:e84263d55307 19 [..]
AnnaBridge 167:e84263d55307 20 This driver implements a high level communication layer for read and write from/to
AnnaBridge 167:e84263d55307 21 this memory. The needed STM32 hardware resources (SDMMC and GPIO) are performed by
AnnaBridge 167:e84263d55307 22 the user in HAL_MMC_MspInit() function (MSP layer).
AnnaBridge 167:e84263d55307 23 Basically, the MSP layer configuration should be the same as we provide in the
AnnaBridge 167:e84263d55307 24 examples.
AnnaBridge 167:e84263d55307 25 You can easily tailor this configuration according to hardware resources.
AnnaBridge 167:e84263d55307 26
AnnaBridge 167:e84263d55307 27 [..]
AnnaBridge 167:e84263d55307 28 This driver is a generic layered driver for SDMMC memories which uses the HAL
AnnaBridge 167:e84263d55307 29 SDMMC driver functions to interface with MMC and eMMC cards devices.
AnnaBridge 167:e84263d55307 30 It is used as follows:
AnnaBridge 167:e84263d55307 31
AnnaBridge 167:e84263d55307 32 (#)Initialize the SDMMC low level resources by implement the HAL_MMC_MspInit() API:
AnnaBridge 167:e84263d55307 33 (##) Enable the SDMMC interface clock using __HAL_RCC_SDMMC_CLK_ENABLE();
AnnaBridge 167:e84263d55307 34 (##) SDMMC pins configuration for MMC card
AnnaBridge 167:e84263d55307 35 (+++) Enable the clock for the SDMMC GPIOs using the functions __HAL_RCC_GPIOx_CLK_ENABLE();
AnnaBridge 167:e84263d55307 36 (+++) Configure these SDMMC pins as alternate function pull-up using HAL_GPIO_Init()
AnnaBridge 167:e84263d55307 37 and according to your pin assignment;
AnnaBridge 167:e84263d55307 38 (##) DMA Configuration if you need to use DMA process (HAL_MMC_ReadBlocks_DMA()
AnnaBridge 167:e84263d55307 39 and HAL_MMC_WriteBlocks_DMA() APIs).
AnnaBridge 167:e84263d55307 40 (+++) Enable the DMAx interface clock using __HAL_RCC_DMAx_CLK_ENABLE();
AnnaBridge 167:e84263d55307 41 (+++) Configure the DMA using the function HAL_DMA_Init() with predeclared and filled.
AnnaBridge 167:e84263d55307 42 (##) NVIC configuration if you need to use interrupt process when using DMA transfer.
AnnaBridge 167:e84263d55307 43 (+++) Configure the SDMMC and DMA interrupt priorities using functions
AnnaBridge 167:e84263d55307 44 HAL_NVIC_SetPriority(); DMA priority is superior to SDMMC's priority
AnnaBridge 167:e84263d55307 45 (+++) Enable the NVIC DMA and SDMMC IRQs using function HAL_NVIC_EnableIRQ()
AnnaBridge 167:e84263d55307 46 (+++) SDMMC interrupts are managed using the macros __HAL_MMC_ENABLE_IT()
AnnaBridge 167:e84263d55307 47 and __HAL_MMC_DISABLE_IT() inside the communication process.
AnnaBridge 167:e84263d55307 48 (+++) SDMMC interrupts pending bits are managed using the macros __HAL_MMC_GET_IT()
AnnaBridge 167:e84263d55307 49 and __HAL_MMC_CLEAR_IT()
AnnaBridge 167:e84263d55307 50 (##) NVIC configuration if you need to use interrupt process (HAL_MMC_ReadBlocks_IT()
AnnaBridge 167:e84263d55307 51 and HAL_MMC_WriteBlocks_IT() APIs).
AnnaBridge 167:e84263d55307 52 (+++) Configure the SDMMC interrupt priorities using function
AnnaBridge 167:e84263d55307 53 HAL_NVIC_SetPriority();
AnnaBridge 167:e84263d55307 54 (+++) Enable the NVIC SDMMC IRQs using function HAL_NVIC_EnableIRQ()
AnnaBridge 167:e84263d55307 55 (+++) SDMMC interrupts are managed using the macros __HAL_MMC_ENABLE_IT()
AnnaBridge 167:e84263d55307 56 and __HAL_MMC_DISABLE_IT() inside the communication process.
AnnaBridge 167:e84263d55307 57 (+++) SDMMC interrupts pending bits are managed using the macros __HAL_MMC_GET_IT()
AnnaBridge 167:e84263d55307 58 and __HAL_MMC_CLEAR_IT()
AnnaBridge 167:e84263d55307 59 (#) At this stage, you can perform MMC read/write/erase operations after MMC card initialization
AnnaBridge 167:e84263d55307 60
AnnaBridge 167:e84263d55307 61
AnnaBridge 167:e84263d55307 62 *** MMC Card Initialization and configuration ***
AnnaBridge 167:e84263d55307 63 ================================================
AnnaBridge 167:e84263d55307 64 [..]
AnnaBridge 167:e84263d55307 65 To initialize the MMC Card, use the HAL_MMC_Init() function. It Initializes
AnnaBridge 167:e84263d55307 66 SDMMC IP (STM32 side) and the MMC Card, and put it into StandBy State (Ready for data transfer).
AnnaBridge 167:e84263d55307 67 This function provide the following operations:
AnnaBridge 167:e84263d55307 68
AnnaBridge 167:e84263d55307 69 (#) Initialize the SDMMC peripheral interface with defaullt configuration.
AnnaBridge 167:e84263d55307 70 The initialization process is done at 400KHz. You can change or adapt
AnnaBridge 167:e84263d55307 71 this frequency by adjusting the "ClockDiv" field.
AnnaBridge 167:e84263d55307 72 The MMC Card frequency (SDMMC_CK) is computed as follows:
AnnaBridge 167:e84263d55307 73
AnnaBridge 167:e84263d55307 74 SDMMC_CK = SDMMCCLK / (ClockDiv + 2)
AnnaBridge 167:e84263d55307 75
AnnaBridge 167:e84263d55307 76 In initialization mode and according to the MMC Card standard,
AnnaBridge 167:e84263d55307 77 make sure that the SDMMC_CK frequency doesn't exceed 400KHz.
AnnaBridge 167:e84263d55307 78
AnnaBridge 167:e84263d55307 79 This phase of initialization is done through SDMMC_Init() and
AnnaBridge 167:e84263d55307 80 SDMMC_PowerState_ON() SDMMC low level APIs.
AnnaBridge 167:e84263d55307 81
AnnaBridge 167:e84263d55307 82 (#) Initialize the MMC card. The API used is HAL_MMC_InitCard().
AnnaBridge 167:e84263d55307 83 This phase allows the card initialization and identification
AnnaBridge 167:e84263d55307 84 and check the MMC Card type (Standard Capacity or High Capacity)
AnnaBridge 167:e84263d55307 85 The initialization flow is compatible with MMC standard.
AnnaBridge 167:e84263d55307 86
AnnaBridge 167:e84263d55307 87 This API (HAL_MMC_InitCard()) could be used also to reinitialize the card in case
AnnaBridge 167:e84263d55307 88 of plug-off plug-in.
AnnaBridge 167:e84263d55307 89
AnnaBridge 167:e84263d55307 90 (#) Configure the MMC Card Data transfer frequency. By Default, the card transfer
AnnaBridge 167:e84263d55307 91 frequency is set to 24MHz. You can change or adapt this frequency by adjusting
AnnaBridge 167:e84263d55307 92 the "ClockDiv" field.
AnnaBridge 167:e84263d55307 93 In transfer mode and according to the MMC Card standard, make sure that the
AnnaBridge 167:e84263d55307 94 SDMMC_CK frequency doesn't exceed 25MHz and 50MHz in High-speed mode switch.
AnnaBridge 167:e84263d55307 95 To be able to use a frequency higher than 24MHz, you should use the SDMMC
AnnaBridge 167:e84263d55307 96 peripheral in bypass mode. Refer to the corresponding reference manual
AnnaBridge 167:e84263d55307 97 for more details.
AnnaBridge 167:e84263d55307 98
AnnaBridge 167:e84263d55307 99 (#) Select the corresponding MMC Card according to the address read with the step 2.
AnnaBridge 167:e84263d55307 100
AnnaBridge 167:e84263d55307 101 (#) Configure the MMC Card in wide bus mode: 4-bits data.
AnnaBridge 167:e84263d55307 102
AnnaBridge 167:e84263d55307 103 *** MMC Card Read operation ***
AnnaBridge 167:e84263d55307 104 ==============================
AnnaBridge 167:e84263d55307 105 [..]
AnnaBridge 167:e84263d55307 106 (+) You can read from MMC card in polling mode by using function HAL_MMC_ReadBlocks().
AnnaBridge 167:e84263d55307 107 This function allows the read of 512 bytes blocks.
AnnaBridge 167:e84263d55307 108 You can choose either one block read operation or multiple block read operation
AnnaBridge 167:e84263d55307 109 by adjusting the "NumberOfBlocks" parameter.
AnnaBridge 167:e84263d55307 110 After this, you have to ensure that the transfer is done correctly. The check is done
AnnaBridge 167:e84263d55307 111 through HAL_MMC_GetCardState() function for MMC card state.
AnnaBridge 167:e84263d55307 112
AnnaBridge 167:e84263d55307 113 (+) You can read from MMC card in DMA mode by using function HAL_MMC_ReadBlocks_DMA().
AnnaBridge 167:e84263d55307 114 This function allows the read of 512 bytes blocks.
AnnaBridge 167:e84263d55307 115 You can choose either one block read operation or multiple block read operation
AnnaBridge 167:e84263d55307 116 by adjusting the "NumberOfBlocks" parameter.
AnnaBridge 167:e84263d55307 117 After this, you have to ensure that the transfer is done correctly. The check is done
AnnaBridge 167:e84263d55307 118 through HAL_MMC_GetCardState() function for MMC card state.
AnnaBridge 167:e84263d55307 119 You could also check the DMA transfer process through the MMC Rx interrupt event.
AnnaBridge 167:e84263d55307 120
AnnaBridge 167:e84263d55307 121 (+) You can read from MMC card in Interrupt mode by using function HAL_MMC_ReadBlocks_IT().
AnnaBridge 167:e84263d55307 122 This function allows the read of 512 bytes blocks.
AnnaBridge 167:e84263d55307 123 You can choose either one block read operation or multiple block read operation
AnnaBridge 167:e84263d55307 124 by adjusting the "NumberOfBlocks" parameter.
AnnaBridge 167:e84263d55307 125 After this, you have to ensure that the transfer is done correctly. The check is done
AnnaBridge 167:e84263d55307 126 through HAL_MMC_GetCardState() function for MMC card state.
AnnaBridge 167:e84263d55307 127 You could also check the IT transfer process through the MMC Rx interrupt event.
AnnaBridge 167:e84263d55307 128
AnnaBridge 167:e84263d55307 129 *** MMC Card Write operation ***
AnnaBridge 167:e84263d55307 130 ===============================
AnnaBridge 167:e84263d55307 131 [..]
AnnaBridge 167:e84263d55307 132 (+) You can write to MMC card in polling mode by using function HAL_MMC_WriteBlocks().
AnnaBridge 167:e84263d55307 133 This function allows the read of 512 bytes blocks.
AnnaBridge 167:e84263d55307 134 You can choose either one block read operation or multiple block read operation
AnnaBridge 167:e84263d55307 135 by adjusting the "NumberOfBlocks" parameter.
AnnaBridge 167:e84263d55307 136 After this, you have to ensure that the transfer is done correctly. The check is done
AnnaBridge 167:e84263d55307 137 through HAL_MMC_GetCardState() function for MMC card state.
AnnaBridge 167:e84263d55307 138
AnnaBridge 167:e84263d55307 139 (+) You can write to MMC card in DMA mode by using function HAL_MMC_WriteBlocks_DMA().
AnnaBridge 167:e84263d55307 140 This function allows the read of 512 bytes blocks.
AnnaBridge 167:e84263d55307 141 You can choose either one block read operation or multiple block read operation
AnnaBridge 167:e84263d55307 142 by adjusting the "NumberOfBlocks" parameter.
AnnaBridge 167:e84263d55307 143 After this, you have to ensure that the transfer is done correctly. The check is done
AnnaBridge 167:e84263d55307 144 through HAL_MMC_GetCardState() function for MMC card state.
AnnaBridge 167:e84263d55307 145 You could also check the DMA transfer process through the MMC Tx interrupt event.
AnnaBridge 167:e84263d55307 146
AnnaBridge 167:e84263d55307 147 (+) You can write to MMC card in Interrupt mode by using function HAL_MMC_WriteBlocks_IT().
AnnaBridge 167:e84263d55307 148 This function allows the read of 512 bytes blocks.
AnnaBridge 167:e84263d55307 149 You can choose either one block read operation or multiple block read operation
AnnaBridge 167:e84263d55307 150 by adjusting the "NumberOfBlocks" parameter.
AnnaBridge 167:e84263d55307 151 After this, you have to ensure that the transfer is done correctly. The check is done
AnnaBridge 167:e84263d55307 152 through HAL_MMC_GetCardState() function for MMC card state.
AnnaBridge 167:e84263d55307 153 You could also check the IT transfer process through the MMC Tx interrupt event.
AnnaBridge 167:e84263d55307 154
AnnaBridge 167:e84263d55307 155 *** MMC card status ***
AnnaBridge 167:e84263d55307 156 ======================
AnnaBridge 167:e84263d55307 157 [..]
AnnaBridge 167:e84263d55307 158 (+) The MMC Status contains status bits that are related to the MMC Memory
AnnaBridge 167:e84263d55307 159 Card proprietary features. To get MMC card status use the HAL_MMC_GetCardStatus().
AnnaBridge 167:e84263d55307 160
AnnaBridge 167:e84263d55307 161 *** MMC card information ***
AnnaBridge 167:e84263d55307 162 ===========================
AnnaBridge 167:e84263d55307 163 [..]
AnnaBridge 167:e84263d55307 164 (+) To get MMC card information, you can use the function HAL_MMC_GetCardInfo().
AnnaBridge 167:e84263d55307 165 It returns useful information about the MMC card such as block size, card type,
AnnaBridge 167:e84263d55307 166 block number ...
AnnaBridge 167:e84263d55307 167
AnnaBridge 167:e84263d55307 168 *** MMC card CSD register ***
AnnaBridge 167:e84263d55307 169 ============================
AnnaBridge 167:e84263d55307 170 [..]
AnnaBridge 167:e84263d55307 171 (+) The HAL_MMC_GetCardCSD() API allows to get the parameters of the CSD register.
AnnaBridge 167:e84263d55307 172 Some of the CSD parameters are useful for card initialization and identification.
AnnaBridge 167:e84263d55307 173
AnnaBridge 167:e84263d55307 174 *** MMC card CID register ***
AnnaBridge 167:e84263d55307 175 ============================
AnnaBridge 167:e84263d55307 176 [..]
AnnaBridge 167:e84263d55307 177 (+) The HAL_MMC_GetCardCID() API allows to get the parameters of the CID register.
AnnaBridge 167:e84263d55307 178 Some of the CID parameters are useful for card initialization and identification.
AnnaBridge 167:e84263d55307 179
AnnaBridge 167:e84263d55307 180 *** MMC HAL driver macros list ***
AnnaBridge 167:e84263d55307 181 ==================================
AnnaBridge 167:e84263d55307 182 [..]
AnnaBridge 167:e84263d55307 183 Below the list of most used macros in MMC HAL driver.
AnnaBridge 167:e84263d55307 184
AnnaBridge 167:e84263d55307 185 (+) __HAL_MMC_ENABLE : Enable the MMC device
AnnaBridge 167:e84263d55307 186 (+) __HAL_MMC_DISABLE : Disable the MMC device
AnnaBridge 167:e84263d55307 187 (+) __HAL_MMC_DMA_ENABLE: Enable the SDMMC DMA transfer
AnnaBridge 167:e84263d55307 188 (+) __HAL_MMC_DMA_DISABLE: Disable the SDMMC DMA transfer
AnnaBridge 167:e84263d55307 189 (+) __HAL_MMC_ENABLE_IT: Enable the MMC device interrupt
AnnaBridge 167:e84263d55307 190 (+) __HAL_MMC_DISABLE_IT: Disable the MMC device interrupt
AnnaBridge 167:e84263d55307 191 (+) __HAL_MMC_GET_FLAG:Check whether the specified MMC flag is set or not
AnnaBridge 167:e84263d55307 192 (+) __HAL_MMC_CLEAR_FLAG: Clear the MMC's pending flags
AnnaBridge 167:e84263d55307 193
AnnaBridge 167:e84263d55307 194 [..]
AnnaBridge 167:e84263d55307 195 (@) You can refer to the MMC HAL driver header file for more useful macros
AnnaBridge 167:e84263d55307 196
AnnaBridge 167:e84263d55307 197 @endverbatim
AnnaBridge 167:e84263d55307 198 ******************************************************************************
AnnaBridge 167:e84263d55307 199 * @attention
AnnaBridge 167:e84263d55307 200 *
AnnaBridge 167:e84263d55307 201 * <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
AnnaBridge 167:e84263d55307 202 *
AnnaBridge 167:e84263d55307 203 * Redistribution and use in source and binary forms, with or without modification,
AnnaBridge 167:e84263d55307 204 * are permitted provided that the following conditions are met:
AnnaBridge 167:e84263d55307 205 * 1. Redistributions of source code must retain the above copyright notice,
AnnaBridge 167:e84263d55307 206 * this list of conditions and the following disclaimer.
AnnaBridge 167:e84263d55307 207 * 2. Redistributions in binary form must reproduce the above copyright notice,
AnnaBridge 167:e84263d55307 208 * this list of conditions and the following disclaimer in the documentation
AnnaBridge 167:e84263d55307 209 * and/or other materials provided with the distribution.
AnnaBridge 167:e84263d55307 210 * 3. Neither the name of STMicroelectronics nor the names of its contributors
AnnaBridge 167:e84263d55307 211 * may be used to endorse or promote products derived from this software
AnnaBridge 167:e84263d55307 212 * without specific prior written permission.
AnnaBridge 167:e84263d55307 213 *
AnnaBridge 167:e84263d55307 214 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AnnaBridge 167:e84263d55307 215 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
AnnaBridge 167:e84263d55307 216 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
AnnaBridge 167:e84263d55307 217 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
AnnaBridge 167:e84263d55307 218 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
AnnaBridge 167:e84263d55307 219 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
AnnaBridge 167:e84263d55307 220 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
AnnaBridge 167:e84263d55307 221 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
AnnaBridge 167:e84263d55307 222 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
AnnaBridge 167:e84263d55307 223 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
AnnaBridge 167:e84263d55307 224 *
AnnaBridge 167:e84263d55307 225 ******************************************************************************
AnnaBridge 167:e84263d55307 226 */
AnnaBridge 167:e84263d55307 227
AnnaBridge 167:e84263d55307 228 /* Includes ------------------------------------------------------------------*/
AnnaBridge 167:e84263d55307 229 #include "stm32f2xx_hal.h"
AnnaBridge 167:e84263d55307 230
AnnaBridge 167:e84263d55307 231 /** @addtogroup STM32F2xx_HAL_Driver
AnnaBridge 167:e84263d55307 232 * @{
AnnaBridge 167:e84263d55307 233 */
AnnaBridge 167:e84263d55307 234
AnnaBridge 167:e84263d55307 235 /** @addtogroup MMC
AnnaBridge 167:e84263d55307 236 * @{
AnnaBridge 167:e84263d55307 237 */
AnnaBridge 167:e84263d55307 238
AnnaBridge 167:e84263d55307 239 #ifdef HAL_MMC_MODULE_ENABLED
AnnaBridge 167:e84263d55307 240 /* Private typedef -----------------------------------------------------------*/
AnnaBridge 167:e84263d55307 241 /* Private define ------------------------------------------------------------*/
AnnaBridge 167:e84263d55307 242 /** @addtogroup MMC_Private_Defines
AnnaBridge 167:e84263d55307 243 * @{
AnnaBridge 167:e84263d55307 244 */
AnnaBridge 167:e84263d55307 245
AnnaBridge 167:e84263d55307 246 /**
AnnaBridge 167:e84263d55307 247 * @}
AnnaBridge 167:e84263d55307 248 */
AnnaBridge 167:e84263d55307 249
AnnaBridge 167:e84263d55307 250 /* Private macro -------------------------------------------------------------*/
AnnaBridge 167:e84263d55307 251 /* Private variables ---------------------------------------------------------*/
AnnaBridge 167:e84263d55307 252 /* Private function prototypes -----------------------------------------------*/
AnnaBridge 167:e84263d55307 253 /* Private functions ---------------------------------------------------------*/
AnnaBridge 167:e84263d55307 254 /** @defgroup MMC_Private_Functions MMC Private Functions
AnnaBridge 167:e84263d55307 255 * @{
AnnaBridge 167:e84263d55307 256 */
AnnaBridge 167:e84263d55307 257 static uint32_t MMC_InitCard(MMC_HandleTypeDef *hmmc);
AnnaBridge 167:e84263d55307 258 static uint32_t MMC_PowerON(MMC_HandleTypeDef *hmmc);
AnnaBridge 167:e84263d55307 259 static uint32_t MMC_SendStatus(MMC_HandleTypeDef *hmmc, uint32_t *pCardStatus);
AnnaBridge 167:e84263d55307 260 static HAL_StatusTypeDef MMC_PowerOFF(MMC_HandleTypeDef *hmmc);
AnnaBridge 167:e84263d55307 261 static HAL_StatusTypeDef MMC_Write_IT(MMC_HandleTypeDef *hmmc);
AnnaBridge 167:e84263d55307 262 static HAL_StatusTypeDef MMC_Read_IT(MMC_HandleTypeDef *hmmc);
AnnaBridge 167:e84263d55307 263 static void MMC_DMATransmitCplt(DMA_HandleTypeDef *hdma);
AnnaBridge 167:e84263d55307 264 static void MMC_DMAReceiveCplt(DMA_HandleTypeDef *hdma);
AnnaBridge 167:e84263d55307 265 static void MMC_DMAError(DMA_HandleTypeDef *hdma);
AnnaBridge 167:e84263d55307 266 static void MMC_DMATxAbort(DMA_HandleTypeDef *hdma);
AnnaBridge 167:e84263d55307 267 static void MMC_DMARxAbort(DMA_HandleTypeDef *hdma);
AnnaBridge 167:e84263d55307 268 /**
AnnaBridge 167:e84263d55307 269 * @}
AnnaBridge 167:e84263d55307 270 */
AnnaBridge 167:e84263d55307 271
AnnaBridge 167:e84263d55307 272 /* Exported functions --------------------------------------------------------*/
AnnaBridge 167:e84263d55307 273 /** @addtogroup MMC_Exported_Functions
AnnaBridge 167:e84263d55307 274 * @{
AnnaBridge 167:e84263d55307 275 */
AnnaBridge 167:e84263d55307 276
AnnaBridge 167:e84263d55307 277 /** @addtogroup MMC_Exported_Functions_Group1
AnnaBridge 167:e84263d55307 278 * @brief Initialization and de-initialization functions
AnnaBridge 167:e84263d55307 279 *
AnnaBridge 167:e84263d55307 280 @verbatim
AnnaBridge 167:e84263d55307 281 ==============================================================================
AnnaBridge 167:e84263d55307 282 ##### Initialization and de-initialization functions #####
AnnaBridge 167:e84263d55307 283 ==============================================================================
AnnaBridge 167:e84263d55307 284 [..]
AnnaBridge 167:e84263d55307 285 This section provides functions allowing to initialize/de-initialize the MMC
AnnaBridge 167:e84263d55307 286 card device to be ready for use.
AnnaBridge 167:e84263d55307 287
AnnaBridge 167:e84263d55307 288 @endverbatim
AnnaBridge 167:e84263d55307 289 * @{
AnnaBridge 167:e84263d55307 290 */
AnnaBridge 167:e84263d55307 291
AnnaBridge 167:e84263d55307 292 /**
AnnaBridge 167:e84263d55307 293 * @brief Initializes the MMC according to the specified parameters in the
AnnaBridge 167:e84263d55307 294 MMC_HandleTypeDef and create the associated handle.
AnnaBridge 167:e84263d55307 295 * @param hmmc: Pointer to the MMC handle
AnnaBridge 167:e84263d55307 296 * @retval HAL status
AnnaBridge 167:e84263d55307 297 */
AnnaBridge 167:e84263d55307 298 HAL_StatusTypeDef HAL_MMC_Init(MMC_HandleTypeDef *hmmc)
AnnaBridge 167:e84263d55307 299 {
AnnaBridge 167:e84263d55307 300 /* Check the MMC handle allocation */
AnnaBridge 167:e84263d55307 301 if(hmmc == NULL)
AnnaBridge 167:e84263d55307 302 {
AnnaBridge 167:e84263d55307 303 return HAL_ERROR;
AnnaBridge 167:e84263d55307 304 }
AnnaBridge 167:e84263d55307 305
AnnaBridge 167:e84263d55307 306 /* Check the parameters */
AnnaBridge 167:e84263d55307 307 assert_param(IS_SDIO_ALL_INSTANCE(hmmc->Instance));
AnnaBridge 167:e84263d55307 308 assert_param(IS_SDIO_CLOCK_EDGE(hmmc->Init.ClockEdge));
AnnaBridge 167:e84263d55307 309 assert_param(IS_SDIO_CLOCK_BYPASS(hmmc->Init.ClockBypass));
AnnaBridge 167:e84263d55307 310 assert_param(IS_SDIO_CLOCK_POWER_SAVE(hmmc->Init.ClockPowerSave));
AnnaBridge 167:e84263d55307 311 assert_param(IS_SDIO_BUS_WIDE(hmmc->Init.BusWide));
AnnaBridge 167:e84263d55307 312 assert_param(IS_SDIO_HARDWARE_FLOW_CONTROL(hmmc->Init.HardwareFlowControl));
AnnaBridge 167:e84263d55307 313 assert_param(IS_SDIO_CLKDIV(hmmc->Init.ClockDiv));
AnnaBridge 167:e84263d55307 314
AnnaBridge 167:e84263d55307 315 if(hmmc->State == HAL_MMC_STATE_RESET)
AnnaBridge 167:e84263d55307 316 {
AnnaBridge 167:e84263d55307 317 /* Allocate lock resource and initialize it */
AnnaBridge 167:e84263d55307 318 hmmc->Lock = HAL_UNLOCKED;
AnnaBridge 167:e84263d55307 319 /* Init the low level hardware : GPIO, CLOCK, CORTEX...etc */
AnnaBridge 167:e84263d55307 320 HAL_MMC_MspInit(hmmc);
AnnaBridge 167:e84263d55307 321 }
AnnaBridge 167:e84263d55307 322
AnnaBridge 167:e84263d55307 323 hmmc->State = HAL_MMC_STATE_BUSY;
AnnaBridge 167:e84263d55307 324
AnnaBridge 167:e84263d55307 325 /* Initialize the Card parameters */
AnnaBridge 167:e84263d55307 326 HAL_MMC_InitCard(hmmc);
AnnaBridge 167:e84263d55307 327
AnnaBridge 167:e84263d55307 328 /* Initialize the error code */
AnnaBridge 167:e84263d55307 329 hmmc->ErrorCode = HAL_DMA_ERROR_NONE;
AnnaBridge 167:e84263d55307 330
AnnaBridge 167:e84263d55307 331 /* Initialize the MMC operation */
AnnaBridge 167:e84263d55307 332 hmmc->Context = MMC_CONTEXT_NONE;
AnnaBridge 167:e84263d55307 333
AnnaBridge 167:e84263d55307 334 /* Initialize the MMC state */
AnnaBridge 167:e84263d55307 335 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 336
AnnaBridge 167:e84263d55307 337 return HAL_OK;
AnnaBridge 167:e84263d55307 338 }
AnnaBridge 167:e84263d55307 339
AnnaBridge 167:e84263d55307 340 /**
AnnaBridge 167:e84263d55307 341 * @brief Initializes the MMC Card.
AnnaBridge 167:e84263d55307 342 * @param hmmc: Pointer to MMC handle
AnnaBridge 167:e84263d55307 343 * @note This function initializes the MMC card. It could be used when a card
AnnaBridge 167:e84263d55307 344 re-initialization is needed.
AnnaBridge 167:e84263d55307 345 * @retval HAL status
AnnaBridge 167:e84263d55307 346 */
AnnaBridge 167:e84263d55307 347 HAL_StatusTypeDef HAL_MMC_InitCard(MMC_HandleTypeDef *hmmc)
AnnaBridge 167:e84263d55307 348 {
AnnaBridge 167:e84263d55307 349 uint32_t errorstate = HAL_MMC_ERROR_NONE;
AnnaBridge 167:e84263d55307 350 MMC_InitTypeDef Init;
AnnaBridge 167:e84263d55307 351
AnnaBridge 167:e84263d55307 352 /* Default SDMMC peripheral configuration for MMC card initialization */
AnnaBridge 167:e84263d55307 353 Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;
AnnaBridge 167:e84263d55307 354 Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;
AnnaBridge 167:e84263d55307 355 Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;
AnnaBridge 167:e84263d55307 356 Init.BusWide = SDIO_BUS_WIDE_1B;
AnnaBridge 167:e84263d55307 357 Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
AnnaBridge 167:e84263d55307 358 Init.ClockDiv = SDIO_INIT_CLK_DIV;
AnnaBridge 167:e84263d55307 359
AnnaBridge 167:e84263d55307 360 /* Initialize SDMMC peripheral interface with default configuration */
AnnaBridge 167:e84263d55307 361 SDIO_Init(hmmc->Instance, Init);
AnnaBridge 167:e84263d55307 362
AnnaBridge 167:e84263d55307 363 /* Disable SDMMC Clock */
AnnaBridge 167:e84263d55307 364 __HAL_MMC_DISABLE(hmmc);
AnnaBridge 167:e84263d55307 365
AnnaBridge 167:e84263d55307 366 /* Set Power State to ON */
AnnaBridge 167:e84263d55307 367 SDIO_PowerState_ON(hmmc->Instance);
AnnaBridge 167:e84263d55307 368
AnnaBridge 167:e84263d55307 369 /* Enable SDMMC Clock */
AnnaBridge 167:e84263d55307 370 __HAL_MMC_ENABLE(hmmc);
AnnaBridge 167:e84263d55307 371
AnnaBridge 167:e84263d55307 372 /* Required power up waiting time before starting the SD initialization
AnnaBridge 167:e84263d55307 373 sequence */
AnnaBridge 167:e84263d55307 374 HAL_Delay(2U);
AnnaBridge 167:e84263d55307 375
AnnaBridge 167:e84263d55307 376 /* Identify card operating voltage */
AnnaBridge 167:e84263d55307 377 errorstate = MMC_PowerON(hmmc);
AnnaBridge 167:e84263d55307 378 if(errorstate != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 379 {
AnnaBridge 167:e84263d55307 380 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 381 hmmc->ErrorCode |= errorstate;
AnnaBridge 167:e84263d55307 382 return HAL_ERROR;
AnnaBridge 167:e84263d55307 383 }
AnnaBridge 167:e84263d55307 384
AnnaBridge 167:e84263d55307 385 /* Card initialization */
AnnaBridge 167:e84263d55307 386 errorstate = MMC_InitCard(hmmc);
AnnaBridge 167:e84263d55307 387 if(errorstate != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 388 {
AnnaBridge 167:e84263d55307 389 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 390 hmmc->ErrorCode |= errorstate;
AnnaBridge 167:e84263d55307 391 return HAL_ERROR;
AnnaBridge 167:e84263d55307 392 }
AnnaBridge 167:e84263d55307 393
AnnaBridge 167:e84263d55307 394 return HAL_OK;
AnnaBridge 167:e84263d55307 395 }
AnnaBridge 167:e84263d55307 396
AnnaBridge 167:e84263d55307 397 /**
AnnaBridge 167:e84263d55307 398 * @brief De-Initializes the MMC card.
AnnaBridge 167:e84263d55307 399 * @param hmmc: Pointer to MMC handle
AnnaBridge 167:e84263d55307 400 * @retval HAL status
AnnaBridge 167:e84263d55307 401 */
AnnaBridge 167:e84263d55307 402 HAL_StatusTypeDef HAL_MMC_DeInit(MMC_HandleTypeDef *hmmc)
AnnaBridge 167:e84263d55307 403 {
AnnaBridge 167:e84263d55307 404 /* Check the MMC handle allocation */
AnnaBridge 167:e84263d55307 405 if(hmmc == NULL)
AnnaBridge 167:e84263d55307 406 {
AnnaBridge 167:e84263d55307 407 return HAL_ERROR;
AnnaBridge 167:e84263d55307 408 }
AnnaBridge 167:e84263d55307 409
AnnaBridge 167:e84263d55307 410 /* Check the parameters */
AnnaBridge 167:e84263d55307 411 assert_param(IS_SDIO_ALL_INSTANCE(hmmc->Instance));
AnnaBridge 167:e84263d55307 412
AnnaBridge 167:e84263d55307 413 hmmc->State = HAL_MMC_STATE_BUSY;
AnnaBridge 167:e84263d55307 414
AnnaBridge 167:e84263d55307 415 /* Set SD power state to off */
AnnaBridge 167:e84263d55307 416 MMC_PowerOFF(hmmc);
AnnaBridge 167:e84263d55307 417
AnnaBridge 167:e84263d55307 418 /* De-Initialize the MSP layer */
AnnaBridge 167:e84263d55307 419 HAL_MMC_MspDeInit(hmmc);
AnnaBridge 167:e84263d55307 420
AnnaBridge 167:e84263d55307 421 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
AnnaBridge 167:e84263d55307 422 hmmc->State = HAL_MMC_STATE_RESET;
AnnaBridge 167:e84263d55307 423
AnnaBridge 167:e84263d55307 424 return HAL_OK;
AnnaBridge 167:e84263d55307 425 }
AnnaBridge 167:e84263d55307 426
AnnaBridge 167:e84263d55307 427
AnnaBridge 167:e84263d55307 428 /**
AnnaBridge 167:e84263d55307 429 * @brief Initializes the MMC MSP.
AnnaBridge 167:e84263d55307 430 * @param hmmc: Pointer to MMC handle
AnnaBridge 167:e84263d55307 431 * @retval None
AnnaBridge 167:e84263d55307 432 */
AnnaBridge 167:e84263d55307 433 __weak void HAL_MMC_MspInit(MMC_HandleTypeDef *hmmc)
AnnaBridge 167:e84263d55307 434 {
AnnaBridge 167:e84263d55307 435 /* Prevent unused argument(s) compilation warning */
AnnaBridge 167:e84263d55307 436 UNUSED(hmmc);
AnnaBridge 167:e84263d55307 437
AnnaBridge 167:e84263d55307 438 /* NOTE : This function Should not be modified, when the callback is needed,
AnnaBridge 167:e84263d55307 439 the HAL_MMC_MspInit could be implemented in the user file
AnnaBridge 167:e84263d55307 440 */
AnnaBridge 167:e84263d55307 441 }
AnnaBridge 167:e84263d55307 442
AnnaBridge 167:e84263d55307 443 /**
AnnaBridge 167:e84263d55307 444 * @brief De-Initialize MMC MSP.
AnnaBridge 167:e84263d55307 445 * @param hmmc: Pointer to MMC handle
AnnaBridge 167:e84263d55307 446 * @retval None
AnnaBridge 167:e84263d55307 447 */
AnnaBridge 167:e84263d55307 448 __weak void HAL_MMC_MspDeInit(MMC_HandleTypeDef *hmmc)
AnnaBridge 167:e84263d55307 449 {
AnnaBridge 167:e84263d55307 450 /* Prevent unused argument(s) compilation warning */
AnnaBridge 167:e84263d55307 451 UNUSED(hmmc);
AnnaBridge 167:e84263d55307 452
AnnaBridge 167:e84263d55307 453 /* NOTE : This function Should not be modified, when the callback is needed,
AnnaBridge 167:e84263d55307 454 the HAL_MMC_MspDeInit could be implemented in the user file
AnnaBridge 167:e84263d55307 455 */
AnnaBridge 167:e84263d55307 456 }
AnnaBridge 167:e84263d55307 457
AnnaBridge 167:e84263d55307 458 /**
AnnaBridge 167:e84263d55307 459 * @}
AnnaBridge 167:e84263d55307 460 */
AnnaBridge 167:e84263d55307 461
AnnaBridge 167:e84263d55307 462 /** @addtogroup MMC_Exported_Functions_Group2
AnnaBridge 167:e84263d55307 463 * @brief Data transfer functions
AnnaBridge 167:e84263d55307 464 *
AnnaBridge 167:e84263d55307 465 @verbatim
AnnaBridge 167:e84263d55307 466 ==============================================================================
AnnaBridge 167:e84263d55307 467 ##### IO operation functions #####
AnnaBridge 167:e84263d55307 468 ==============================================================================
AnnaBridge 167:e84263d55307 469 [..]
AnnaBridge 167:e84263d55307 470 This subsection provides a set of functions allowing to manage the data
AnnaBridge 167:e84263d55307 471 transfer from/to MMC card.
AnnaBridge 167:e84263d55307 472
AnnaBridge 167:e84263d55307 473 @endverbatim
AnnaBridge 167:e84263d55307 474 * @{
AnnaBridge 167:e84263d55307 475 */
AnnaBridge 167:e84263d55307 476
AnnaBridge 167:e84263d55307 477 /**
AnnaBridge 167:e84263d55307 478 * @brief Reads block(s) from a specified address in a card. The Data transfer
AnnaBridge 167:e84263d55307 479 * is managed by polling mode.
AnnaBridge 167:e84263d55307 480 * @note This API should be followed by a check on the card state through
AnnaBridge 167:e84263d55307 481 * HAL_MMC_GetCardState().
AnnaBridge 167:e84263d55307 482 * @param hmmc: Pointer to MMC handle
AnnaBridge 167:e84263d55307 483 * @param pData: pointer to the buffer that will contain the received data
AnnaBridge 167:e84263d55307 484 * @param BlockAdd: Block Address from where data is to be read
AnnaBridge 167:e84263d55307 485 * @param NumberOfBlocks: Number of MMC blocks to read
AnnaBridge 167:e84263d55307 486 * @param Timeout: Specify timeout value
AnnaBridge 167:e84263d55307 487 * @retval HAL status
AnnaBridge 167:e84263d55307 488 */
AnnaBridge 167:e84263d55307 489 HAL_StatusTypeDef HAL_MMC_ReadBlocks(MMC_HandleTypeDef *hmmc, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks, uint32_t Timeout)
AnnaBridge 167:e84263d55307 490 {
AnnaBridge 167:e84263d55307 491 SDIO_DataInitTypeDef config;
AnnaBridge 167:e84263d55307 492 uint32_t errorstate = HAL_MMC_ERROR_NONE;
AnnaBridge 167:e84263d55307 493 uint32_t tickstart = HAL_GetTick();
AnnaBridge 167:e84263d55307 494 uint32_t count = 0U, *tempbuff = (uint32_t *)pData;
AnnaBridge 167:e84263d55307 495
AnnaBridge 167:e84263d55307 496 if(NULL == pData)
AnnaBridge 167:e84263d55307 497 {
AnnaBridge 167:e84263d55307 498 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
AnnaBridge 167:e84263d55307 499 return HAL_ERROR;
AnnaBridge 167:e84263d55307 500 }
AnnaBridge 167:e84263d55307 501
AnnaBridge 167:e84263d55307 502 if(hmmc->State == HAL_MMC_STATE_READY)
AnnaBridge 167:e84263d55307 503 {
AnnaBridge 167:e84263d55307 504 hmmc->ErrorCode = HAL_DMA_ERROR_NONE;
AnnaBridge 167:e84263d55307 505
AnnaBridge 167:e84263d55307 506 if((BlockAdd + NumberOfBlocks) > (hmmc->MmcCard.LogBlockNbr))
AnnaBridge 167:e84263d55307 507 {
AnnaBridge 167:e84263d55307 508 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE;
AnnaBridge 167:e84263d55307 509 return HAL_ERROR;
AnnaBridge 167:e84263d55307 510 }
AnnaBridge 167:e84263d55307 511
AnnaBridge 167:e84263d55307 512 hmmc->State = HAL_MMC_STATE_BUSY;
AnnaBridge 167:e84263d55307 513
AnnaBridge 167:e84263d55307 514 /* Initialize data control register */
AnnaBridge 167:e84263d55307 515 hmmc->Instance->DCTRL = 0U;
AnnaBridge 167:e84263d55307 516
AnnaBridge 167:e84263d55307 517 /* Check the Card capacity in term of Logical number of blocks */
AnnaBridge 167:e84263d55307 518 if ((hmmc->MmcCard.LogBlockNbr) < CAPACITY)
AnnaBridge 167:e84263d55307 519 {
AnnaBridge 167:e84263d55307 520 BlockAdd *= 512U;
AnnaBridge 167:e84263d55307 521 }
AnnaBridge 167:e84263d55307 522
AnnaBridge 167:e84263d55307 523 /* Set Block Size for Card */
AnnaBridge 167:e84263d55307 524 errorstate = SDMMC_CmdBlockLength(hmmc->Instance, BLOCKSIZE);
AnnaBridge 167:e84263d55307 525 if(errorstate != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 526 {
AnnaBridge 167:e84263d55307 527 /* Clear all the static flags */
AnnaBridge 167:e84263d55307 528 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 529 hmmc->ErrorCode |= errorstate;
AnnaBridge 167:e84263d55307 530 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 531 return HAL_ERROR;
AnnaBridge 167:e84263d55307 532 }
AnnaBridge 167:e84263d55307 533
AnnaBridge 167:e84263d55307 534 /* Configure the MMC DPSM (Data Path State Machine) */
AnnaBridge 167:e84263d55307 535 config.DataTimeOut = SDMMC_DATATIMEOUT;
AnnaBridge 167:e84263d55307 536 config.DataLength = NumberOfBlocks * BLOCKSIZE;
AnnaBridge 167:e84263d55307 537 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
AnnaBridge 167:e84263d55307 538 config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO;
AnnaBridge 167:e84263d55307 539 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
AnnaBridge 167:e84263d55307 540 config.DPSM = SDIO_DPSM_ENABLE;
AnnaBridge 167:e84263d55307 541 SDIO_ConfigData(hmmc->Instance, &config);
AnnaBridge 167:e84263d55307 542
AnnaBridge 167:e84263d55307 543 /* Read block(s) in polling mode */
AnnaBridge 167:e84263d55307 544 if(NumberOfBlocks > 1U)
AnnaBridge 167:e84263d55307 545 {
AnnaBridge 167:e84263d55307 546 hmmc->Context = MMC_CONTEXT_READ_MULTIPLE_BLOCK;
AnnaBridge 167:e84263d55307 547
AnnaBridge 167:e84263d55307 548 /* Read Multi Block command */
AnnaBridge 167:e84263d55307 549 errorstate = SDMMC_CmdReadMultiBlock(hmmc->Instance, BlockAdd);
AnnaBridge 167:e84263d55307 550 }
AnnaBridge 167:e84263d55307 551 else
AnnaBridge 167:e84263d55307 552 {
AnnaBridge 167:e84263d55307 553 hmmc->Context = MMC_CONTEXT_READ_SINGLE_BLOCK;
AnnaBridge 167:e84263d55307 554
AnnaBridge 167:e84263d55307 555 /* Read Single Block command */
AnnaBridge 167:e84263d55307 556 errorstate = SDMMC_CmdReadSingleBlock(hmmc->Instance, BlockAdd);
AnnaBridge 167:e84263d55307 557 }
AnnaBridge 167:e84263d55307 558 if(errorstate != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 559 {
AnnaBridge 167:e84263d55307 560 /* Clear all the static flags */
AnnaBridge 167:e84263d55307 561 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 562 hmmc->ErrorCode |= errorstate;
AnnaBridge 167:e84263d55307 563 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 564 return HAL_ERROR;
AnnaBridge 167:e84263d55307 565 }
AnnaBridge 167:e84263d55307 566
AnnaBridge 167:e84263d55307 567 /* Poll on SDMMC flags */
AnnaBridge 167:e84263d55307 568 #ifdef SDIO_STA_STBITERR
AnnaBridge 167:e84263d55307 569 while(!__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND | SDIO_STA_STBITERR))
AnnaBridge 167:e84263d55307 570 #else /* SDIO_STA_STBITERR not defined */
AnnaBridge 167:e84263d55307 571 while(!__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND))
AnnaBridge 167:e84263d55307 572 #endif /* SDIO_STA_STBITERR */
AnnaBridge 167:e84263d55307 573 {
AnnaBridge 167:e84263d55307 574 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXFIFOHF))
AnnaBridge 167:e84263d55307 575 {
AnnaBridge 167:e84263d55307 576 /* Read data from SDMMC Rx FIFO */
AnnaBridge 167:e84263d55307 577 for(count = 0U; count < 8U; count++)
AnnaBridge 167:e84263d55307 578 {
AnnaBridge 167:e84263d55307 579 *(tempbuff + count) = SDIO_ReadFIFO(hmmc->Instance);
AnnaBridge 167:e84263d55307 580 }
AnnaBridge 167:e84263d55307 581 tempbuff += 8U;
AnnaBridge 167:e84263d55307 582 }
AnnaBridge 167:e84263d55307 583
AnnaBridge 167:e84263d55307 584 if((Timeout == 0U)||((HAL_GetTick()-tickstart) >= Timeout))
AnnaBridge 167:e84263d55307 585 {
AnnaBridge 167:e84263d55307 586 /* Clear all the static flags */
AnnaBridge 167:e84263d55307 587 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 588 hmmc->ErrorCode |= HAL_MMC_ERROR_TIMEOUT;
AnnaBridge 167:e84263d55307 589 hmmc->State= HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 590 return HAL_TIMEOUT;
AnnaBridge 167:e84263d55307 591 }
AnnaBridge 167:e84263d55307 592 }
AnnaBridge 167:e84263d55307 593
AnnaBridge 167:e84263d55307 594 /* Send stop transmission command in case of multiblock read */
AnnaBridge 167:e84263d55307 595 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DATAEND) && (NumberOfBlocks > 1U))
AnnaBridge 167:e84263d55307 596 {
AnnaBridge 167:e84263d55307 597 /* Send stop transmission command */
AnnaBridge 167:e84263d55307 598 errorstate = SDMMC_CmdStopTransfer(hmmc->Instance);
AnnaBridge 167:e84263d55307 599 if(errorstate != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 600 {
AnnaBridge 167:e84263d55307 601 /* Clear all the static flags */
AnnaBridge 167:e84263d55307 602 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 603 hmmc->ErrorCode |= errorstate;
AnnaBridge 167:e84263d55307 604 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 605 return HAL_ERROR;
AnnaBridge 167:e84263d55307 606 }
AnnaBridge 167:e84263d55307 607 }
AnnaBridge 167:e84263d55307 608
AnnaBridge 167:e84263d55307 609 /* Get error state */
AnnaBridge 167:e84263d55307 610 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DTIMEOUT))
AnnaBridge 167:e84263d55307 611 {
AnnaBridge 167:e84263d55307 612 /* Clear all the static flags */
AnnaBridge 167:e84263d55307 613 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 614 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_TIMEOUT;
AnnaBridge 167:e84263d55307 615 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 616 return HAL_ERROR;
AnnaBridge 167:e84263d55307 617 }
AnnaBridge 167:e84263d55307 618 else if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DCRCFAIL))
AnnaBridge 167:e84263d55307 619 {
AnnaBridge 167:e84263d55307 620 /* Clear all the static flags */
AnnaBridge 167:e84263d55307 621 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 622 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_CRC_FAIL;
AnnaBridge 167:e84263d55307 623 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 624 return HAL_ERROR;
AnnaBridge 167:e84263d55307 625 }
AnnaBridge 167:e84263d55307 626 else if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXOVERR))
AnnaBridge 167:e84263d55307 627 {
AnnaBridge 167:e84263d55307 628 /* Clear all the static flags */
AnnaBridge 167:e84263d55307 629 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 630 hmmc->ErrorCode |= HAL_MMC_ERROR_RX_OVERRUN;
AnnaBridge 167:e84263d55307 631 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 632 return HAL_ERROR;
AnnaBridge 167:e84263d55307 633 }
AnnaBridge 167:e84263d55307 634
AnnaBridge 167:e84263d55307 635 /* Empty FIFO if there is still any data */
AnnaBridge 167:e84263d55307 636 while ((__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXDAVL)))
AnnaBridge 167:e84263d55307 637 {
AnnaBridge 167:e84263d55307 638 *tempbuff = SDIO_ReadFIFO(hmmc->Instance);
AnnaBridge 167:e84263d55307 639 tempbuff++;
AnnaBridge 167:e84263d55307 640
AnnaBridge 167:e84263d55307 641 if((Timeout == 0U)||((HAL_GetTick()-tickstart) >= Timeout))
AnnaBridge 167:e84263d55307 642 {
AnnaBridge 167:e84263d55307 643 /* Clear all the static flags */
AnnaBridge 167:e84263d55307 644 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 645 hmmc->ErrorCode |= HAL_MMC_ERROR_TIMEOUT;
AnnaBridge 167:e84263d55307 646 hmmc->State= HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 647 return HAL_ERROR;
AnnaBridge 167:e84263d55307 648 }
AnnaBridge 167:e84263d55307 649 }
AnnaBridge 167:e84263d55307 650
AnnaBridge 167:e84263d55307 651 /* Clear all the static flags */
AnnaBridge 167:e84263d55307 652 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 653
AnnaBridge 167:e84263d55307 654 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 655
AnnaBridge 167:e84263d55307 656 return HAL_OK;
AnnaBridge 167:e84263d55307 657 }
AnnaBridge 167:e84263d55307 658 else
AnnaBridge 167:e84263d55307 659 {
AnnaBridge 167:e84263d55307 660 hmmc->ErrorCode |= HAL_MMC_ERROR_BUSY;
AnnaBridge 167:e84263d55307 661 return HAL_ERROR;
AnnaBridge 167:e84263d55307 662 }
AnnaBridge 167:e84263d55307 663 }
AnnaBridge 167:e84263d55307 664
AnnaBridge 167:e84263d55307 665 /**
AnnaBridge 167:e84263d55307 666 * @brief Allows to write block(s) to a specified address in a card. The Data
AnnaBridge 167:e84263d55307 667 * transfer is managed by polling mode.
AnnaBridge 167:e84263d55307 668 * @note This API should be followed by a check on the card state through
AnnaBridge 167:e84263d55307 669 * HAL_MMC_GetCardState().
AnnaBridge 167:e84263d55307 670 * @param hmmc: Pointer to MMC handle
AnnaBridge 167:e84263d55307 671 * @param pData: pointer to the buffer that will contain the data to transmit
AnnaBridge 167:e84263d55307 672 * @param BlockAdd: Block Address where data will be written
AnnaBridge 167:e84263d55307 673 * @param NumberOfBlocks: Number of MMC blocks to write
AnnaBridge 167:e84263d55307 674 * @param Timeout: Specify timeout value
AnnaBridge 167:e84263d55307 675 * @retval HAL status
AnnaBridge 167:e84263d55307 676 */
AnnaBridge 167:e84263d55307 677 HAL_StatusTypeDef HAL_MMC_WriteBlocks(MMC_HandleTypeDef *hmmc, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks, uint32_t Timeout)
AnnaBridge 167:e84263d55307 678 {
AnnaBridge 167:e84263d55307 679 SDIO_DataInitTypeDef config;
AnnaBridge 167:e84263d55307 680 uint32_t errorstate = HAL_MMC_ERROR_NONE;
AnnaBridge 167:e84263d55307 681 uint32_t tickstart = HAL_GetTick();
AnnaBridge 167:e84263d55307 682 uint32_t count = 0U;
AnnaBridge 167:e84263d55307 683 uint32_t *tempbuff = (uint32_t *)pData;
AnnaBridge 167:e84263d55307 684
AnnaBridge 167:e84263d55307 685 if(NULL == pData)
AnnaBridge 167:e84263d55307 686 {
AnnaBridge 167:e84263d55307 687 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
AnnaBridge 167:e84263d55307 688 return HAL_ERROR;
AnnaBridge 167:e84263d55307 689 }
AnnaBridge 167:e84263d55307 690
AnnaBridge 167:e84263d55307 691 if(hmmc->State == HAL_MMC_STATE_READY)
AnnaBridge 167:e84263d55307 692 {
AnnaBridge 167:e84263d55307 693 hmmc->ErrorCode = HAL_DMA_ERROR_NONE;
AnnaBridge 167:e84263d55307 694
AnnaBridge 167:e84263d55307 695 if((BlockAdd + NumberOfBlocks) > (hmmc->MmcCard.LogBlockNbr))
AnnaBridge 167:e84263d55307 696 {
AnnaBridge 167:e84263d55307 697 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE;
AnnaBridge 167:e84263d55307 698 return HAL_ERROR;
AnnaBridge 167:e84263d55307 699 }
AnnaBridge 167:e84263d55307 700
AnnaBridge 167:e84263d55307 701 hmmc->State = HAL_MMC_STATE_BUSY;
AnnaBridge 167:e84263d55307 702
AnnaBridge 167:e84263d55307 703 /* Initialize data control register */
AnnaBridge 167:e84263d55307 704 hmmc->Instance->DCTRL = 0U;
AnnaBridge 167:e84263d55307 705
AnnaBridge 167:e84263d55307 706 /* Check the Card capacity in term of Logical number of blocks */
AnnaBridge 167:e84263d55307 707 if ((hmmc->MmcCard.LogBlockNbr) < CAPACITY)
AnnaBridge 167:e84263d55307 708 {
AnnaBridge 167:e84263d55307 709 BlockAdd *= 512U;
AnnaBridge 167:e84263d55307 710 }
AnnaBridge 167:e84263d55307 711
AnnaBridge 167:e84263d55307 712 /* Set Block Size for Card */
AnnaBridge 167:e84263d55307 713 errorstate = SDMMC_CmdBlockLength(hmmc->Instance, BLOCKSIZE);
AnnaBridge 167:e84263d55307 714 if(errorstate != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 715 {
AnnaBridge 167:e84263d55307 716 /* Clear all the static flags */
AnnaBridge 167:e84263d55307 717 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 718 hmmc->ErrorCode |= errorstate;
AnnaBridge 167:e84263d55307 719 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 720 return HAL_ERROR;
AnnaBridge 167:e84263d55307 721 }
AnnaBridge 167:e84263d55307 722
AnnaBridge 167:e84263d55307 723 /* Write Blocks in Polling mode */
AnnaBridge 167:e84263d55307 724 if(NumberOfBlocks > 1U)
AnnaBridge 167:e84263d55307 725 {
AnnaBridge 167:e84263d55307 726 hmmc->Context = MMC_CONTEXT_WRITE_MULTIPLE_BLOCK;
AnnaBridge 167:e84263d55307 727
AnnaBridge 167:e84263d55307 728 /* Write Multi Block command */
AnnaBridge 167:e84263d55307 729 errorstate = SDMMC_CmdWriteMultiBlock(hmmc->Instance, BlockAdd);
AnnaBridge 167:e84263d55307 730 }
AnnaBridge 167:e84263d55307 731 else
AnnaBridge 167:e84263d55307 732 {
AnnaBridge 167:e84263d55307 733 hmmc->Context = MMC_CONTEXT_WRITE_SINGLE_BLOCK;
AnnaBridge 167:e84263d55307 734
AnnaBridge 167:e84263d55307 735 /* Write Single Block command */
AnnaBridge 167:e84263d55307 736 errorstate = SDMMC_CmdWriteSingleBlock(hmmc->Instance, BlockAdd);
AnnaBridge 167:e84263d55307 737 }
AnnaBridge 167:e84263d55307 738 if(errorstate != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 739 {
AnnaBridge 167:e84263d55307 740 /* Clear all the static flags */
AnnaBridge 167:e84263d55307 741 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 742 hmmc->ErrorCode |= errorstate;
AnnaBridge 167:e84263d55307 743 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 744 return HAL_ERROR;
AnnaBridge 167:e84263d55307 745 }
AnnaBridge 167:e84263d55307 746
AnnaBridge 167:e84263d55307 747 /* Configure the MMC DPSM (Data Path State Machine) */
AnnaBridge 167:e84263d55307 748 config.DataTimeOut = SDMMC_DATATIMEOUT;
AnnaBridge 167:e84263d55307 749 config.DataLength = NumberOfBlocks * BLOCKSIZE;
AnnaBridge 167:e84263d55307 750 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
AnnaBridge 167:e84263d55307 751 config.TransferDir = SDIO_TRANSFER_DIR_TO_CARD;
AnnaBridge 167:e84263d55307 752 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
AnnaBridge 167:e84263d55307 753 config.DPSM = SDIO_DPSM_ENABLE;
AnnaBridge 167:e84263d55307 754 SDIO_ConfigData(hmmc->Instance, &config);
AnnaBridge 167:e84263d55307 755
AnnaBridge 167:e84263d55307 756 /* Write block(s) in polling mode */
AnnaBridge 167:e84263d55307 757 #ifdef SDIO_STA_STBITERR
AnnaBridge 167:e84263d55307 758 while(!__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND | SDIO_FLAG_STBITERR))
AnnaBridge 167:e84263d55307 759 #else /* SDIO_STA_STBITERR not defined */
AnnaBridge 167:e84263d55307 760 while(!__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND))
AnnaBridge 167:e84263d55307 761 #endif /* SDIO_STA_STBITERR */
AnnaBridge 167:e84263d55307 762 {
AnnaBridge 167:e84263d55307 763 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_TXFIFOHE))
AnnaBridge 167:e84263d55307 764 {
AnnaBridge 167:e84263d55307 765 /* Write data to SDIO Tx FIFO */
AnnaBridge 167:e84263d55307 766 for(count = 0U; count < 8U; count++)
AnnaBridge 167:e84263d55307 767 {
AnnaBridge 167:e84263d55307 768 SDIO_WriteFIFO(hmmc->Instance, (tempbuff + count));
AnnaBridge 167:e84263d55307 769 }
AnnaBridge 167:e84263d55307 770 tempbuff += 8U;
AnnaBridge 167:e84263d55307 771 }
AnnaBridge 167:e84263d55307 772
AnnaBridge 167:e84263d55307 773 if((Timeout == 0U)||((HAL_GetTick()-tickstart) >= Timeout))
AnnaBridge 167:e84263d55307 774 {
AnnaBridge 167:e84263d55307 775 /* Clear all the static flags */
AnnaBridge 167:e84263d55307 776 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 777 hmmc->ErrorCode |= errorstate;
AnnaBridge 167:e84263d55307 778 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 779 return HAL_TIMEOUT;
AnnaBridge 167:e84263d55307 780 }
AnnaBridge 167:e84263d55307 781 }
AnnaBridge 167:e84263d55307 782
AnnaBridge 167:e84263d55307 783 /* Send stop transmission command in case of multiblock write */
AnnaBridge 167:e84263d55307 784 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DATAEND) && (NumberOfBlocks > 1U))
AnnaBridge 167:e84263d55307 785 {
AnnaBridge 167:e84263d55307 786 /* Send stop transmission command */
AnnaBridge 167:e84263d55307 787 errorstate = SDMMC_CmdStopTransfer(hmmc->Instance);
AnnaBridge 167:e84263d55307 788 if(errorstate != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 789 {
AnnaBridge 167:e84263d55307 790 /* Clear all the static flags */
AnnaBridge 167:e84263d55307 791 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 792 hmmc->ErrorCode |= errorstate;
AnnaBridge 167:e84263d55307 793 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 794 return HAL_ERROR;
AnnaBridge 167:e84263d55307 795 }
AnnaBridge 167:e84263d55307 796 }
AnnaBridge 167:e84263d55307 797
AnnaBridge 167:e84263d55307 798 /* Get error state */
AnnaBridge 167:e84263d55307 799 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DTIMEOUT))
AnnaBridge 167:e84263d55307 800 {
AnnaBridge 167:e84263d55307 801 /* Clear all the static flags */
AnnaBridge 167:e84263d55307 802 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 803 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_TIMEOUT;
AnnaBridge 167:e84263d55307 804 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 805 return HAL_ERROR;
AnnaBridge 167:e84263d55307 806 }
AnnaBridge 167:e84263d55307 807 else if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DCRCFAIL))
AnnaBridge 167:e84263d55307 808 {
AnnaBridge 167:e84263d55307 809 /* Clear all the static flags */
AnnaBridge 167:e84263d55307 810 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 811 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_CRC_FAIL;
AnnaBridge 167:e84263d55307 812 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 813 return HAL_ERROR;
AnnaBridge 167:e84263d55307 814 }
AnnaBridge 167:e84263d55307 815 else if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_TXUNDERR))
AnnaBridge 167:e84263d55307 816 {
AnnaBridge 167:e84263d55307 817 /* Clear all the static flags */
AnnaBridge 167:e84263d55307 818 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 819 hmmc->ErrorCode |= HAL_MMC_ERROR_TX_UNDERRUN;
AnnaBridge 167:e84263d55307 820 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 821 return HAL_ERROR;
AnnaBridge 167:e84263d55307 822 }
AnnaBridge 167:e84263d55307 823
AnnaBridge 167:e84263d55307 824 /* Clear all the static flags */
AnnaBridge 167:e84263d55307 825 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 826
AnnaBridge 167:e84263d55307 827 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 828
AnnaBridge 167:e84263d55307 829 return HAL_OK;
AnnaBridge 167:e84263d55307 830 }
AnnaBridge 167:e84263d55307 831 else
AnnaBridge 167:e84263d55307 832 {
AnnaBridge 167:e84263d55307 833 hmmc->ErrorCode |= HAL_MMC_ERROR_BUSY;
AnnaBridge 167:e84263d55307 834 return HAL_ERROR;
AnnaBridge 167:e84263d55307 835 }
AnnaBridge 167:e84263d55307 836 }
AnnaBridge 167:e84263d55307 837
AnnaBridge 167:e84263d55307 838 /**
AnnaBridge 167:e84263d55307 839 * @brief Reads block(s) from a specified address in a card. The Data transfer
AnnaBridge 167:e84263d55307 840 * is managed in interrupt mode.
AnnaBridge 167:e84263d55307 841 * @note This API should be followed by a check on the card state through
AnnaBridge 167:e84263d55307 842 * HAL_MMC_GetCardState().
AnnaBridge 167:e84263d55307 843 * @note You could also check the IT transfer process through the MMC Rx
AnnaBridge 167:e84263d55307 844 * interrupt event.
AnnaBridge 167:e84263d55307 845 * @param hmmc: Pointer to MMC handle
AnnaBridge 167:e84263d55307 846 * @param pData: Pointer to the buffer that will contain the received data
AnnaBridge 167:e84263d55307 847 * @param BlockAdd: Block Address from where data is to be read
AnnaBridge 167:e84263d55307 848 * @param NumberOfBlocks: Number of blocks to read.
AnnaBridge 167:e84263d55307 849 * @retval HAL status
AnnaBridge 167:e84263d55307 850 */
AnnaBridge 167:e84263d55307 851 HAL_StatusTypeDef HAL_MMC_ReadBlocks_IT(MMC_HandleTypeDef *hmmc, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks)
AnnaBridge 167:e84263d55307 852 {
AnnaBridge 167:e84263d55307 853 SDIO_DataInitTypeDef config;
AnnaBridge 167:e84263d55307 854 uint32_t errorstate = HAL_MMC_ERROR_NONE;
AnnaBridge 167:e84263d55307 855
AnnaBridge 167:e84263d55307 856 if(NULL == pData)
AnnaBridge 167:e84263d55307 857 {
AnnaBridge 167:e84263d55307 858 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
AnnaBridge 167:e84263d55307 859 return HAL_ERROR;
AnnaBridge 167:e84263d55307 860 }
AnnaBridge 167:e84263d55307 861
AnnaBridge 167:e84263d55307 862 if(hmmc->State == HAL_MMC_STATE_READY)
AnnaBridge 167:e84263d55307 863 {
AnnaBridge 167:e84263d55307 864 hmmc->ErrorCode = HAL_DMA_ERROR_NONE;
AnnaBridge 167:e84263d55307 865
AnnaBridge 167:e84263d55307 866 if((BlockAdd + NumberOfBlocks) > (hmmc->MmcCard.LogBlockNbr))
AnnaBridge 167:e84263d55307 867 {
AnnaBridge 167:e84263d55307 868 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE;
AnnaBridge 167:e84263d55307 869 return HAL_ERROR;
AnnaBridge 167:e84263d55307 870 }
AnnaBridge 167:e84263d55307 871
AnnaBridge 167:e84263d55307 872 hmmc->State = HAL_MMC_STATE_BUSY;
AnnaBridge 167:e84263d55307 873
AnnaBridge 167:e84263d55307 874 /* Initialize data control register */
AnnaBridge 167:e84263d55307 875 hmmc->Instance->DCTRL = 0U;
AnnaBridge 167:e84263d55307 876
AnnaBridge 167:e84263d55307 877 hmmc->pRxBuffPtr = (uint32_t *)pData;
AnnaBridge 167:e84263d55307 878 hmmc->RxXferSize = BLOCKSIZE * NumberOfBlocks;
AnnaBridge 167:e84263d55307 879
AnnaBridge 167:e84263d55307 880 __HAL_MMC_ENABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND | SDIO_FLAG_RXFIFOHF));
AnnaBridge 167:e84263d55307 881
AnnaBridge 167:e84263d55307 882 /* Check the Card capacity in term of Logical number of blocks */
AnnaBridge 167:e84263d55307 883 if ((hmmc->MmcCard.LogBlockNbr) < CAPACITY)
AnnaBridge 167:e84263d55307 884 {
AnnaBridge 167:e84263d55307 885 BlockAdd *= 512U;
AnnaBridge 167:e84263d55307 886 }
AnnaBridge 167:e84263d55307 887
AnnaBridge 167:e84263d55307 888 /* Configure the MMC DPSM (Data Path State Machine) */
AnnaBridge 167:e84263d55307 889 config.DataTimeOut = SDMMC_DATATIMEOUT;
AnnaBridge 167:e84263d55307 890 config.DataLength = BLOCKSIZE * NumberOfBlocks;
AnnaBridge 167:e84263d55307 891 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
AnnaBridge 167:e84263d55307 892 config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO;
AnnaBridge 167:e84263d55307 893 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
AnnaBridge 167:e84263d55307 894 config.DPSM = SDIO_DPSM_ENABLE;
AnnaBridge 167:e84263d55307 895 SDIO_ConfigData(hmmc->Instance, &config);
AnnaBridge 167:e84263d55307 896
AnnaBridge 167:e84263d55307 897 /* Set Block Size for Card */
AnnaBridge 167:e84263d55307 898 errorstate = SDMMC_CmdBlockLength(hmmc->Instance, BLOCKSIZE);
AnnaBridge 167:e84263d55307 899 if(errorstate != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 900 {
AnnaBridge 167:e84263d55307 901 /* Clear all the static flags */
AnnaBridge 167:e84263d55307 902 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 903 hmmc->ErrorCode |= errorstate;
AnnaBridge 167:e84263d55307 904 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 905 return HAL_ERROR;
AnnaBridge 167:e84263d55307 906 }
AnnaBridge 167:e84263d55307 907
AnnaBridge 167:e84263d55307 908 /* Read Blocks in IT mode */
AnnaBridge 167:e84263d55307 909 if(NumberOfBlocks > 1U)
AnnaBridge 167:e84263d55307 910 {
AnnaBridge 167:e84263d55307 911 hmmc->Context = (MMC_CONTEXT_READ_MULTIPLE_BLOCK | MMC_CONTEXT_IT);
AnnaBridge 167:e84263d55307 912
AnnaBridge 167:e84263d55307 913 /* Read Multi Block command */
AnnaBridge 167:e84263d55307 914 errorstate = SDMMC_CmdReadMultiBlock(hmmc->Instance, BlockAdd);
AnnaBridge 167:e84263d55307 915 }
AnnaBridge 167:e84263d55307 916 else
AnnaBridge 167:e84263d55307 917 {
AnnaBridge 167:e84263d55307 918 hmmc->Context = (MMC_CONTEXT_READ_SINGLE_BLOCK | MMC_CONTEXT_IT);
AnnaBridge 167:e84263d55307 919
AnnaBridge 167:e84263d55307 920 /* Read Single Block command */
AnnaBridge 167:e84263d55307 921 errorstate = SDMMC_CmdReadSingleBlock(hmmc->Instance, BlockAdd);
AnnaBridge 167:e84263d55307 922 }
AnnaBridge 167:e84263d55307 923 if(errorstate != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 924 {
AnnaBridge 167:e84263d55307 925 /* Clear all the static flags */
AnnaBridge 167:e84263d55307 926 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 927 hmmc->ErrorCode |= errorstate;
AnnaBridge 167:e84263d55307 928 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 929 return HAL_ERROR;
AnnaBridge 167:e84263d55307 930 }
AnnaBridge 167:e84263d55307 931
AnnaBridge 167:e84263d55307 932 return HAL_OK;
AnnaBridge 167:e84263d55307 933 }
AnnaBridge 167:e84263d55307 934 else
AnnaBridge 167:e84263d55307 935 {
AnnaBridge 167:e84263d55307 936 return HAL_BUSY;
AnnaBridge 167:e84263d55307 937 }
AnnaBridge 167:e84263d55307 938 }
AnnaBridge 167:e84263d55307 939
AnnaBridge 167:e84263d55307 940 /**
AnnaBridge 167:e84263d55307 941 * @brief Writes block(s) to a specified address in a card. The Data transfer
AnnaBridge 167:e84263d55307 942 * is managed in interrupt mode.
AnnaBridge 167:e84263d55307 943 * @note This API should be followed by a check on the card state through
AnnaBridge 167:e84263d55307 944 * HAL_MMC_GetCardState().
AnnaBridge 167:e84263d55307 945 * @note You could also check the IT transfer process through the MMC Tx
AnnaBridge 167:e84263d55307 946 * interrupt event.
AnnaBridge 167:e84263d55307 947 * @param hmmc: Pointer to MMC handle
AnnaBridge 167:e84263d55307 948 * @param pData: Pointer to the buffer that will contain the data to transmit
AnnaBridge 167:e84263d55307 949 * @param BlockAdd: Block Address where data will be written
AnnaBridge 167:e84263d55307 950 * @param NumberOfBlocks: Number of blocks to write
AnnaBridge 167:e84263d55307 951 * @retval HAL status
AnnaBridge 167:e84263d55307 952 */
AnnaBridge 167:e84263d55307 953 HAL_StatusTypeDef HAL_MMC_WriteBlocks_IT(MMC_HandleTypeDef *hmmc, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks)
AnnaBridge 167:e84263d55307 954 {
AnnaBridge 167:e84263d55307 955 SDIO_DataInitTypeDef config;
AnnaBridge 167:e84263d55307 956 uint32_t errorstate = HAL_MMC_ERROR_NONE;
AnnaBridge 167:e84263d55307 957
AnnaBridge 167:e84263d55307 958 if(NULL == pData)
AnnaBridge 167:e84263d55307 959 {
AnnaBridge 167:e84263d55307 960 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
AnnaBridge 167:e84263d55307 961 return HAL_ERROR;
AnnaBridge 167:e84263d55307 962 }
AnnaBridge 167:e84263d55307 963
AnnaBridge 167:e84263d55307 964 if(hmmc->State == HAL_MMC_STATE_READY)
AnnaBridge 167:e84263d55307 965 {
AnnaBridge 167:e84263d55307 966 hmmc->ErrorCode = HAL_DMA_ERROR_NONE;
AnnaBridge 167:e84263d55307 967
AnnaBridge 167:e84263d55307 968 if((BlockAdd + NumberOfBlocks) > (hmmc->MmcCard.LogBlockNbr))
AnnaBridge 167:e84263d55307 969 {
AnnaBridge 167:e84263d55307 970 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE;
AnnaBridge 167:e84263d55307 971 return HAL_ERROR;
AnnaBridge 167:e84263d55307 972 }
AnnaBridge 167:e84263d55307 973
AnnaBridge 167:e84263d55307 974 hmmc->State = HAL_MMC_STATE_BUSY;
AnnaBridge 167:e84263d55307 975
AnnaBridge 167:e84263d55307 976 /* Initialize data control register */
AnnaBridge 167:e84263d55307 977 hmmc->Instance->DCTRL = 0U;
AnnaBridge 167:e84263d55307 978
AnnaBridge 167:e84263d55307 979 hmmc->pTxBuffPtr = (uint32_t *)pData;
AnnaBridge 167:e84263d55307 980 hmmc->TxXferSize = BLOCKSIZE * NumberOfBlocks;
AnnaBridge 167:e84263d55307 981
AnnaBridge 167:e84263d55307 982 /* Enable transfer interrupts */
AnnaBridge 167:e84263d55307 983 __HAL_MMC_ENABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR | SDIO_IT_DATAEND | SDIO_FLAG_TXFIFOHE));
AnnaBridge 167:e84263d55307 984
AnnaBridge 167:e84263d55307 985 /* Check the Card capacity in term of Logical number of blocks */
AnnaBridge 167:e84263d55307 986 if ((hmmc->MmcCard.LogBlockNbr) < CAPACITY)
AnnaBridge 167:e84263d55307 987 {
AnnaBridge 167:e84263d55307 988 BlockAdd *= 512U;
AnnaBridge 167:e84263d55307 989 }
AnnaBridge 167:e84263d55307 990
AnnaBridge 167:e84263d55307 991 /* Set Block Size for Card */
AnnaBridge 167:e84263d55307 992 errorstate = SDMMC_CmdBlockLength(hmmc->Instance, BLOCKSIZE);
AnnaBridge 167:e84263d55307 993 if(errorstate != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 994 {
AnnaBridge 167:e84263d55307 995 /* Clear all the static flags */
AnnaBridge 167:e84263d55307 996 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 997 hmmc->ErrorCode |= errorstate;
AnnaBridge 167:e84263d55307 998 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 999 return HAL_ERROR;
AnnaBridge 167:e84263d55307 1000 }
AnnaBridge 167:e84263d55307 1001
AnnaBridge 167:e84263d55307 1002 /* Write Blocks in Polling mode */
AnnaBridge 167:e84263d55307 1003 if(NumberOfBlocks > 1U)
AnnaBridge 167:e84263d55307 1004 {
AnnaBridge 167:e84263d55307 1005 hmmc->Context = (MMC_CONTEXT_WRITE_MULTIPLE_BLOCK| MMC_CONTEXT_IT);
AnnaBridge 167:e84263d55307 1006
AnnaBridge 167:e84263d55307 1007 /* Write Multi Block command */
AnnaBridge 167:e84263d55307 1008 errorstate = SDMMC_CmdWriteMultiBlock(hmmc->Instance, BlockAdd);
AnnaBridge 167:e84263d55307 1009 }
AnnaBridge 167:e84263d55307 1010 else
AnnaBridge 167:e84263d55307 1011 {
AnnaBridge 167:e84263d55307 1012 hmmc->Context = (MMC_CONTEXT_WRITE_SINGLE_BLOCK | MMC_CONTEXT_IT);
AnnaBridge 167:e84263d55307 1013
AnnaBridge 167:e84263d55307 1014 /* Write Single Block command */
AnnaBridge 167:e84263d55307 1015 errorstate = SDMMC_CmdWriteSingleBlock(hmmc->Instance, BlockAdd);
AnnaBridge 167:e84263d55307 1016 }
AnnaBridge 167:e84263d55307 1017 if(errorstate != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 1018 {
AnnaBridge 167:e84263d55307 1019 /* Clear all the static flags */
AnnaBridge 167:e84263d55307 1020 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 1021 hmmc->ErrorCode |= errorstate;
AnnaBridge 167:e84263d55307 1022 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 1023 return HAL_ERROR;
AnnaBridge 167:e84263d55307 1024 }
AnnaBridge 167:e84263d55307 1025
AnnaBridge 167:e84263d55307 1026 /* Configure the MMC DPSM (Data Path State Machine) */
AnnaBridge 167:e84263d55307 1027 config.DataTimeOut = SDMMC_DATATIMEOUT;
AnnaBridge 167:e84263d55307 1028 config.DataLength = BLOCKSIZE * NumberOfBlocks;
AnnaBridge 167:e84263d55307 1029 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
AnnaBridge 167:e84263d55307 1030 config.TransferDir = SDIO_TRANSFER_DIR_TO_CARD;
AnnaBridge 167:e84263d55307 1031 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
AnnaBridge 167:e84263d55307 1032 config.DPSM = SDIO_DPSM_ENABLE;
AnnaBridge 167:e84263d55307 1033 SDIO_ConfigData(hmmc->Instance, &config);
AnnaBridge 167:e84263d55307 1034
AnnaBridge 167:e84263d55307 1035 return HAL_OK;
AnnaBridge 167:e84263d55307 1036 }
AnnaBridge 167:e84263d55307 1037 else
AnnaBridge 167:e84263d55307 1038 {
AnnaBridge 167:e84263d55307 1039 return HAL_BUSY;
AnnaBridge 167:e84263d55307 1040 }
AnnaBridge 167:e84263d55307 1041 }
AnnaBridge 167:e84263d55307 1042
AnnaBridge 167:e84263d55307 1043 /**
AnnaBridge 167:e84263d55307 1044 * @brief Reads block(s) from a specified address in a card. The Data transfer
AnnaBridge 167:e84263d55307 1045 * is managed by DMA mode.
AnnaBridge 167:e84263d55307 1046 * @note This API should be followed by a check on the card state through
AnnaBridge 167:e84263d55307 1047 * HAL_MMC_GetCardState().
AnnaBridge 167:e84263d55307 1048 * @note You could also check the DMA transfer process through the MMC Rx
AnnaBridge 167:e84263d55307 1049 * interrupt event.
AnnaBridge 167:e84263d55307 1050 * @param hmmc: Pointer MMC handle
AnnaBridge 167:e84263d55307 1051 * @param pData: Pointer to the buffer that will contain the received data
AnnaBridge 167:e84263d55307 1052 * @param BlockAdd: Block Address from where data is to be read
AnnaBridge 167:e84263d55307 1053 * @param NumberOfBlocks: Number of blocks to read.
AnnaBridge 167:e84263d55307 1054 * @retval HAL status
AnnaBridge 167:e84263d55307 1055 */
AnnaBridge 167:e84263d55307 1056 HAL_StatusTypeDef HAL_MMC_ReadBlocks_DMA(MMC_HandleTypeDef *hmmc, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks)
AnnaBridge 167:e84263d55307 1057 {
AnnaBridge 167:e84263d55307 1058 SDIO_DataInitTypeDef config;
AnnaBridge 167:e84263d55307 1059 uint32_t errorstate = HAL_MMC_ERROR_NONE;
AnnaBridge 167:e84263d55307 1060
AnnaBridge 167:e84263d55307 1061 if(NULL == pData)
AnnaBridge 167:e84263d55307 1062 {
AnnaBridge 167:e84263d55307 1063 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
AnnaBridge 167:e84263d55307 1064 return HAL_ERROR;
AnnaBridge 167:e84263d55307 1065 }
AnnaBridge 167:e84263d55307 1066
AnnaBridge 167:e84263d55307 1067 if(hmmc->State == HAL_MMC_STATE_READY)
AnnaBridge 167:e84263d55307 1068 {
AnnaBridge 167:e84263d55307 1069 hmmc->ErrorCode = HAL_DMA_ERROR_NONE;
AnnaBridge 167:e84263d55307 1070
AnnaBridge 167:e84263d55307 1071 if((BlockAdd + NumberOfBlocks) > (hmmc->MmcCard.LogBlockNbr))
AnnaBridge 167:e84263d55307 1072 {
AnnaBridge 167:e84263d55307 1073 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE;
AnnaBridge 167:e84263d55307 1074 return HAL_ERROR;
AnnaBridge 167:e84263d55307 1075 }
AnnaBridge 167:e84263d55307 1076
AnnaBridge 167:e84263d55307 1077 hmmc->State = HAL_MMC_STATE_BUSY;
AnnaBridge 167:e84263d55307 1078
AnnaBridge 167:e84263d55307 1079 /* Initialize data control register */
AnnaBridge 167:e84263d55307 1080 hmmc->Instance->DCTRL = 0U;
AnnaBridge 167:e84263d55307 1081
AnnaBridge 167:e84263d55307 1082 #ifdef SDIO_STA_STBITER
AnnaBridge 167:e84263d55307 1083 __HAL_MMC_ENABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND | SDIO_IT_STBITERR));
AnnaBridge 167:e84263d55307 1084 #else /* SDIO_STA_STBITERR not defined */
AnnaBridge 167:e84263d55307 1085 __HAL_MMC_ENABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND));
AnnaBridge 167:e84263d55307 1086 #endif /* SDIO_STA_STBITERR */
AnnaBridge 167:e84263d55307 1087
AnnaBridge 167:e84263d55307 1088 /* Set the DMA transfer complete callback */
AnnaBridge 167:e84263d55307 1089 hmmc->hdmarx->XferCpltCallback = MMC_DMAReceiveCplt;
AnnaBridge 167:e84263d55307 1090
AnnaBridge 167:e84263d55307 1091 /* Set the DMA error callback */
AnnaBridge 167:e84263d55307 1092 hmmc->hdmarx->XferErrorCallback = MMC_DMAError;
AnnaBridge 167:e84263d55307 1093
AnnaBridge 167:e84263d55307 1094 /* Set the DMA Abort callback */
AnnaBridge 167:e84263d55307 1095 hmmc->hdmarx->XferAbortCallback = NULL;
AnnaBridge 167:e84263d55307 1096
AnnaBridge 167:e84263d55307 1097 /* Enable the DMA Channel */
AnnaBridge 167:e84263d55307 1098 HAL_DMA_Start_IT(hmmc->hdmarx, (uint32_t)&hmmc->Instance->FIFO, (uint32_t)pData, (uint32_t)(BLOCKSIZE * NumberOfBlocks)/4);
AnnaBridge 167:e84263d55307 1099
AnnaBridge 167:e84263d55307 1100 /* Enable MMC DMA transfer */
AnnaBridge 167:e84263d55307 1101 __HAL_MMC_DMA_ENABLE(hmmc);
AnnaBridge 167:e84263d55307 1102
AnnaBridge 167:e84263d55307 1103 /* Check the Card capacity in term of Logical number of blocks */
AnnaBridge 167:e84263d55307 1104 if ((hmmc->MmcCard.LogBlockNbr) < CAPACITY)
AnnaBridge 167:e84263d55307 1105 {
AnnaBridge 167:e84263d55307 1106 BlockAdd *= 512U;
AnnaBridge 167:e84263d55307 1107 }
AnnaBridge 167:e84263d55307 1108
AnnaBridge 167:e84263d55307 1109 /* Configure the MMC DPSM (Data Path State Machine) */
AnnaBridge 167:e84263d55307 1110 config.DataTimeOut = SDMMC_DATATIMEOUT;
AnnaBridge 167:e84263d55307 1111 config.DataLength = BLOCKSIZE * NumberOfBlocks;
AnnaBridge 167:e84263d55307 1112 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
AnnaBridge 167:e84263d55307 1113 config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO;
AnnaBridge 167:e84263d55307 1114 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
AnnaBridge 167:e84263d55307 1115 config.DPSM = SDIO_DPSM_ENABLE;
AnnaBridge 167:e84263d55307 1116 SDIO_ConfigData(hmmc->Instance, &config);
AnnaBridge 167:e84263d55307 1117
AnnaBridge 167:e84263d55307 1118 /* Set Block Size for Card */
AnnaBridge 167:e84263d55307 1119 errorstate = SDMMC_CmdBlockLength(hmmc->Instance, BLOCKSIZE);
AnnaBridge 167:e84263d55307 1120 if(errorstate != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 1121 {
AnnaBridge 167:e84263d55307 1122 /* Clear all the static flags */
AnnaBridge 167:e84263d55307 1123 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 1124 hmmc->ErrorCode |= errorstate;
AnnaBridge 167:e84263d55307 1125 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 1126 return HAL_ERROR;
AnnaBridge 167:e84263d55307 1127 }
AnnaBridge 167:e84263d55307 1128
AnnaBridge 167:e84263d55307 1129 /* Read Blocks in DMA mode */
AnnaBridge 167:e84263d55307 1130 if(NumberOfBlocks > 1U)
AnnaBridge 167:e84263d55307 1131 {
AnnaBridge 167:e84263d55307 1132 hmmc->Context = (MMC_CONTEXT_READ_MULTIPLE_BLOCK | MMC_CONTEXT_DMA);
AnnaBridge 167:e84263d55307 1133
AnnaBridge 167:e84263d55307 1134 /* Read Multi Block command */
AnnaBridge 167:e84263d55307 1135 errorstate = SDMMC_CmdReadMultiBlock(hmmc->Instance, BlockAdd);
AnnaBridge 167:e84263d55307 1136 }
AnnaBridge 167:e84263d55307 1137 else
AnnaBridge 167:e84263d55307 1138 {
AnnaBridge 167:e84263d55307 1139 hmmc->Context = (MMC_CONTEXT_READ_SINGLE_BLOCK | MMC_CONTEXT_DMA);
AnnaBridge 167:e84263d55307 1140
AnnaBridge 167:e84263d55307 1141 /* Read Single Block command */
AnnaBridge 167:e84263d55307 1142 errorstate = SDMMC_CmdReadSingleBlock(hmmc->Instance, BlockAdd);
AnnaBridge 167:e84263d55307 1143 }
AnnaBridge 167:e84263d55307 1144 if(errorstate != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 1145 {
AnnaBridge 167:e84263d55307 1146 /* Clear all the static flags */
AnnaBridge 167:e84263d55307 1147 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 1148 hmmc->ErrorCode |= errorstate;
AnnaBridge 167:e84263d55307 1149 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 1150 return HAL_ERROR;
AnnaBridge 167:e84263d55307 1151 }
AnnaBridge 167:e84263d55307 1152
AnnaBridge 167:e84263d55307 1153 return HAL_OK;
AnnaBridge 167:e84263d55307 1154 }
AnnaBridge 167:e84263d55307 1155 else
AnnaBridge 167:e84263d55307 1156 {
AnnaBridge 167:e84263d55307 1157 return HAL_BUSY;
AnnaBridge 167:e84263d55307 1158 }
AnnaBridge 167:e84263d55307 1159 }
AnnaBridge 167:e84263d55307 1160
AnnaBridge 167:e84263d55307 1161 /**
AnnaBridge 167:e84263d55307 1162 * @brief Writes block(s) to a specified address in a card. The Data transfer
AnnaBridge 167:e84263d55307 1163 * is managed by DMA mode.
AnnaBridge 167:e84263d55307 1164 * @note This API should be followed by a check on the card state through
AnnaBridge 167:e84263d55307 1165 * HAL_MMC_GetCardState().
AnnaBridge 167:e84263d55307 1166 * @note You could also check the DMA transfer process through the MMC Tx
AnnaBridge 167:e84263d55307 1167 * interrupt event.
AnnaBridge 167:e84263d55307 1168 * @param hmmc: Pointer to MMC handle
AnnaBridge 167:e84263d55307 1169 * @param pData: Pointer to the buffer that will contain the data to transmit
AnnaBridge 167:e84263d55307 1170 * @param BlockAdd: Block Address where data will be written
AnnaBridge 167:e84263d55307 1171 * @param NumberOfBlocks: Number of blocks to write
AnnaBridge 167:e84263d55307 1172 * @retval HAL status
AnnaBridge 167:e84263d55307 1173 */
AnnaBridge 167:e84263d55307 1174 HAL_StatusTypeDef HAL_MMC_WriteBlocks_DMA(MMC_HandleTypeDef *hmmc, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks)
AnnaBridge 167:e84263d55307 1175 {
AnnaBridge 167:e84263d55307 1176 SDIO_DataInitTypeDef config;
AnnaBridge 167:e84263d55307 1177 uint32_t errorstate = HAL_MMC_ERROR_NONE;
AnnaBridge 167:e84263d55307 1178
AnnaBridge 167:e84263d55307 1179 if(NULL == pData)
AnnaBridge 167:e84263d55307 1180 {
AnnaBridge 167:e84263d55307 1181 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
AnnaBridge 167:e84263d55307 1182 return HAL_ERROR;
AnnaBridge 167:e84263d55307 1183 }
AnnaBridge 167:e84263d55307 1184
AnnaBridge 167:e84263d55307 1185 if(hmmc->State == HAL_MMC_STATE_READY)
AnnaBridge 167:e84263d55307 1186 {
AnnaBridge 167:e84263d55307 1187 hmmc->ErrorCode = HAL_DMA_ERROR_NONE;
AnnaBridge 167:e84263d55307 1188
AnnaBridge 167:e84263d55307 1189 if((BlockAdd + NumberOfBlocks) > (hmmc->MmcCard.LogBlockNbr))
AnnaBridge 167:e84263d55307 1190 {
AnnaBridge 167:e84263d55307 1191 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE;
AnnaBridge 167:e84263d55307 1192 return HAL_ERROR;
AnnaBridge 167:e84263d55307 1193 }
AnnaBridge 167:e84263d55307 1194
AnnaBridge 167:e84263d55307 1195 hmmc->State = HAL_MMC_STATE_BUSY;
AnnaBridge 167:e84263d55307 1196
AnnaBridge 167:e84263d55307 1197 /* Initialize data control register */
AnnaBridge 167:e84263d55307 1198 hmmc->Instance->DCTRL = 0U;
AnnaBridge 167:e84263d55307 1199
AnnaBridge 167:e84263d55307 1200 /* Enable MMC Error interrupts */
AnnaBridge 167:e84263d55307 1201 #ifdef SDIO_STA_STBITER
AnnaBridge 167:e84263d55307 1202 __HAL_MMC_ENABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR | SDIO_IT_STBITERR));
AnnaBridge 167:e84263d55307 1203 #else /* SDIO_STA_STBITERR not defined */
AnnaBridge 167:e84263d55307 1204 __HAL_MMC_ENABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR));
AnnaBridge 167:e84263d55307 1205 #endif /* SDIO_STA_STBITERR */
AnnaBridge 167:e84263d55307 1206
AnnaBridge 167:e84263d55307 1207 /* Set the DMA transfer complete callback */
AnnaBridge 167:e84263d55307 1208 hmmc->hdmatx->XferCpltCallback = MMC_DMATransmitCplt;
AnnaBridge 167:e84263d55307 1209
AnnaBridge 167:e84263d55307 1210 /* Set the DMA error callback */
AnnaBridge 167:e84263d55307 1211 hmmc->hdmatx->XferErrorCallback = MMC_DMAError;
AnnaBridge 167:e84263d55307 1212
AnnaBridge 167:e84263d55307 1213 /* Set the DMA Abort callback */
AnnaBridge 167:e84263d55307 1214 hmmc->hdmatx->XferAbortCallback = NULL;
AnnaBridge 167:e84263d55307 1215
AnnaBridge 167:e84263d55307 1216 /* Check the Card capacity in term of Logical number of blocks */
AnnaBridge 167:e84263d55307 1217 if ((hmmc->MmcCard.LogBlockNbr) < CAPACITY)
AnnaBridge 167:e84263d55307 1218 {
AnnaBridge 167:e84263d55307 1219 BlockAdd *= 512U;
AnnaBridge 167:e84263d55307 1220 }
AnnaBridge 167:e84263d55307 1221
AnnaBridge 167:e84263d55307 1222 /* Set Block Size for Card */
AnnaBridge 167:e84263d55307 1223 errorstate = SDMMC_CmdBlockLength(hmmc->Instance, BLOCKSIZE);
AnnaBridge 167:e84263d55307 1224 if(errorstate != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 1225 {
AnnaBridge 167:e84263d55307 1226 /* Clear all the static flags */
AnnaBridge 167:e84263d55307 1227 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 1228 hmmc->ErrorCode |= errorstate;
AnnaBridge 167:e84263d55307 1229 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 1230 return HAL_ERROR;
AnnaBridge 167:e84263d55307 1231 }
AnnaBridge 167:e84263d55307 1232
AnnaBridge 167:e84263d55307 1233 /* Write Blocks in Polling mode */
AnnaBridge 167:e84263d55307 1234 if(NumberOfBlocks > 1U)
AnnaBridge 167:e84263d55307 1235 {
AnnaBridge 167:e84263d55307 1236 hmmc->Context = (MMC_CONTEXT_WRITE_MULTIPLE_BLOCK | MMC_CONTEXT_DMA);
AnnaBridge 167:e84263d55307 1237
AnnaBridge 167:e84263d55307 1238 /* Write Multi Block command */
AnnaBridge 167:e84263d55307 1239 errorstate = SDMMC_CmdWriteMultiBlock(hmmc->Instance, BlockAdd);
AnnaBridge 167:e84263d55307 1240 }
AnnaBridge 167:e84263d55307 1241 else
AnnaBridge 167:e84263d55307 1242 {
AnnaBridge 167:e84263d55307 1243 hmmc->Context = (MMC_CONTEXT_WRITE_SINGLE_BLOCK | MMC_CONTEXT_DMA);
AnnaBridge 167:e84263d55307 1244
AnnaBridge 167:e84263d55307 1245 /* Write Single Block command */
AnnaBridge 167:e84263d55307 1246 errorstate = SDMMC_CmdWriteSingleBlock(hmmc->Instance, BlockAdd);
AnnaBridge 167:e84263d55307 1247 }
AnnaBridge 167:e84263d55307 1248 if(errorstate != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 1249 {
AnnaBridge 167:e84263d55307 1250 /* Clear all the static flags */
AnnaBridge 167:e84263d55307 1251 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 1252 hmmc->ErrorCode |= errorstate;
AnnaBridge 167:e84263d55307 1253 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 1254 return HAL_ERROR;
AnnaBridge 167:e84263d55307 1255 }
AnnaBridge 167:e84263d55307 1256
AnnaBridge 167:e84263d55307 1257 /* Enable SDIO DMA transfer */
AnnaBridge 167:e84263d55307 1258 __HAL_MMC_DMA_ENABLE(hmmc);
AnnaBridge 167:e84263d55307 1259
AnnaBridge 167:e84263d55307 1260 /* Enable the DMA Channel */
AnnaBridge 167:e84263d55307 1261 HAL_DMA_Start_IT(hmmc->hdmatx, (uint32_t)pData, (uint32_t)&hmmc->Instance->FIFO, (uint32_t)(BLOCKSIZE * NumberOfBlocks)/4);
AnnaBridge 167:e84263d55307 1262
AnnaBridge 167:e84263d55307 1263 /* Configure the MMC DPSM (Data Path State Machine) */
AnnaBridge 167:e84263d55307 1264 config.DataTimeOut = SDMMC_DATATIMEOUT;
AnnaBridge 167:e84263d55307 1265 config.DataLength = BLOCKSIZE * NumberOfBlocks;
AnnaBridge 167:e84263d55307 1266 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
AnnaBridge 167:e84263d55307 1267 config.TransferDir = SDIO_TRANSFER_DIR_TO_CARD;
AnnaBridge 167:e84263d55307 1268 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
AnnaBridge 167:e84263d55307 1269 config.DPSM = SDIO_DPSM_ENABLE;
AnnaBridge 167:e84263d55307 1270 SDIO_ConfigData(hmmc->Instance, &config);
AnnaBridge 167:e84263d55307 1271
AnnaBridge 167:e84263d55307 1272 return HAL_OK;
AnnaBridge 167:e84263d55307 1273 }
AnnaBridge 167:e84263d55307 1274 else
AnnaBridge 167:e84263d55307 1275 {
AnnaBridge 167:e84263d55307 1276 return HAL_BUSY;
AnnaBridge 167:e84263d55307 1277 }
AnnaBridge 167:e84263d55307 1278 }
AnnaBridge 167:e84263d55307 1279
AnnaBridge 167:e84263d55307 1280 /**
AnnaBridge 167:e84263d55307 1281 * @brief Erases the specified memory area of the given MMC card.
AnnaBridge 167:e84263d55307 1282 * @note This API should be followed by a check on the card state through
AnnaBridge 167:e84263d55307 1283 * HAL_MMC_GetCardState().
AnnaBridge 167:e84263d55307 1284 * @param hmmc: Pointer to MMC handle
AnnaBridge 167:e84263d55307 1285 * @param BlockStartAdd: Start Block address
AnnaBridge 167:e84263d55307 1286 * @param BlockEndAdd: End Block address
AnnaBridge 167:e84263d55307 1287 * @retval HAL status
AnnaBridge 167:e84263d55307 1288 */
AnnaBridge 167:e84263d55307 1289 HAL_StatusTypeDef HAL_MMC_Erase(MMC_HandleTypeDef *hmmc, uint32_t BlockStartAdd, uint32_t BlockEndAdd)
AnnaBridge 167:e84263d55307 1290 {
AnnaBridge 167:e84263d55307 1291 uint32_t errorstate = HAL_MMC_ERROR_NONE;
AnnaBridge 167:e84263d55307 1292
AnnaBridge 167:e84263d55307 1293 if(hmmc->State == HAL_MMC_STATE_READY)
AnnaBridge 167:e84263d55307 1294 {
AnnaBridge 167:e84263d55307 1295 hmmc->ErrorCode = HAL_DMA_ERROR_NONE;
AnnaBridge 167:e84263d55307 1296
AnnaBridge 167:e84263d55307 1297 if(BlockEndAdd < BlockStartAdd)
AnnaBridge 167:e84263d55307 1298 {
AnnaBridge 167:e84263d55307 1299 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
AnnaBridge 167:e84263d55307 1300 return HAL_ERROR;
AnnaBridge 167:e84263d55307 1301 }
AnnaBridge 167:e84263d55307 1302
AnnaBridge 167:e84263d55307 1303 if(BlockEndAdd > (hmmc->MmcCard.LogBlockNbr))
AnnaBridge 167:e84263d55307 1304 {
AnnaBridge 167:e84263d55307 1305 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE;
AnnaBridge 167:e84263d55307 1306 return HAL_ERROR;
AnnaBridge 167:e84263d55307 1307 }
AnnaBridge 167:e84263d55307 1308
AnnaBridge 167:e84263d55307 1309 hmmc->State = HAL_MMC_STATE_BUSY;
AnnaBridge 167:e84263d55307 1310
AnnaBridge 167:e84263d55307 1311 /* Check if the card command class supports erase command */
Anna Bridge 186:707f6e361f3e 1312 if(((hmmc->MmcCard.Class) & SDIO_CCCC_ERASE) == 0U)
AnnaBridge 167:e84263d55307 1313 {
AnnaBridge 167:e84263d55307 1314 /* Clear all the static flags */
AnnaBridge 167:e84263d55307 1315 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 1316 hmmc->ErrorCode |= HAL_MMC_ERROR_REQUEST_NOT_APPLICABLE;
AnnaBridge 167:e84263d55307 1317 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 1318 return HAL_ERROR;
AnnaBridge 167:e84263d55307 1319 }
AnnaBridge 167:e84263d55307 1320
AnnaBridge 167:e84263d55307 1321 if((SDIO_GetResponse(hmmc->Instance, SDIO_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)
AnnaBridge 167:e84263d55307 1322 {
AnnaBridge 167:e84263d55307 1323 /* Clear all the static flags */
AnnaBridge 167:e84263d55307 1324 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 1325 hmmc->ErrorCode |= HAL_MMC_ERROR_LOCK_UNLOCK_FAILED;
AnnaBridge 167:e84263d55307 1326 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 1327 return HAL_ERROR;
AnnaBridge 167:e84263d55307 1328 }
AnnaBridge 167:e84263d55307 1329
AnnaBridge 167:e84263d55307 1330 /* Check the Card capacity in term of Logical number of blocks */
AnnaBridge 167:e84263d55307 1331 if ((hmmc->MmcCard.LogBlockNbr) < CAPACITY)
AnnaBridge 167:e84263d55307 1332 {
AnnaBridge 167:e84263d55307 1333 BlockStartAdd *= 512U;
AnnaBridge 167:e84263d55307 1334 BlockEndAdd *= 512U;
AnnaBridge 167:e84263d55307 1335 }
AnnaBridge 167:e84263d55307 1336
AnnaBridge 167:e84263d55307 1337 /* Send CMD35 MMC_ERASE_GRP_START with argument as addr */
AnnaBridge 167:e84263d55307 1338 errorstate = SDMMC_CmdEraseStartAdd(hmmc->Instance, BlockStartAdd);
AnnaBridge 167:e84263d55307 1339 if(errorstate != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 1340 {
AnnaBridge 167:e84263d55307 1341 /* Clear all the static flags */
AnnaBridge 167:e84263d55307 1342 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 1343 hmmc->ErrorCode |= errorstate;
AnnaBridge 167:e84263d55307 1344 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 1345 return HAL_ERROR;
AnnaBridge 167:e84263d55307 1346 }
AnnaBridge 167:e84263d55307 1347
AnnaBridge 167:e84263d55307 1348 /* Send CMD36 MMC_ERASE_GRP_END with argument as addr */
AnnaBridge 167:e84263d55307 1349 errorstate = SDMMC_CmdEraseEndAdd(hmmc->Instance, BlockEndAdd);
AnnaBridge 167:e84263d55307 1350 if(errorstate != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 1351 {
AnnaBridge 167:e84263d55307 1352 /* Clear all the static flags */
AnnaBridge 167:e84263d55307 1353 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 1354 hmmc->ErrorCode |= errorstate;
AnnaBridge 167:e84263d55307 1355 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 1356 return HAL_ERROR;
AnnaBridge 167:e84263d55307 1357 }
AnnaBridge 167:e84263d55307 1358
AnnaBridge 167:e84263d55307 1359 /* Send CMD38 ERASE */
AnnaBridge 167:e84263d55307 1360 errorstate = SDMMC_CmdErase(hmmc->Instance);
AnnaBridge 167:e84263d55307 1361 if(errorstate != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 1362 {
AnnaBridge 167:e84263d55307 1363 /* Clear all the static flags */
AnnaBridge 167:e84263d55307 1364 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 1365 hmmc->ErrorCode |= errorstate;
AnnaBridge 167:e84263d55307 1366 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 1367 return HAL_ERROR;
AnnaBridge 167:e84263d55307 1368 }
AnnaBridge 167:e84263d55307 1369
AnnaBridge 167:e84263d55307 1370 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 1371
AnnaBridge 167:e84263d55307 1372 return HAL_OK;
AnnaBridge 167:e84263d55307 1373 }
AnnaBridge 167:e84263d55307 1374 else
AnnaBridge 167:e84263d55307 1375 {
AnnaBridge 167:e84263d55307 1376 return HAL_BUSY;
AnnaBridge 167:e84263d55307 1377 }
AnnaBridge 167:e84263d55307 1378 }
AnnaBridge 167:e84263d55307 1379
AnnaBridge 167:e84263d55307 1380 /**
AnnaBridge 167:e84263d55307 1381 * @brief This function handles MMC card interrupt request.
AnnaBridge 167:e84263d55307 1382 * @param hmmc: Pointer to MMC handle
AnnaBridge 167:e84263d55307 1383 * @retval None
AnnaBridge 167:e84263d55307 1384 */
AnnaBridge 167:e84263d55307 1385 void HAL_MMC_IRQHandler(MMC_HandleTypeDef *hmmc)
AnnaBridge 167:e84263d55307 1386 {
AnnaBridge 167:e84263d55307 1387 uint32_t errorstate = HAL_MMC_ERROR_NONE;
AnnaBridge 167:e84263d55307 1388
AnnaBridge 167:e84263d55307 1389 /* Check for SDIO interrupt flags */
AnnaBridge 167:e84263d55307 1390 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_IT_DATAEND) != RESET)
AnnaBridge 167:e84263d55307 1391 {
AnnaBridge 167:e84263d55307 1392 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_FLAG_DATAEND);
AnnaBridge 167:e84263d55307 1393
AnnaBridge 167:e84263d55307 1394 #ifdef SDIO_STA_STBITERR
AnnaBridge 167:e84263d55307 1395 __HAL_MMC_DISABLE_IT(hmmc, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
AnnaBridge 167:e84263d55307 1396 SDIO_IT_TXUNDERR | SDIO_IT_RXOVERR | SDIO_IT_STBITERR);
AnnaBridge 167:e84263d55307 1397 #else /* SDIO_STA_STBITERR not defined */
AnnaBridge 167:e84263d55307 1398 __HAL_MMC_DISABLE_IT(hmmc, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
AnnaBridge 167:e84263d55307 1399 SDIO_IT_TXUNDERR | SDIO_IT_RXOVERR);
AnnaBridge 167:e84263d55307 1400 #endif
AnnaBridge 167:e84263d55307 1401
AnnaBridge 167:e84263d55307 1402 if((hmmc->Context & MMC_CONTEXT_IT) != RESET)
AnnaBridge 167:e84263d55307 1403 {
AnnaBridge 167:e84263d55307 1404 if(((hmmc->Context & MMC_CONTEXT_READ_MULTIPLE_BLOCK) != RESET) || ((hmmc->Context & MMC_CONTEXT_WRITE_MULTIPLE_BLOCK) != RESET))
AnnaBridge 167:e84263d55307 1405 {
AnnaBridge 167:e84263d55307 1406 errorstate = SDMMC_CmdStopTransfer(hmmc->Instance);
AnnaBridge 167:e84263d55307 1407 if(errorstate != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 1408 {
AnnaBridge 167:e84263d55307 1409 hmmc->ErrorCode |= errorstate;
AnnaBridge 167:e84263d55307 1410 HAL_MMC_ErrorCallback(hmmc);
AnnaBridge 167:e84263d55307 1411 }
AnnaBridge 167:e84263d55307 1412 }
AnnaBridge 167:e84263d55307 1413
AnnaBridge 167:e84263d55307 1414 /* Clear all the static flags */
AnnaBridge 167:e84263d55307 1415 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 1416
AnnaBridge 167:e84263d55307 1417 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 1418 if(((hmmc->Context & MMC_CONTEXT_READ_SINGLE_BLOCK) != RESET) || ((hmmc->Context & MMC_CONTEXT_READ_MULTIPLE_BLOCK) != RESET))
AnnaBridge 167:e84263d55307 1419 {
AnnaBridge 167:e84263d55307 1420 HAL_MMC_RxCpltCallback(hmmc);
AnnaBridge 167:e84263d55307 1421 }
AnnaBridge 167:e84263d55307 1422 else
AnnaBridge 167:e84263d55307 1423 {
AnnaBridge 167:e84263d55307 1424 HAL_MMC_TxCpltCallback(hmmc);
AnnaBridge 167:e84263d55307 1425 }
AnnaBridge 167:e84263d55307 1426 }
AnnaBridge 167:e84263d55307 1427 else if((hmmc->Context & MMC_CONTEXT_DMA) != RESET)
AnnaBridge 167:e84263d55307 1428 {
AnnaBridge 167:e84263d55307 1429 if((hmmc->Context & MMC_CONTEXT_WRITE_MULTIPLE_BLOCK) != RESET)
AnnaBridge 167:e84263d55307 1430 {
AnnaBridge 167:e84263d55307 1431 errorstate = SDMMC_CmdStopTransfer(hmmc->Instance);
AnnaBridge 167:e84263d55307 1432 if(errorstate != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 1433 {
AnnaBridge 167:e84263d55307 1434 hmmc->ErrorCode |= errorstate;
AnnaBridge 167:e84263d55307 1435 HAL_MMC_ErrorCallback(hmmc);
AnnaBridge 167:e84263d55307 1436 }
AnnaBridge 167:e84263d55307 1437 }
AnnaBridge 167:e84263d55307 1438 if(((hmmc->Context & MMC_CONTEXT_READ_SINGLE_BLOCK) == RESET) && ((hmmc->Context & MMC_CONTEXT_READ_MULTIPLE_BLOCK) == RESET))
AnnaBridge 167:e84263d55307 1439 {
AnnaBridge 167:e84263d55307 1440 /* Disable the DMA transfer for transmit request by setting the DMAEN bit
AnnaBridge 167:e84263d55307 1441 in the MMC DCTRL register */
AnnaBridge 167:e84263d55307 1442 hmmc->Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN);
AnnaBridge 167:e84263d55307 1443
AnnaBridge 167:e84263d55307 1444 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 1445
AnnaBridge 167:e84263d55307 1446 HAL_MMC_TxCpltCallback(hmmc);
AnnaBridge 167:e84263d55307 1447 }
AnnaBridge 167:e84263d55307 1448 }
AnnaBridge 167:e84263d55307 1449 }
AnnaBridge 167:e84263d55307 1450
AnnaBridge 167:e84263d55307 1451 else if(__HAL_MMC_GET_FLAG(hmmc, SDIO_IT_TXFIFOHE) != RESET)
AnnaBridge 167:e84263d55307 1452 {
AnnaBridge 167:e84263d55307 1453 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_FLAG_TXFIFOHE);
AnnaBridge 167:e84263d55307 1454
AnnaBridge 167:e84263d55307 1455 MMC_Write_IT(hmmc);
AnnaBridge 167:e84263d55307 1456 }
AnnaBridge 167:e84263d55307 1457
AnnaBridge 167:e84263d55307 1458 else if(__HAL_MMC_GET_FLAG(hmmc, SDIO_IT_RXFIFOHF) != RESET)
AnnaBridge 167:e84263d55307 1459 {
AnnaBridge 167:e84263d55307 1460 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_FLAG_RXFIFOHF);
AnnaBridge 167:e84263d55307 1461
AnnaBridge 167:e84263d55307 1462 MMC_Read_IT(hmmc);
AnnaBridge 167:e84263d55307 1463 }
AnnaBridge 167:e84263d55307 1464
AnnaBridge 167:e84263d55307 1465 #ifdef SDIO_STA_STBITERR
AnnaBridge 167:e84263d55307 1466 else if(__HAL_MMC_GET_FLAG(hmmc, SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_TXUNDERR | SDIO_IT_STBITERR) != RESET)
AnnaBridge 167:e84263d55307 1467 {
AnnaBridge 167:e84263d55307 1468 /* Set Error code */
AnnaBridge 167:e84263d55307 1469 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_IT_DCRCFAIL) != RESET)
AnnaBridge 167:e84263d55307 1470 {
AnnaBridge 167:e84263d55307 1471 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_CRC_FAIL;
AnnaBridge 167:e84263d55307 1472 }
AnnaBridge 167:e84263d55307 1473 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_IT_DTIMEOUT) != RESET)
AnnaBridge 167:e84263d55307 1474 {
AnnaBridge 167:e84263d55307 1475 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_TIMEOUT;
AnnaBridge 167:e84263d55307 1476 }
AnnaBridge 167:e84263d55307 1477 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_IT_RXOVERR) != RESET)
AnnaBridge 167:e84263d55307 1478 {
AnnaBridge 167:e84263d55307 1479 hmmc->ErrorCode |= HAL_MMC_ERROR_RX_OVERRUN;
AnnaBridge 167:e84263d55307 1480 }
AnnaBridge 167:e84263d55307 1481 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_IT_TXUNDERR) != RESET)
AnnaBridge 167:e84263d55307 1482 {
AnnaBridge 167:e84263d55307 1483 hmmc->ErrorCode |= HAL_MMC_ERROR_TX_UNDERRUN;
AnnaBridge 167:e84263d55307 1484 }
AnnaBridge 167:e84263d55307 1485 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_IT_STBITERR) != RESET)
AnnaBridge 167:e84263d55307 1486 {
AnnaBridge 167:e84263d55307 1487 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_TIMEOUT;
AnnaBridge 167:e84263d55307 1488 }
AnnaBridge 167:e84263d55307 1489
AnnaBridge 167:e84263d55307 1490 /* Clear All flags */
AnnaBridge 167:e84263d55307 1491 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS | SDIO_FLAG_STBITERR);
AnnaBridge 167:e84263d55307 1492
AnnaBridge 167:e84263d55307 1493 /* Disable all interrupts */
AnnaBridge 167:e84263d55307 1494 __HAL_MMC_DISABLE_IT(hmmc, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
AnnaBridge 167:e84263d55307 1495 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR |SDIO_IT_STBITERR);
AnnaBridge 167:e84263d55307 1496
AnnaBridge 167:e84263d55307 1497 if((hmmc->Context & MMC_CONTEXT_DMA) != RESET)
AnnaBridge 167:e84263d55307 1498 {
AnnaBridge 167:e84263d55307 1499 /* Abort the MMC DMA Streams */
AnnaBridge 167:e84263d55307 1500 if(hmmc->hdmatx != NULL)
AnnaBridge 167:e84263d55307 1501 {
AnnaBridge 167:e84263d55307 1502 /* Set the DMA Tx abort callback */
AnnaBridge 167:e84263d55307 1503 hmmc->hdmatx->XferAbortCallback = MMC_DMATxAbort;
AnnaBridge 167:e84263d55307 1504 /* Abort DMA in IT mode */
AnnaBridge 167:e84263d55307 1505 if(HAL_DMA_Abort_IT(hmmc->hdmatx) != HAL_OK)
AnnaBridge 167:e84263d55307 1506 {
AnnaBridge 167:e84263d55307 1507 MMC_DMATxAbort(hmmc->hdmatx);
AnnaBridge 167:e84263d55307 1508 }
AnnaBridge 167:e84263d55307 1509 }
AnnaBridge 167:e84263d55307 1510 else if(hmmc->hdmarx != NULL)
AnnaBridge 167:e84263d55307 1511 {
AnnaBridge 167:e84263d55307 1512 /* Set the DMA Rx abort callback */
AnnaBridge 167:e84263d55307 1513 hmmc->hdmarx->XferAbortCallback = MMC_DMARxAbort;
AnnaBridge 167:e84263d55307 1514 /* Abort DMA in IT mode */
AnnaBridge 167:e84263d55307 1515 if(HAL_DMA_Abort_IT(hmmc->hdmarx) != HAL_OK)
AnnaBridge 167:e84263d55307 1516 {
AnnaBridge 167:e84263d55307 1517 MMC_DMARxAbort(hmmc->hdmarx);
AnnaBridge 167:e84263d55307 1518 }
AnnaBridge 167:e84263d55307 1519 }
AnnaBridge 167:e84263d55307 1520 else
AnnaBridge 167:e84263d55307 1521 {
AnnaBridge 167:e84263d55307 1522 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
AnnaBridge 167:e84263d55307 1523 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 1524 HAL_MMC_AbortCallback(hmmc);
AnnaBridge 167:e84263d55307 1525 }
AnnaBridge 167:e84263d55307 1526 }
AnnaBridge 167:e84263d55307 1527 else if((hmmc->Context & MMC_CONTEXT_IT) != RESET)
AnnaBridge 167:e84263d55307 1528 {
AnnaBridge 167:e84263d55307 1529 /* Set the MMC state to ready to be able to start again the process */
AnnaBridge 167:e84263d55307 1530 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 1531 HAL_MMC_ErrorCallback(hmmc);
AnnaBridge 167:e84263d55307 1532 }
AnnaBridge 167:e84263d55307 1533 }
AnnaBridge 167:e84263d55307 1534 #else /* SDIO_STA_STBITERR not defined */
AnnaBridge 167:e84263d55307 1535 else if(__HAL_MMC_GET_FLAG(hmmc, SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_TXUNDERR) != RESET)
AnnaBridge 167:e84263d55307 1536 {
AnnaBridge 167:e84263d55307 1537 /* Set Error code */
AnnaBridge 167:e84263d55307 1538 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_IT_DCRCFAIL) != RESET)
AnnaBridge 167:e84263d55307 1539 {
AnnaBridge 167:e84263d55307 1540 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_CRC_FAIL;
AnnaBridge 167:e84263d55307 1541 }
AnnaBridge 167:e84263d55307 1542 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_IT_DTIMEOUT) != RESET)
AnnaBridge 167:e84263d55307 1543 {
AnnaBridge 167:e84263d55307 1544 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_TIMEOUT;
AnnaBridge 167:e84263d55307 1545 }
AnnaBridge 167:e84263d55307 1546 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_IT_RXOVERR) != RESET)
AnnaBridge 167:e84263d55307 1547 {
AnnaBridge 167:e84263d55307 1548 hmmc->ErrorCode |= HAL_MMC_ERROR_RX_OVERRUN;
AnnaBridge 167:e84263d55307 1549 }
AnnaBridge 167:e84263d55307 1550 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_IT_TXUNDERR) != RESET)
AnnaBridge 167:e84263d55307 1551 {
AnnaBridge 167:e84263d55307 1552 hmmc->ErrorCode |= HAL_MMC_ERROR_TX_UNDERRUN;
AnnaBridge 167:e84263d55307 1553 }
AnnaBridge 167:e84263d55307 1554
AnnaBridge 167:e84263d55307 1555 /* Clear All flags */
AnnaBridge 167:e84263d55307 1556 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 1557
AnnaBridge 167:e84263d55307 1558 /* Disable all interrupts */
AnnaBridge 167:e84263d55307 1559 __HAL_MMC_DISABLE_IT(hmmc, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
AnnaBridge 167:e84263d55307 1560 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR);
AnnaBridge 167:e84263d55307 1561
AnnaBridge 167:e84263d55307 1562 if((hmmc->Context & MMC_CONTEXT_DMA) != RESET)
AnnaBridge 167:e84263d55307 1563 {
AnnaBridge 167:e84263d55307 1564 /* Abort the MMC DMA Streams */
AnnaBridge 167:e84263d55307 1565 if(hmmc->hdmatx != NULL)
AnnaBridge 167:e84263d55307 1566 {
AnnaBridge 167:e84263d55307 1567 /* Set the DMA Tx abort callback */
AnnaBridge 167:e84263d55307 1568 hmmc->hdmatx->XferAbortCallback = MMC_DMATxAbort;
AnnaBridge 167:e84263d55307 1569 /* Abort DMA in IT mode */
AnnaBridge 167:e84263d55307 1570 if(HAL_DMA_Abort_IT(hmmc->hdmatx) != HAL_OK)
AnnaBridge 167:e84263d55307 1571 {
AnnaBridge 167:e84263d55307 1572 MMC_DMATxAbort(hmmc->hdmatx);
AnnaBridge 167:e84263d55307 1573 }
AnnaBridge 167:e84263d55307 1574 }
AnnaBridge 167:e84263d55307 1575 else if(hmmc->hdmarx != NULL)
AnnaBridge 167:e84263d55307 1576 {
AnnaBridge 167:e84263d55307 1577 /* Set the DMA Rx abort callback */
AnnaBridge 167:e84263d55307 1578 hmmc->hdmarx->XferAbortCallback = MMC_DMARxAbort;
AnnaBridge 167:e84263d55307 1579 /* Abort DMA in IT mode */
AnnaBridge 167:e84263d55307 1580 if(HAL_DMA_Abort_IT(hmmc->hdmarx) != HAL_OK)
AnnaBridge 167:e84263d55307 1581 {
AnnaBridge 167:e84263d55307 1582 MMC_DMARxAbort(hmmc->hdmarx);
AnnaBridge 167:e84263d55307 1583 }
AnnaBridge 167:e84263d55307 1584 }
AnnaBridge 167:e84263d55307 1585 else
AnnaBridge 167:e84263d55307 1586 {
AnnaBridge 167:e84263d55307 1587 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
AnnaBridge 167:e84263d55307 1588 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 1589 HAL_MMC_AbortCallback(hmmc);
AnnaBridge 167:e84263d55307 1590 }
AnnaBridge 167:e84263d55307 1591 }
AnnaBridge 167:e84263d55307 1592 else if((hmmc->Context & MMC_CONTEXT_IT) != RESET)
AnnaBridge 167:e84263d55307 1593 {
AnnaBridge 167:e84263d55307 1594 /* Set the MMC state to ready to be able to start again the process */
AnnaBridge 167:e84263d55307 1595 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 1596 HAL_MMC_ErrorCallback(hmmc);
AnnaBridge 167:e84263d55307 1597 }
AnnaBridge 167:e84263d55307 1598 }
AnnaBridge 167:e84263d55307 1599 #endif /* SDIO_STA_STBITERR */
AnnaBridge 167:e84263d55307 1600 }
AnnaBridge 167:e84263d55307 1601
AnnaBridge 167:e84263d55307 1602 /**
AnnaBridge 167:e84263d55307 1603 * @brief return the MMC state
AnnaBridge 167:e84263d55307 1604 * @param hmmc: Pointer to mmc handle
AnnaBridge 167:e84263d55307 1605 * @retval HAL state
AnnaBridge 167:e84263d55307 1606 */
AnnaBridge 167:e84263d55307 1607 HAL_MMC_StateTypeDef HAL_MMC_GetState(MMC_HandleTypeDef *hmmc)
AnnaBridge 167:e84263d55307 1608 {
AnnaBridge 167:e84263d55307 1609 return hmmc->State;
AnnaBridge 167:e84263d55307 1610 }
AnnaBridge 167:e84263d55307 1611
AnnaBridge 167:e84263d55307 1612 /**
AnnaBridge 167:e84263d55307 1613 * @brief Return the MMC error code
AnnaBridge 167:e84263d55307 1614 * @param hmmc : Pointer to a MMC_HandleTypeDef structure that contains
AnnaBridge 167:e84263d55307 1615 * the configuration information.
AnnaBridge 167:e84263d55307 1616 * @retval MMC Error Code
AnnaBridge 167:e84263d55307 1617 */
AnnaBridge 167:e84263d55307 1618 uint32_t HAL_MMC_GetError(MMC_HandleTypeDef *hmmc)
AnnaBridge 167:e84263d55307 1619 {
AnnaBridge 167:e84263d55307 1620 return hmmc->ErrorCode;
AnnaBridge 167:e84263d55307 1621 }
AnnaBridge 167:e84263d55307 1622
AnnaBridge 167:e84263d55307 1623 /**
AnnaBridge 167:e84263d55307 1624 * @brief Tx Transfer completed callbacks
AnnaBridge 167:e84263d55307 1625 * @param hmmc: Pointer to MMC handle
AnnaBridge 167:e84263d55307 1626 * @retval None
AnnaBridge 167:e84263d55307 1627 */
AnnaBridge 167:e84263d55307 1628 __weak void HAL_MMC_TxCpltCallback(MMC_HandleTypeDef *hmmc)
AnnaBridge 167:e84263d55307 1629 {
AnnaBridge 167:e84263d55307 1630 /* Prevent unused argument(s) compilation warning */
AnnaBridge 167:e84263d55307 1631 UNUSED(hmmc);
AnnaBridge 167:e84263d55307 1632
AnnaBridge 167:e84263d55307 1633 /* NOTE : This function should not be modified, when the callback is needed,
AnnaBridge 167:e84263d55307 1634 the HAL_MMC_TxCpltCallback can be implemented in the user file
AnnaBridge 167:e84263d55307 1635 */
AnnaBridge 167:e84263d55307 1636 }
AnnaBridge 167:e84263d55307 1637
AnnaBridge 167:e84263d55307 1638 /**
AnnaBridge 167:e84263d55307 1639 * @brief Rx Transfer completed callbacks
AnnaBridge 167:e84263d55307 1640 * @param hmmc: Pointer MMC handle
AnnaBridge 167:e84263d55307 1641 * @retval None
AnnaBridge 167:e84263d55307 1642 */
AnnaBridge 167:e84263d55307 1643 __weak void HAL_MMC_RxCpltCallback(MMC_HandleTypeDef *hmmc)
AnnaBridge 167:e84263d55307 1644 {
AnnaBridge 167:e84263d55307 1645 /* Prevent unused argument(s) compilation warning */
AnnaBridge 167:e84263d55307 1646 UNUSED(hmmc);
AnnaBridge 167:e84263d55307 1647
AnnaBridge 167:e84263d55307 1648 /* NOTE : This function should not be modified, when the callback is needed,
AnnaBridge 167:e84263d55307 1649 the HAL_MMC_RxCpltCallback can be implemented in the user file
AnnaBridge 167:e84263d55307 1650 */
AnnaBridge 167:e84263d55307 1651 }
AnnaBridge 167:e84263d55307 1652
AnnaBridge 167:e84263d55307 1653 /**
AnnaBridge 167:e84263d55307 1654 * @brief MMC error callbacks
AnnaBridge 167:e84263d55307 1655 * @param hmmc: Pointer MMC handle
AnnaBridge 167:e84263d55307 1656 * @retval None
AnnaBridge 167:e84263d55307 1657 */
AnnaBridge 167:e84263d55307 1658 __weak void HAL_MMC_ErrorCallback(MMC_HandleTypeDef *hmmc)
AnnaBridge 167:e84263d55307 1659 {
AnnaBridge 167:e84263d55307 1660 /* Prevent unused argument(s) compilation warning */
AnnaBridge 167:e84263d55307 1661 UNUSED(hmmc);
AnnaBridge 167:e84263d55307 1662
AnnaBridge 167:e84263d55307 1663 /* NOTE : This function should not be modified, when the callback is needed,
AnnaBridge 167:e84263d55307 1664 the HAL_MMC_ErrorCallback can be implemented in the user file
AnnaBridge 167:e84263d55307 1665 */
AnnaBridge 167:e84263d55307 1666 }
AnnaBridge 167:e84263d55307 1667
AnnaBridge 167:e84263d55307 1668 /**
AnnaBridge 167:e84263d55307 1669 * @brief MMC Abort callbacks
AnnaBridge 167:e84263d55307 1670 * @param hmmc: Pointer MMC handle
AnnaBridge 167:e84263d55307 1671 * @retval None
AnnaBridge 167:e84263d55307 1672 */
AnnaBridge 167:e84263d55307 1673 __weak void HAL_MMC_AbortCallback(MMC_HandleTypeDef *hmmc)
AnnaBridge 167:e84263d55307 1674 {
AnnaBridge 167:e84263d55307 1675 /* Prevent unused argument(s) compilation warning */
AnnaBridge 167:e84263d55307 1676 UNUSED(hmmc);
AnnaBridge 167:e84263d55307 1677
AnnaBridge 167:e84263d55307 1678 /* NOTE : This function should not be modified, when the callback is needed,
AnnaBridge 167:e84263d55307 1679 the HAL_MMC_ErrorCallback can be implemented in the user file
AnnaBridge 167:e84263d55307 1680 */
AnnaBridge 167:e84263d55307 1681 }
AnnaBridge 167:e84263d55307 1682
AnnaBridge 167:e84263d55307 1683
AnnaBridge 167:e84263d55307 1684 /**
AnnaBridge 167:e84263d55307 1685 * @}
AnnaBridge 167:e84263d55307 1686 */
AnnaBridge 167:e84263d55307 1687
AnnaBridge 167:e84263d55307 1688 /** @addtogroup MMC_Exported_Functions_Group3
AnnaBridge 167:e84263d55307 1689 * @brief management functions
AnnaBridge 167:e84263d55307 1690 *
AnnaBridge 167:e84263d55307 1691 @verbatim
AnnaBridge 167:e84263d55307 1692 ==============================================================================
AnnaBridge 167:e84263d55307 1693 ##### Peripheral Control functions #####
AnnaBridge 167:e84263d55307 1694 ==============================================================================
AnnaBridge 167:e84263d55307 1695 [..]
AnnaBridge 167:e84263d55307 1696 This subsection provides a set of functions allowing to control the MMC card
AnnaBridge 167:e84263d55307 1697 operations and get the related information
AnnaBridge 167:e84263d55307 1698
AnnaBridge 167:e84263d55307 1699 @endverbatim
AnnaBridge 167:e84263d55307 1700 * @{
AnnaBridge 167:e84263d55307 1701 */
AnnaBridge 167:e84263d55307 1702
AnnaBridge 167:e84263d55307 1703 /**
AnnaBridge 167:e84263d55307 1704 * @brief Returns information the information of the card which are stored on
AnnaBridge 167:e84263d55307 1705 * the CID register.
AnnaBridge 167:e84263d55307 1706 * @param hmmc: Pointer to MMC handle
AnnaBridge 167:e84263d55307 1707 * @param pCID: Pointer to a HAL_MMC_CIDTypedef structure that
AnnaBridge 167:e84263d55307 1708 * contains all CID register parameters
AnnaBridge 167:e84263d55307 1709 * @retval HAL status
AnnaBridge 167:e84263d55307 1710 */
AnnaBridge 167:e84263d55307 1711 HAL_StatusTypeDef HAL_MMC_GetCardCID(MMC_HandleTypeDef *hmmc, HAL_MMC_CardCIDTypeDef *pCID)
AnnaBridge 167:e84263d55307 1712 {
AnnaBridge 167:e84263d55307 1713 uint32_t tmp = 0U;
AnnaBridge 167:e84263d55307 1714
AnnaBridge 167:e84263d55307 1715 /* Byte 0 */
AnnaBridge 167:e84263d55307 1716 tmp = (uint8_t)((hmmc->CID[0U] & 0xFF000000U) >> 24U);
AnnaBridge 167:e84263d55307 1717 pCID->ManufacturerID = tmp;
AnnaBridge 167:e84263d55307 1718
AnnaBridge 167:e84263d55307 1719 /* Byte 1 */
AnnaBridge 167:e84263d55307 1720 tmp = (uint8_t)((hmmc->CID[0U] & 0x00FF0000U) >> 16U);
AnnaBridge 167:e84263d55307 1721 pCID->OEM_AppliID = tmp << 8U;
AnnaBridge 167:e84263d55307 1722
AnnaBridge 167:e84263d55307 1723 /* Byte 2 */
AnnaBridge 167:e84263d55307 1724 tmp = (uint8_t)((hmmc->CID[0U] & 0x000000FF00U) >> 8U);
AnnaBridge 167:e84263d55307 1725 pCID->OEM_AppliID |= tmp;
AnnaBridge 167:e84263d55307 1726
AnnaBridge 167:e84263d55307 1727 /* Byte 3 */
AnnaBridge 167:e84263d55307 1728 tmp = (uint8_t)(hmmc->CID[0U] & 0x000000FFU);
AnnaBridge 167:e84263d55307 1729 pCID->ProdName1 = tmp << 24U;
AnnaBridge 167:e84263d55307 1730
AnnaBridge 167:e84263d55307 1731 /* Byte 4 */
AnnaBridge 167:e84263d55307 1732 tmp = (uint8_t)((hmmc->CID[1U] & 0xFF000000U) >> 24U);
AnnaBridge 167:e84263d55307 1733 pCID->ProdName1 |= tmp << 16U;
AnnaBridge 167:e84263d55307 1734
AnnaBridge 167:e84263d55307 1735 /* Byte 5 */
AnnaBridge 167:e84263d55307 1736 tmp = (uint8_t)((hmmc->CID[1U] & 0x00FF0000U) >> 16U);
AnnaBridge 167:e84263d55307 1737 pCID->ProdName1 |= tmp << 8U;
AnnaBridge 167:e84263d55307 1738
AnnaBridge 167:e84263d55307 1739 /* Byte 6 */
AnnaBridge 167:e84263d55307 1740 tmp = (uint8_t)((hmmc->CID[1U] & 0x0000FF00U) >> 8U);
AnnaBridge 167:e84263d55307 1741 pCID->ProdName1 |= tmp;
AnnaBridge 167:e84263d55307 1742
AnnaBridge 167:e84263d55307 1743 /* Byte 7 */
AnnaBridge 167:e84263d55307 1744 tmp = (uint8_t)(hmmc->CID[1U] & 0x000000FFU);
AnnaBridge 167:e84263d55307 1745 pCID->ProdName2 = tmp;
AnnaBridge 167:e84263d55307 1746
AnnaBridge 167:e84263d55307 1747 /* Byte 8 */
AnnaBridge 167:e84263d55307 1748 tmp = (uint8_t)((hmmc->CID[2U] & 0xFF000000U) >> 24U);
AnnaBridge 167:e84263d55307 1749 pCID->ProdRev = tmp;
AnnaBridge 167:e84263d55307 1750
AnnaBridge 167:e84263d55307 1751 /* Byte 9 */
AnnaBridge 167:e84263d55307 1752 tmp = (uint8_t)((hmmc->CID[2U] & 0x00FF0000U) >> 16U);
AnnaBridge 167:e84263d55307 1753 pCID->ProdSN = tmp << 24U;
AnnaBridge 167:e84263d55307 1754
AnnaBridge 167:e84263d55307 1755 /* Byte 10 */
AnnaBridge 167:e84263d55307 1756 tmp = (uint8_t)((hmmc->CID[2U] & 0x0000FF00U) >> 8U);
AnnaBridge 167:e84263d55307 1757 pCID->ProdSN |= tmp << 16U;
AnnaBridge 167:e84263d55307 1758
AnnaBridge 167:e84263d55307 1759 /* Byte 11 */
AnnaBridge 167:e84263d55307 1760 tmp = (uint8_t)(hmmc->CID[2U] & 0x000000FFU);
AnnaBridge 167:e84263d55307 1761 pCID->ProdSN |= tmp << 8U;
AnnaBridge 167:e84263d55307 1762
AnnaBridge 167:e84263d55307 1763 /* Byte 12 */
AnnaBridge 167:e84263d55307 1764 tmp = (uint8_t)((hmmc->CID[3U] & 0xFF000000U) >> 24U);
AnnaBridge 167:e84263d55307 1765 pCID->ProdSN |= tmp;
AnnaBridge 167:e84263d55307 1766
AnnaBridge 167:e84263d55307 1767 /* Byte 13 */
AnnaBridge 167:e84263d55307 1768 tmp = (uint8_t)((hmmc->CID[3U] & 0x00FF0000U) >> 16U);
AnnaBridge 167:e84263d55307 1769 pCID->Reserved1 |= (tmp & 0xF0U) >> 4U;
AnnaBridge 167:e84263d55307 1770 pCID->ManufactDate = (tmp & 0x0FU) << 8U;
AnnaBridge 167:e84263d55307 1771
AnnaBridge 167:e84263d55307 1772 /* Byte 14 */
AnnaBridge 167:e84263d55307 1773 tmp = (uint8_t)((hmmc->CID[3U] & 0x0000FF00U) >> 8U);
AnnaBridge 167:e84263d55307 1774 pCID->ManufactDate |= tmp;
AnnaBridge 167:e84263d55307 1775
AnnaBridge 167:e84263d55307 1776 /* Byte 15 */
AnnaBridge 167:e84263d55307 1777 tmp = (uint8_t)(hmmc->CID[3U] & 0x000000FFU);
AnnaBridge 167:e84263d55307 1778 pCID->CID_CRC = (tmp & 0xFEU) >> 1U;
AnnaBridge 167:e84263d55307 1779 pCID->Reserved2 = 1U;
AnnaBridge 167:e84263d55307 1780
AnnaBridge 167:e84263d55307 1781 return HAL_OK;
AnnaBridge 167:e84263d55307 1782 }
AnnaBridge 167:e84263d55307 1783
AnnaBridge 167:e84263d55307 1784 /**
AnnaBridge 167:e84263d55307 1785 * @brief Returns information the information of the card which are stored on
AnnaBridge 167:e84263d55307 1786 * the CSD register.
AnnaBridge 167:e84263d55307 1787 * @param hmmc: Pointer to MMC handle
AnnaBridge 167:e84263d55307 1788 * @param pCSD: Pointer to a HAL_MMC_CardInfoTypeDef structure that
AnnaBridge 167:e84263d55307 1789 * contains all CSD register parameters
AnnaBridge 167:e84263d55307 1790 * @retval HAL status
AnnaBridge 167:e84263d55307 1791 */
AnnaBridge 167:e84263d55307 1792 HAL_StatusTypeDef HAL_MMC_GetCardCSD(MMC_HandleTypeDef *hmmc, HAL_MMC_CardCSDTypeDef *pCSD)
AnnaBridge 167:e84263d55307 1793 {
AnnaBridge 167:e84263d55307 1794 uint32_t tmp = 0U;
AnnaBridge 167:e84263d55307 1795
AnnaBridge 167:e84263d55307 1796 /* Byte 0 */
AnnaBridge 167:e84263d55307 1797 tmp = (hmmc->CSD[0U] & 0xFF000000U) >> 24U;
AnnaBridge 167:e84263d55307 1798 pCSD->CSDStruct = (uint8_t)((tmp & 0xC0U) >> 6U);
AnnaBridge 167:e84263d55307 1799 pCSD->SysSpecVersion = (uint8_t)((tmp & 0x3CU) >> 2U);
AnnaBridge 167:e84263d55307 1800 pCSD->Reserved1 = tmp & 0x03U;
AnnaBridge 167:e84263d55307 1801
AnnaBridge 167:e84263d55307 1802 /* Byte 1 */
AnnaBridge 167:e84263d55307 1803 tmp = (hmmc->CSD[0U] & 0x00FF0000U) >> 16U;
AnnaBridge 167:e84263d55307 1804 pCSD->TAAC = (uint8_t)tmp;
AnnaBridge 167:e84263d55307 1805
AnnaBridge 167:e84263d55307 1806 /* Byte 2 */
AnnaBridge 167:e84263d55307 1807 tmp = (hmmc->CSD[0U] & 0x0000FF00U) >> 8U;
AnnaBridge 167:e84263d55307 1808 pCSD->NSAC = (uint8_t)tmp;
AnnaBridge 167:e84263d55307 1809
AnnaBridge 167:e84263d55307 1810 /* Byte 3 */
AnnaBridge 167:e84263d55307 1811 tmp = hmmc->CSD[0U] & 0x000000FFU;
AnnaBridge 167:e84263d55307 1812 pCSD->MaxBusClkFrec = (uint8_t)tmp;
AnnaBridge 167:e84263d55307 1813
AnnaBridge 167:e84263d55307 1814 /* Byte 4 */
AnnaBridge 167:e84263d55307 1815 tmp = (hmmc->CSD[1U] & 0xFF000000U) >> 24U;
AnnaBridge 167:e84263d55307 1816 pCSD->CardComdClasses = (uint16_t)(tmp << 4U);
AnnaBridge 167:e84263d55307 1817
AnnaBridge 167:e84263d55307 1818 /* Byte 5 */
AnnaBridge 167:e84263d55307 1819 tmp = (hmmc->CSD[1U] & 0x00FF0000U) >> 16U;
AnnaBridge 167:e84263d55307 1820 pCSD->CardComdClasses |= (uint16_t)((tmp & 0xF0U) >> 4U);
AnnaBridge 167:e84263d55307 1821 pCSD->RdBlockLen = (uint8_t)(tmp & 0x0FU);
AnnaBridge 167:e84263d55307 1822
AnnaBridge 167:e84263d55307 1823 /* Byte 6 */
AnnaBridge 167:e84263d55307 1824 tmp = (hmmc->CSD[1U] & 0x0000FF00U) >> 8U;
AnnaBridge 167:e84263d55307 1825 pCSD->PartBlockRead = (uint8_t)((tmp & 0x80U) >> 7U);
AnnaBridge 167:e84263d55307 1826 pCSD->WrBlockMisalign = (uint8_t)((tmp & 0x40U) >> 6U);
AnnaBridge 167:e84263d55307 1827 pCSD->RdBlockMisalign = (uint8_t)((tmp & 0x20U) >> 5U);
AnnaBridge 167:e84263d55307 1828 pCSD->DSRImpl = (uint8_t)((tmp & 0x10U) >> 4U);
AnnaBridge 167:e84263d55307 1829 pCSD->Reserved2 = 0; /*!< Reserved */
AnnaBridge 167:e84263d55307 1830
AnnaBridge 167:e84263d55307 1831 pCSD->DeviceSize = (tmp & 0x03U) << 10U;
AnnaBridge 167:e84263d55307 1832
AnnaBridge 167:e84263d55307 1833 /* Byte 7 */
AnnaBridge 167:e84263d55307 1834 tmp = (uint8_t)(hmmc->CSD[1U] & 0x000000FFU);
AnnaBridge 167:e84263d55307 1835 pCSD->DeviceSize |= (tmp) << 2U;
AnnaBridge 167:e84263d55307 1836
AnnaBridge 167:e84263d55307 1837 /* Byte 8 */
AnnaBridge 167:e84263d55307 1838 tmp = (uint8_t)((hmmc->CSD[2U] & 0xFF000000U) >> 24U);
AnnaBridge 167:e84263d55307 1839 pCSD->DeviceSize |= (tmp & 0xC0U) >> 6U;
AnnaBridge 167:e84263d55307 1840
AnnaBridge 167:e84263d55307 1841 pCSD->MaxRdCurrentVDDMin = (tmp & 0x38U) >> 3U;
AnnaBridge 167:e84263d55307 1842 pCSD->MaxRdCurrentVDDMax = (tmp & 0x07U);
AnnaBridge 167:e84263d55307 1843
AnnaBridge 167:e84263d55307 1844 /* Byte 9 */
AnnaBridge 167:e84263d55307 1845 tmp = (uint8_t)((hmmc->CSD[2U] & 0x00FF0000U) >> 16U);
AnnaBridge 167:e84263d55307 1846 pCSD->MaxWrCurrentVDDMin = (tmp & 0xE0U) >> 5U;
AnnaBridge 167:e84263d55307 1847 pCSD->MaxWrCurrentVDDMax = (tmp & 0x1CU) >> 2U;
AnnaBridge 167:e84263d55307 1848 pCSD->DeviceSizeMul = (tmp & 0x03U) << 1U;
AnnaBridge 167:e84263d55307 1849 /* Byte 10 */
AnnaBridge 167:e84263d55307 1850 tmp = (uint8_t)((hmmc->CSD[2] & 0x0000FF00U) >> 8U);
AnnaBridge 167:e84263d55307 1851 pCSD->DeviceSizeMul |= (tmp & 0x80U) >> 7U;
AnnaBridge 167:e84263d55307 1852
AnnaBridge 167:e84263d55307 1853 hmmc->MmcCard.BlockNbr = (pCSD->DeviceSize + 1U) ;
AnnaBridge 167:e84263d55307 1854 hmmc->MmcCard.BlockNbr *= (1U << (pCSD->DeviceSizeMul + 2U));
AnnaBridge 167:e84263d55307 1855 hmmc->MmcCard.BlockSize = 1U << (pCSD->RdBlockLen);
AnnaBridge 167:e84263d55307 1856
AnnaBridge 167:e84263d55307 1857 hmmc->MmcCard.LogBlockNbr = (hmmc->MmcCard.BlockNbr) * ((hmmc->MmcCard.BlockSize) / 512U);
AnnaBridge 167:e84263d55307 1858 hmmc->MmcCard.LogBlockSize = 512U;
AnnaBridge 167:e84263d55307 1859
AnnaBridge 167:e84263d55307 1860 pCSD->EraseGrSize = (tmp & 0x40U) >> 6U;
AnnaBridge 167:e84263d55307 1861 pCSD->EraseGrMul = (tmp & 0x3FU) << 1U;
AnnaBridge 167:e84263d55307 1862
AnnaBridge 167:e84263d55307 1863 /* Byte 11 */
AnnaBridge 167:e84263d55307 1864 tmp = (uint8_t)(hmmc->CSD[2U] & 0x000000FFU);
AnnaBridge 167:e84263d55307 1865 pCSD->EraseGrMul |= (tmp & 0x80U) >> 7U;
AnnaBridge 167:e84263d55307 1866 pCSD->WrProtectGrSize = (tmp & 0x7FU);
AnnaBridge 167:e84263d55307 1867
AnnaBridge 167:e84263d55307 1868 /* Byte 12 */
AnnaBridge 167:e84263d55307 1869 tmp = (uint8_t)((hmmc->CSD[3U] & 0xFF000000U) >> 24U);
AnnaBridge 167:e84263d55307 1870 pCSD->WrProtectGrEnable = (tmp & 0x80U) >> 7U;
AnnaBridge 167:e84263d55307 1871 pCSD->ManDeflECC = (tmp & 0x60U) >> 5U;
AnnaBridge 167:e84263d55307 1872 pCSD->WrSpeedFact = (tmp & 0x1CU) >> 2U;
AnnaBridge 167:e84263d55307 1873 pCSD->MaxWrBlockLen = (tmp & 0x03U) << 2U;
AnnaBridge 167:e84263d55307 1874
AnnaBridge 167:e84263d55307 1875 /* Byte 13 */
AnnaBridge 167:e84263d55307 1876 tmp = (uint8_t)((hmmc->CSD[3U] & 0x00FF0000U) >> 16U);
AnnaBridge 167:e84263d55307 1877 pCSD->MaxWrBlockLen |= (tmp & 0xC0U) >> 6U;
AnnaBridge 167:e84263d55307 1878 pCSD->WriteBlockPaPartial = (tmp & 0x20U) >> 5U;
AnnaBridge 167:e84263d55307 1879 pCSD->Reserved3 = 0U;
AnnaBridge 167:e84263d55307 1880 pCSD->ContentProtectAppli = (tmp & 0x01U);
AnnaBridge 167:e84263d55307 1881
AnnaBridge 167:e84263d55307 1882 /* Byte 14 */
AnnaBridge 167:e84263d55307 1883 tmp = (uint8_t)((hmmc->CSD[3U] & 0x0000FF00U) >> 8U);
AnnaBridge 167:e84263d55307 1884 pCSD->FileFormatGrouop = (tmp & 0x80U) >> 7U;
AnnaBridge 167:e84263d55307 1885 pCSD->CopyFlag = (tmp & 0x40U) >> 6U;
AnnaBridge 167:e84263d55307 1886 pCSD->PermWrProtect = (tmp & 0x20U) >> 5U;
AnnaBridge 167:e84263d55307 1887 pCSD->TempWrProtect = (tmp & 0x10U) >> 4U;
AnnaBridge 167:e84263d55307 1888 pCSD->FileFormat = (tmp & 0x0CU) >> 2U;
AnnaBridge 167:e84263d55307 1889 pCSD->ECC = (tmp & 0x03U);
AnnaBridge 167:e84263d55307 1890
AnnaBridge 167:e84263d55307 1891 /* Byte 15 */
AnnaBridge 167:e84263d55307 1892 tmp = (uint8_t)(hmmc->CSD[3U] & 0x000000FFU);
AnnaBridge 167:e84263d55307 1893 pCSD->CSD_CRC = (tmp & 0xFEU) >> 1U;
AnnaBridge 167:e84263d55307 1894 pCSD->Reserved4 = 1U;
AnnaBridge 167:e84263d55307 1895
AnnaBridge 167:e84263d55307 1896 return HAL_OK;
AnnaBridge 167:e84263d55307 1897 }
AnnaBridge 167:e84263d55307 1898
AnnaBridge 167:e84263d55307 1899 /**
AnnaBridge 167:e84263d55307 1900 * @brief Gets the MMC card info.
AnnaBridge 167:e84263d55307 1901 * @param hmmc: Pointer to MMC handle
AnnaBridge 167:e84263d55307 1902 * @param pCardInfo: Pointer to the HAL_MMC_CardInfoTypeDef structure that
AnnaBridge 167:e84263d55307 1903 * will contain the MMC card status information
AnnaBridge 167:e84263d55307 1904 * @retval HAL status
AnnaBridge 167:e84263d55307 1905 */
AnnaBridge 167:e84263d55307 1906 HAL_StatusTypeDef HAL_MMC_GetCardInfo(MMC_HandleTypeDef *hmmc, HAL_MMC_CardInfoTypeDef *pCardInfo)
AnnaBridge 167:e84263d55307 1907 {
AnnaBridge 167:e84263d55307 1908 pCardInfo->CardType = (uint32_t)(hmmc->MmcCard.CardType);
AnnaBridge 167:e84263d55307 1909 pCardInfo->Class = (uint32_t)(hmmc->MmcCard.Class);
AnnaBridge 167:e84263d55307 1910 pCardInfo->RelCardAdd = (uint32_t)(hmmc->MmcCard.RelCardAdd);
AnnaBridge 167:e84263d55307 1911 pCardInfo->BlockNbr = (uint32_t)(hmmc->MmcCard.BlockNbr);
AnnaBridge 167:e84263d55307 1912 pCardInfo->BlockSize = (uint32_t)(hmmc->MmcCard.BlockSize);
AnnaBridge 167:e84263d55307 1913 pCardInfo->LogBlockNbr = (uint32_t)(hmmc->MmcCard.LogBlockNbr);
AnnaBridge 167:e84263d55307 1914 pCardInfo->LogBlockSize = (uint32_t)(hmmc->MmcCard.LogBlockSize);
AnnaBridge 167:e84263d55307 1915
AnnaBridge 167:e84263d55307 1916 return HAL_OK;
AnnaBridge 167:e84263d55307 1917 }
AnnaBridge 167:e84263d55307 1918
AnnaBridge 167:e84263d55307 1919 /**
AnnaBridge 167:e84263d55307 1920 * @brief Enables wide bus operation for the requested card if supported by
AnnaBridge 167:e84263d55307 1921 * card.
AnnaBridge 167:e84263d55307 1922 * @param hmmc: Pointer to MMC handle
AnnaBridge 167:e84263d55307 1923 * @param WideMode: Specifies the MMC card wide bus mode
AnnaBridge 167:e84263d55307 1924 * This parameter can be one of the following values:
AnnaBridge 167:e84263d55307 1925 * @arg SDIO_BUS_WIDE_8B: 8-bit data transfer
AnnaBridge 167:e84263d55307 1926 * @arg SDIO_BUS_WIDE_4B: 4-bit data transfer
AnnaBridge 167:e84263d55307 1927 * @arg SDIO_BUS_WIDE_1B: 1-bit data transfer
AnnaBridge 167:e84263d55307 1928 * @retval HAL status
AnnaBridge 167:e84263d55307 1929 */
AnnaBridge 167:e84263d55307 1930 HAL_StatusTypeDef HAL_MMC_ConfigWideBusOperation(MMC_HandleTypeDef *hmmc, uint32_t WideMode)
AnnaBridge 167:e84263d55307 1931 {
AnnaBridge 167:e84263d55307 1932 __IO uint32_t count = 0U;
AnnaBridge 167:e84263d55307 1933 SDIO_InitTypeDef Init;
AnnaBridge 167:e84263d55307 1934 uint32_t errorstate = HAL_MMC_ERROR_NONE;
AnnaBridge 167:e84263d55307 1935 uint32_t response = 0U, busy = 0U;
AnnaBridge 167:e84263d55307 1936
AnnaBridge 167:e84263d55307 1937 /* Check the parameters */
AnnaBridge 167:e84263d55307 1938 assert_param(IS_SDIO_BUS_WIDE(WideMode));
AnnaBridge 167:e84263d55307 1939
AnnaBridge 167:e84263d55307 1940 /* Chnage Satte */
AnnaBridge 167:e84263d55307 1941 hmmc->State = HAL_MMC_STATE_BUSY;
AnnaBridge 167:e84263d55307 1942
AnnaBridge 167:e84263d55307 1943 /* Update Clock for Bus mode update */
AnnaBridge 167:e84263d55307 1944 Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;
AnnaBridge 167:e84263d55307 1945 Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;
AnnaBridge 167:e84263d55307 1946 Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;
AnnaBridge 167:e84263d55307 1947 Init.BusWide = WideMode;
AnnaBridge 167:e84263d55307 1948 Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
AnnaBridge 167:e84263d55307 1949 Init.ClockDiv = SDIO_INIT_CLK_DIV;
AnnaBridge 167:e84263d55307 1950 /* Initialize SDIO*/
AnnaBridge 167:e84263d55307 1951 SDIO_Init(hmmc->Instance, Init);
AnnaBridge 167:e84263d55307 1952
AnnaBridge 167:e84263d55307 1953 if(WideMode == SDIO_BUS_WIDE_8B)
AnnaBridge 167:e84263d55307 1954 {
AnnaBridge 167:e84263d55307 1955 errorstate = SDMMC_CmdSwitch(hmmc->Instance, 0x03B70200U);
AnnaBridge 167:e84263d55307 1956 if(errorstate != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 1957 {
AnnaBridge 167:e84263d55307 1958 hmmc->ErrorCode |= errorstate;
AnnaBridge 167:e84263d55307 1959 }
AnnaBridge 167:e84263d55307 1960 }
AnnaBridge 167:e84263d55307 1961 else if(WideMode == SDIO_BUS_WIDE_4B)
AnnaBridge 167:e84263d55307 1962 {
AnnaBridge 167:e84263d55307 1963 errorstate = SDMMC_CmdSwitch(hmmc->Instance, 0x03B70100U);
AnnaBridge 167:e84263d55307 1964 if(errorstate != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 1965 {
AnnaBridge 167:e84263d55307 1966 hmmc->ErrorCode |= errorstate;
AnnaBridge 167:e84263d55307 1967 }
AnnaBridge 167:e84263d55307 1968 }
AnnaBridge 167:e84263d55307 1969 else if(WideMode == SDIO_BUS_WIDE_1B)
AnnaBridge 167:e84263d55307 1970 {
AnnaBridge 167:e84263d55307 1971 errorstate = SDMMC_CmdSwitch(hmmc->Instance, 0x03B70000U);
AnnaBridge 167:e84263d55307 1972 if(errorstate != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 1973 {
AnnaBridge 167:e84263d55307 1974 hmmc->ErrorCode |= errorstate;
AnnaBridge 167:e84263d55307 1975 }
AnnaBridge 167:e84263d55307 1976 }
AnnaBridge 167:e84263d55307 1977 else
AnnaBridge 167:e84263d55307 1978 {
AnnaBridge 167:e84263d55307 1979 /* WideMode is not a valid argument*/
AnnaBridge 167:e84263d55307 1980 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
AnnaBridge 167:e84263d55307 1981 }
AnnaBridge 167:e84263d55307 1982
AnnaBridge 167:e84263d55307 1983 /* Check for switch error and violation of the trial number of sending CMD 13 */
AnnaBridge 167:e84263d55307 1984 while(busy == 0U)
AnnaBridge 167:e84263d55307 1985 {
AnnaBridge 167:e84263d55307 1986 if(count++ == SDMMC_MAX_TRIAL)
AnnaBridge 167:e84263d55307 1987 {
AnnaBridge 167:e84263d55307 1988 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 1989 hmmc->ErrorCode |= HAL_MMC_ERROR_REQUEST_NOT_APPLICABLE;
AnnaBridge 167:e84263d55307 1990 return HAL_ERROR;
AnnaBridge 167:e84263d55307 1991 }
AnnaBridge 167:e84263d55307 1992
AnnaBridge 167:e84263d55307 1993 /* While card is not ready for data and trial number for sending CMD13 is not exceeded */
AnnaBridge 167:e84263d55307 1994 errorstate = SDMMC_CmdSendStatus(hmmc->Instance, (uint32_t)(((uint32_t)hmmc->MmcCard.RelCardAdd) << 16U));
AnnaBridge 167:e84263d55307 1995 if(errorstate != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 1996 {
AnnaBridge 167:e84263d55307 1997 hmmc->ErrorCode |= errorstate;
AnnaBridge 167:e84263d55307 1998 }
AnnaBridge 167:e84263d55307 1999
AnnaBridge 167:e84263d55307 2000 /* Get command response */
AnnaBridge 167:e84263d55307 2001 response = SDIO_GetResponse(hmmc->Instance, SDIO_RESP1);
AnnaBridge 167:e84263d55307 2002
AnnaBridge 167:e84263d55307 2003 /* Get operating voltage*/
AnnaBridge 167:e84263d55307 2004 busy = (((response >> 7U) == 1U) ? 0U : 1U);
AnnaBridge 167:e84263d55307 2005 }
AnnaBridge 167:e84263d55307 2006
AnnaBridge 167:e84263d55307 2007 /* While card is not ready for data and trial number for sending CMD13 is not exceeded */
AnnaBridge 167:e84263d55307 2008 count = SDMMC_DATATIMEOUT;
AnnaBridge 167:e84263d55307 2009 while((response & 0x00000100U) == 0U)
AnnaBridge 167:e84263d55307 2010 {
AnnaBridge 167:e84263d55307 2011 if(count-- == 0U)
AnnaBridge 167:e84263d55307 2012 {
AnnaBridge 167:e84263d55307 2013 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 2014 hmmc->ErrorCode |= HAL_MMC_ERROR_REQUEST_NOT_APPLICABLE;
AnnaBridge 167:e84263d55307 2015 return HAL_ERROR;
AnnaBridge 167:e84263d55307 2016 }
AnnaBridge 167:e84263d55307 2017
AnnaBridge 167:e84263d55307 2018 /* While card is not ready for data and trial number for sending CMD13 is not exceeded */
AnnaBridge 167:e84263d55307 2019 errorstate = SDMMC_CmdSendStatus(hmmc->Instance, (uint32_t)(((uint32_t)hmmc->MmcCard.RelCardAdd) << 16U));
AnnaBridge 167:e84263d55307 2020 if(errorstate != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 2021 {
AnnaBridge 167:e84263d55307 2022 hmmc->ErrorCode |= errorstate;
AnnaBridge 167:e84263d55307 2023 }
AnnaBridge 167:e84263d55307 2024
AnnaBridge 167:e84263d55307 2025 /* Get command response */
AnnaBridge 167:e84263d55307 2026 response = SDIO_GetResponse(hmmc->Instance, SDIO_RESP1);
AnnaBridge 167:e84263d55307 2027 }
AnnaBridge 167:e84263d55307 2028
AnnaBridge 167:e84263d55307 2029 if(hmmc->ErrorCode != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 2030 {
AnnaBridge 167:e84263d55307 2031 /* Clear all the static flags */
AnnaBridge 167:e84263d55307 2032 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 2033 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 2034 return HAL_ERROR;
AnnaBridge 167:e84263d55307 2035 }
AnnaBridge 167:e84263d55307 2036 else
AnnaBridge 167:e84263d55307 2037 {
AnnaBridge 167:e84263d55307 2038 /* Configure the SDIO peripheral */
AnnaBridge 167:e84263d55307 2039 Init.ClockEdge = hmmc->Init.ClockEdge;
AnnaBridge 167:e84263d55307 2040 Init.ClockBypass = hmmc->Init.ClockBypass;
AnnaBridge 167:e84263d55307 2041 Init.ClockPowerSave = hmmc->Init.ClockPowerSave;
AnnaBridge 167:e84263d55307 2042 Init.BusWide = WideMode;
AnnaBridge 167:e84263d55307 2043 Init.HardwareFlowControl = hmmc->Init.HardwareFlowControl;
AnnaBridge 167:e84263d55307 2044 Init.ClockDiv = hmmc->Init.ClockDiv;
AnnaBridge 167:e84263d55307 2045 SDIO_Init(hmmc->Instance, Init);
AnnaBridge 167:e84263d55307 2046 }
AnnaBridge 167:e84263d55307 2047
AnnaBridge 167:e84263d55307 2048 /* Change State */
AnnaBridge 167:e84263d55307 2049 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 2050
AnnaBridge 167:e84263d55307 2051 return HAL_OK;
AnnaBridge 167:e84263d55307 2052 }
AnnaBridge 167:e84263d55307 2053
AnnaBridge 167:e84263d55307 2054
AnnaBridge 167:e84263d55307 2055 /**
AnnaBridge 167:e84263d55307 2056 * @brief Gets the current mmc card data state.
AnnaBridge 167:e84263d55307 2057 * @param hmmc: pointer to MMC handle
AnnaBridge 167:e84263d55307 2058 * @retval Card state
AnnaBridge 167:e84263d55307 2059 */
AnnaBridge 167:e84263d55307 2060 HAL_MMC_CardStateTypeDef HAL_MMC_GetCardState(MMC_HandleTypeDef *hmmc)
AnnaBridge 167:e84263d55307 2061 {
AnnaBridge 167:e84263d55307 2062 HAL_MMC_CardStateTypeDef cardstate = HAL_MMC_CARD_TRANSFER;
AnnaBridge 167:e84263d55307 2063 uint32_t errorstate = HAL_MMC_ERROR_NONE;
AnnaBridge 167:e84263d55307 2064 uint32_t resp1 = 0U;
AnnaBridge 167:e84263d55307 2065
AnnaBridge 167:e84263d55307 2066 errorstate = MMC_SendStatus(hmmc, &resp1);
AnnaBridge 167:e84263d55307 2067 if(errorstate != HAL_OK)
AnnaBridge 167:e84263d55307 2068 {
AnnaBridge 167:e84263d55307 2069 hmmc->ErrorCode |= errorstate;
AnnaBridge 167:e84263d55307 2070 }
AnnaBridge 167:e84263d55307 2071
AnnaBridge 167:e84263d55307 2072 cardstate = (HAL_MMC_CardStateTypeDef)((resp1 >> 9U) & 0x0FU);
AnnaBridge 167:e84263d55307 2073
AnnaBridge 167:e84263d55307 2074 return cardstate;
AnnaBridge 167:e84263d55307 2075 }
AnnaBridge 167:e84263d55307 2076
AnnaBridge 167:e84263d55307 2077 /**
AnnaBridge 167:e84263d55307 2078 * @brief Abort the current transfer and disable the MMC.
AnnaBridge 167:e84263d55307 2079 * @param hmmc: pointer to a MMC_HandleTypeDef structure that contains
AnnaBridge 167:e84263d55307 2080 * the configuration information for MMC module.
AnnaBridge 167:e84263d55307 2081 * @retval HAL status
AnnaBridge 167:e84263d55307 2082 */
AnnaBridge 167:e84263d55307 2083 HAL_StatusTypeDef HAL_MMC_Abort(MMC_HandleTypeDef *hmmc)
AnnaBridge 167:e84263d55307 2084 {
AnnaBridge 167:e84263d55307 2085 HAL_MMC_CardStateTypeDef CardState;
AnnaBridge 167:e84263d55307 2086
AnnaBridge 167:e84263d55307 2087 /* DIsable All interrupts */
AnnaBridge 167:e84263d55307 2088 __HAL_MMC_DISABLE_IT(hmmc, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
AnnaBridge 167:e84263d55307 2089 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR);
AnnaBridge 167:e84263d55307 2090
AnnaBridge 167:e84263d55307 2091 /* Clear All flags */
AnnaBridge 167:e84263d55307 2092 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 2093
AnnaBridge 167:e84263d55307 2094 if((hmmc->hdmatx != NULL) || (hmmc->hdmarx != NULL))
AnnaBridge 167:e84263d55307 2095 {
AnnaBridge 167:e84263d55307 2096 /* Disable the MMC DMA request */
AnnaBridge 167:e84263d55307 2097 hmmc->Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN);
AnnaBridge 167:e84263d55307 2098
AnnaBridge 167:e84263d55307 2099 /* Abort the MMC DMA Tx Stream */
AnnaBridge 167:e84263d55307 2100 if(hmmc->hdmatx != NULL)
AnnaBridge 167:e84263d55307 2101 {
AnnaBridge 167:e84263d55307 2102 HAL_DMA_Abort(hmmc->hdmatx);
AnnaBridge 167:e84263d55307 2103 }
AnnaBridge 167:e84263d55307 2104 /* Abort the MMC DMA Rx Stream */
AnnaBridge 167:e84263d55307 2105 if(hmmc->hdmarx != NULL)
AnnaBridge 167:e84263d55307 2106 {
AnnaBridge 167:e84263d55307 2107 HAL_DMA_Abort(hmmc->hdmarx);
AnnaBridge 167:e84263d55307 2108 }
AnnaBridge 167:e84263d55307 2109 }
AnnaBridge 167:e84263d55307 2110
AnnaBridge 167:e84263d55307 2111 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 2112 CardState = HAL_MMC_GetCardState(hmmc);
AnnaBridge 167:e84263d55307 2113 if((CardState == HAL_MMC_CARD_RECEIVING) || (CardState == HAL_MMC_CARD_SENDING))
AnnaBridge 167:e84263d55307 2114 {
AnnaBridge 167:e84263d55307 2115 hmmc->ErrorCode = SDMMC_CmdStopTransfer(hmmc->Instance);
AnnaBridge 167:e84263d55307 2116 }
AnnaBridge 167:e84263d55307 2117 if(hmmc->ErrorCode != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 2118 {
AnnaBridge 167:e84263d55307 2119 return HAL_ERROR;
AnnaBridge 167:e84263d55307 2120 }
AnnaBridge 167:e84263d55307 2121 return HAL_OK;
AnnaBridge 167:e84263d55307 2122 }
AnnaBridge 167:e84263d55307 2123
AnnaBridge 167:e84263d55307 2124 /**
AnnaBridge 167:e84263d55307 2125 * @brief Abort the current transfer and disable the MMC (IT mode).
AnnaBridge 167:e84263d55307 2126 * @param hmmc: pointer to a MMC_HandleTypeDef structure that contains
AnnaBridge 167:e84263d55307 2127 * the configuration information for MMC module.
AnnaBridge 167:e84263d55307 2128 * @retval HAL status
AnnaBridge 167:e84263d55307 2129 */
AnnaBridge 167:e84263d55307 2130 HAL_StatusTypeDef HAL_MMC_Abort_IT(MMC_HandleTypeDef *hmmc)
AnnaBridge 167:e84263d55307 2131 {
AnnaBridge 167:e84263d55307 2132 HAL_MMC_CardStateTypeDef CardState;
AnnaBridge 167:e84263d55307 2133
AnnaBridge 167:e84263d55307 2134 /* DIsable All interrupts */
AnnaBridge 167:e84263d55307 2135 __HAL_MMC_DISABLE_IT(hmmc, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
AnnaBridge 167:e84263d55307 2136 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR);
AnnaBridge 167:e84263d55307 2137
AnnaBridge 167:e84263d55307 2138 /* Clear All flags */
AnnaBridge 167:e84263d55307 2139 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 2140
AnnaBridge 167:e84263d55307 2141 if((hmmc->hdmatx != NULL) || (hmmc->hdmarx != NULL))
AnnaBridge 167:e84263d55307 2142 {
AnnaBridge 167:e84263d55307 2143 /* Disable the MMC DMA request */
AnnaBridge 167:e84263d55307 2144 hmmc->Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN);
AnnaBridge 167:e84263d55307 2145
AnnaBridge 167:e84263d55307 2146 /* Abort the MMC DMA Tx Stream */
AnnaBridge 167:e84263d55307 2147 if(hmmc->hdmatx != NULL)
AnnaBridge 167:e84263d55307 2148 {
AnnaBridge 167:e84263d55307 2149 hmmc->hdmatx->XferAbortCallback = MMC_DMATxAbort;
AnnaBridge 167:e84263d55307 2150 if(HAL_DMA_Abort_IT(hmmc->hdmatx) != HAL_OK)
AnnaBridge 167:e84263d55307 2151 {
AnnaBridge 167:e84263d55307 2152 hmmc->hdmatx = NULL;
AnnaBridge 167:e84263d55307 2153 }
AnnaBridge 167:e84263d55307 2154 }
AnnaBridge 167:e84263d55307 2155 /* Abort the MMC DMA Rx Stream */
AnnaBridge 167:e84263d55307 2156 if(hmmc->hdmarx != NULL)
AnnaBridge 167:e84263d55307 2157 {
AnnaBridge 167:e84263d55307 2158 hmmc->hdmarx->XferAbortCallback = MMC_DMARxAbort;
AnnaBridge 167:e84263d55307 2159 if(HAL_DMA_Abort_IT(hmmc->hdmarx) != HAL_OK)
AnnaBridge 167:e84263d55307 2160 {
AnnaBridge 167:e84263d55307 2161 hmmc->hdmarx = NULL;
AnnaBridge 167:e84263d55307 2162 }
AnnaBridge 167:e84263d55307 2163 }
AnnaBridge 167:e84263d55307 2164 }
AnnaBridge 167:e84263d55307 2165
AnnaBridge 167:e84263d55307 2166 /* No transfer ongoing on both DMA channels*/
AnnaBridge 167:e84263d55307 2167 if((hmmc->hdmatx == NULL) && (hmmc->hdmarx == NULL))
AnnaBridge 167:e84263d55307 2168 {
AnnaBridge 167:e84263d55307 2169 CardState = HAL_MMC_GetCardState(hmmc);
AnnaBridge 167:e84263d55307 2170 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 2171 if((CardState == HAL_MMC_CARD_RECEIVING) || (CardState == HAL_MMC_CARD_SENDING))
AnnaBridge 167:e84263d55307 2172 {
AnnaBridge 167:e84263d55307 2173 hmmc->ErrorCode = SDMMC_CmdStopTransfer(hmmc->Instance);
AnnaBridge 167:e84263d55307 2174 }
AnnaBridge 167:e84263d55307 2175 if(hmmc->ErrorCode != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 2176 {
AnnaBridge 167:e84263d55307 2177 return HAL_ERROR;
AnnaBridge 167:e84263d55307 2178 }
AnnaBridge 167:e84263d55307 2179 else
AnnaBridge 167:e84263d55307 2180 {
AnnaBridge 167:e84263d55307 2181 HAL_MMC_AbortCallback(hmmc);
AnnaBridge 167:e84263d55307 2182 }
AnnaBridge 167:e84263d55307 2183 }
AnnaBridge 167:e84263d55307 2184
AnnaBridge 167:e84263d55307 2185 return HAL_OK;
AnnaBridge 167:e84263d55307 2186 }
AnnaBridge 167:e84263d55307 2187
AnnaBridge 167:e84263d55307 2188 /**
AnnaBridge 167:e84263d55307 2189 * @}
AnnaBridge 167:e84263d55307 2190 */
AnnaBridge 167:e84263d55307 2191
AnnaBridge 167:e84263d55307 2192 /**
AnnaBridge 167:e84263d55307 2193 * @}
AnnaBridge 167:e84263d55307 2194 */
AnnaBridge 167:e84263d55307 2195
AnnaBridge 167:e84263d55307 2196 /* Private function ----------------------------------------------------------*/
AnnaBridge 167:e84263d55307 2197 /** @addtogroup MMC_Private_Functions
AnnaBridge 167:e84263d55307 2198 * @{
AnnaBridge 167:e84263d55307 2199 */
AnnaBridge 167:e84263d55307 2200
AnnaBridge 167:e84263d55307 2201 /**
AnnaBridge 167:e84263d55307 2202 * @brief DMA MMC transmit process complete callback
AnnaBridge 167:e84263d55307 2203 * @param hdma: DMA handle
AnnaBridge 167:e84263d55307 2204 * @retval None
AnnaBridge 167:e84263d55307 2205 */
AnnaBridge 167:e84263d55307 2206 static void MMC_DMATransmitCplt(DMA_HandleTypeDef *hdma)
AnnaBridge 167:e84263d55307 2207 {
AnnaBridge 167:e84263d55307 2208 MMC_HandleTypeDef* hmmc = (MMC_HandleTypeDef* )(hdma->Parent);
AnnaBridge 167:e84263d55307 2209
AnnaBridge 167:e84263d55307 2210 /* Enable DATAEND Interrupt */
AnnaBridge 167:e84263d55307 2211 __HAL_MMC_ENABLE_IT(hmmc, (SDIO_IT_DATAEND));
AnnaBridge 167:e84263d55307 2212 }
AnnaBridge 167:e84263d55307 2213
AnnaBridge 167:e84263d55307 2214 /**
AnnaBridge 167:e84263d55307 2215 * @brief DMA MMC receive process complete callback
AnnaBridge 167:e84263d55307 2216 * @param hdma: DMA handle
AnnaBridge 167:e84263d55307 2217 * @retval None
AnnaBridge 167:e84263d55307 2218 */
AnnaBridge 167:e84263d55307 2219 static void MMC_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
AnnaBridge 167:e84263d55307 2220 {
AnnaBridge 167:e84263d55307 2221 MMC_HandleTypeDef* hmmc = (MMC_HandleTypeDef* )(hdma->Parent);
AnnaBridge 167:e84263d55307 2222 uint32_t errorstate = HAL_MMC_ERROR_NONE;
AnnaBridge 167:e84263d55307 2223
AnnaBridge 167:e84263d55307 2224 /* Send stop command in multiblock write */
AnnaBridge 167:e84263d55307 2225 if(hmmc->Context == (MMC_CONTEXT_READ_MULTIPLE_BLOCK | MMC_CONTEXT_DMA))
AnnaBridge 167:e84263d55307 2226 {
AnnaBridge 167:e84263d55307 2227 errorstate = SDMMC_CmdStopTransfer(hmmc->Instance);
AnnaBridge 167:e84263d55307 2228 if(errorstate != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 2229 {
AnnaBridge 167:e84263d55307 2230 hmmc->ErrorCode |= errorstate;
AnnaBridge 167:e84263d55307 2231 HAL_MMC_ErrorCallback(hmmc);
AnnaBridge 167:e84263d55307 2232 }
AnnaBridge 167:e84263d55307 2233 }
AnnaBridge 167:e84263d55307 2234
AnnaBridge 167:e84263d55307 2235 /* Disable the DMA transfer for transmit request by setting the DMAEN bit
AnnaBridge 167:e84263d55307 2236 in the MMC DCTRL register */
AnnaBridge 167:e84263d55307 2237 hmmc->Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN);
AnnaBridge 167:e84263d55307 2238
AnnaBridge 167:e84263d55307 2239 /* Clear all the static flags */
AnnaBridge 167:e84263d55307 2240 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 2241
AnnaBridge 167:e84263d55307 2242 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 2243
AnnaBridge 167:e84263d55307 2244 HAL_MMC_RxCpltCallback(hmmc);
AnnaBridge 167:e84263d55307 2245 }
AnnaBridge 167:e84263d55307 2246
AnnaBridge 167:e84263d55307 2247 /**
AnnaBridge 167:e84263d55307 2248 * @brief DMA MMC communication error callback
AnnaBridge 167:e84263d55307 2249 * @param hdma: DMA handle
AnnaBridge 167:e84263d55307 2250 * @retval None
AnnaBridge 167:e84263d55307 2251 */
AnnaBridge 167:e84263d55307 2252 static void MMC_DMAError(DMA_HandleTypeDef *hdma)
AnnaBridge 167:e84263d55307 2253 {
AnnaBridge 167:e84263d55307 2254 MMC_HandleTypeDef* hmmc = (MMC_HandleTypeDef* )(hdma->Parent);
AnnaBridge 167:e84263d55307 2255 HAL_MMC_CardStateTypeDef CardState;
AnnaBridge 167:e84263d55307 2256
AnnaBridge 167:e84263d55307 2257 if((hmmc->hdmarx->ErrorCode == HAL_DMA_ERROR_TE) || (hmmc->hdmatx->ErrorCode == HAL_DMA_ERROR_TE))
AnnaBridge 167:e84263d55307 2258 {
AnnaBridge 167:e84263d55307 2259 /* Clear All flags */
AnnaBridge 167:e84263d55307 2260 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
AnnaBridge 167:e84263d55307 2261
AnnaBridge 167:e84263d55307 2262 /* Disable All interrupts */
AnnaBridge 167:e84263d55307 2263 __HAL_MMC_DISABLE_IT(hmmc, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
AnnaBridge 167:e84263d55307 2264 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR);
AnnaBridge 167:e84263d55307 2265
AnnaBridge 167:e84263d55307 2266 hmmc->ErrorCode |= HAL_MMC_ERROR_DMA;
AnnaBridge 167:e84263d55307 2267 CardState = HAL_MMC_GetCardState(hmmc);
AnnaBridge 167:e84263d55307 2268 if((CardState == HAL_MMC_CARD_RECEIVING) || (CardState == HAL_MMC_CARD_SENDING))
AnnaBridge 167:e84263d55307 2269 {
AnnaBridge 167:e84263d55307 2270 hmmc->ErrorCode |= SDMMC_CmdStopTransfer(hmmc->Instance);
AnnaBridge 167:e84263d55307 2271 }
AnnaBridge 167:e84263d55307 2272
AnnaBridge 167:e84263d55307 2273 hmmc->State= HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 2274 }
AnnaBridge 167:e84263d55307 2275
AnnaBridge 167:e84263d55307 2276 HAL_MMC_ErrorCallback(hmmc);
AnnaBridge 167:e84263d55307 2277 }
AnnaBridge 167:e84263d55307 2278
AnnaBridge 167:e84263d55307 2279 /**
AnnaBridge 167:e84263d55307 2280 * @brief DMA MMC Tx Abort callback
AnnaBridge 167:e84263d55307 2281 * @param hdma: DMA handle
AnnaBridge 167:e84263d55307 2282 * @retval None
AnnaBridge 167:e84263d55307 2283 */
AnnaBridge 167:e84263d55307 2284 static void MMC_DMATxAbort(DMA_HandleTypeDef *hdma)
AnnaBridge 167:e84263d55307 2285 {
AnnaBridge 167:e84263d55307 2286 MMC_HandleTypeDef* hmmc = (MMC_HandleTypeDef* )(hdma->Parent);
AnnaBridge 167:e84263d55307 2287 HAL_MMC_CardStateTypeDef CardState;
AnnaBridge 167:e84263d55307 2288
AnnaBridge 167:e84263d55307 2289 if(hmmc->hdmatx != NULL)
AnnaBridge 167:e84263d55307 2290 {
AnnaBridge 167:e84263d55307 2291 hmmc->hdmatx = NULL;
AnnaBridge 167:e84263d55307 2292 }
AnnaBridge 167:e84263d55307 2293
AnnaBridge 167:e84263d55307 2294 /* All DMA channels are aborted */
AnnaBridge 167:e84263d55307 2295 if(hmmc->hdmarx == NULL)
AnnaBridge 167:e84263d55307 2296 {
AnnaBridge 167:e84263d55307 2297 CardState = HAL_MMC_GetCardState(hmmc);
AnnaBridge 167:e84263d55307 2298 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
AnnaBridge 167:e84263d55307 2299 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 2300 if((CardState == HAL_MMC_CARD_RECEIVING) || (CardState == HAL_MMC_CARD_SENDING))
AnnaBridge 167:e84263d55307 2301 {
AnnaBridge 167:e84263d55307 2302 hmmc->ErrorCode |= SDMMC_CmdStopTransfer(hmmc->Instance);
AnnaBridge 167:e84263d55307 2303
AnnaBridge 167:e84263d55307 2304 if(hmmc->ErrorCode != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 2305 {
AnnaBridge 167:e84263d55307 2306 HAL_MMC_AbortCallback(hmmc);
AnnaBridge 167:e84263d55307 2307 }
AnnaBridge 167:e84263d55307 2308 else
AnnaBridge 167:e84263d55307 2309 {
AnnaBridge 167:e84263d55307 2310 HAL_MMC_ErrorCallback(hmmc);
AnnaBridge 167:e84263d55307 2311 }
AnnaBridge 167:e84263d55307 2312 }
AnnaBridge 167:e84263d55307 2313 }
AnnaBridge 167:e84263d55307 2314 }
AnnaBridge 167:e84263d55307 2315
AnnaBridge 167:e84263d55307 2316 /**
AnnaBridge 167:e84263d55307 2317 * @brief DMA MMC Rx Abort callback
AnnaBridge 167:e84263d55307 2318 * @param hdma: DMA handle
AnnaBridge 167:e84263d55307 2319 * @retval None
AnnaBridge 167:e84263d55307 2320 */
AnnaBridge 167:e84263d55307 2321 static void MMC_DMARxAbort(DMA_HandleTypeDef *hdma)
AnnaBridge 167:e84263d55307 2322 {
AnnaBridge 167:e84263d55307 2323 MMC_HandleTypeDef* hmmc = (MMC_HandleTypeDef* )(hdma->Parent);
AnnaBridge 167:e84263d55307 2324 HAL_MMC_CardStateTypeDef CardState;
AnnaBridge 167:e84263d55307 2325
AnnaBridge 167:e84263d55307 2326 if(hmmc->hdmarx != NULL)
AnnaBridge 167:e84263d55307 2327 {
AnnaBridge 167:e84263d55307 2328 hmmc->hdmarx = NULL;
AnnaBridge 167:e84263d55307 2329 }
AnnaBridge 167:e84263d55307 2330
AnnaBridge 167:e84263d55307 2331 /* All DMA channels are aborted */
AnnaBridge 167:e84263d55307 2332 if(hmmc->hdmatx == NULL)
AnnaBridge 167:e84263d55307 2333 {
AnnaBridge 167:e84263d55307 2334 CardState = HAL_MMC_GetCardState(hmmc);
AnnaBridge 167:e84263d55307 2335 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
AnnaBridge 167:e84263d55307 2336 hmmc->State = HAL_MMC_STATE_READY;
AnnaBridge 167:e84263d55307 2337 if((CardState == HAL_MMC_CARD_RECEIVING) || (CardState == HAL_MMC_CARD_SENDING))
AnnaBridge 167:e84263d55307 2338 {
AnnaBridge 167:e84263d55307 2339 hmmc->ErrorCode |= SDMMC_CmdStopTransfer(hmmc->Instance);
AnnaBridge 167:e84263d55307 2340
AnnaBridge 167:e84263d55307 2341 if(hmmc->ErrorCode != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 2342 {
AnnaBridge 167:e84263d55307 2343 HAL_MMC_AbortCallback(hmmc);
AnnaBridge 167:e84263d55307 2344 }
AnnaBridge 167:e84263d55307 2345 else
AnnaBridge 167:e84263d55307 2346 {
AnnaBridge 167:e84263d55307 2347 HAL_MMC_ErrorCallback(hmmc);
AnnaBridge 167:e84263d55307 2348 }
AnnaBridge 167:e84263d55307 2349 }
AnnaBridge 167:e84263d55307 2350 }
AnnaBridge 167:e84263d55307 2351 }
AnnaBridge 167:e84263d55307 2352
AnnaBridge 167:e84263d55307 2353
AnnaBridge 167:e84263d55307 2354 /**
AnnaBridge 167:e84263d55307 2355 * @brief Initializes the mmc card.
AnnaBridge 167:e84263d55307 2356 * @param hmmc: Pointer to MMC handle
AnnaBridge 167:e84263d55307 2357 * @retval MMC Card error state
AnnaBridge 167:e84263d55307 2358 */
AnnaBridge 167:e84263d55307 2359 static uint32_t MMC_InitCard(MMC_HandleTypeDef *hmmc)
AnnaBridge 167:e84263d55307 2360 {
AnnaBridge 167:e84263d55307 2361 HAL_MMC_CardCSDTypeDef CSD;
AnnaBridge 167:e84263d55307 2362 uint32_t errorstate = HAL_MMC_ERROR_NONE;
AnnaBridge 167:e84263d55307 2363 uint16_t mmc_rca = 1;
AnnaBridge 167:e84263d55307 2364
AnnaBridge 167:e84263d55307 2365 /* Check the power State */
AnnaBridge 167:e84263d55307 2366 if(SDIO_GetPowerState(hmmc->Instance) == 0U)
AnnaBridge 167:e84263d55307 2367 {
AnnaBridge 167:e84263d55307 2368 /* Power off */
AnnaBridge 167:e84263d55307 2369 return HAL_MMC_ERROR_REQUEST_NOT_APPLICABLE;
AnnaBridge 167:e84263d55307 2370 }
AnnaBridge 167:e84263d55307 2371
AnnaBridge 167:e84263d55307 2372 /* Send CMD2 ALL_SEND_CID */
AnnaBridge 167:e84263d55307 2373 errorstate = SDMMC_CmdSendCID(hmmc->Instance);
AnnaBridge 167:e84263d55307 2374 if(errorstate != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 2375 {
AnnaBridge 167:e84263d55307 2376 return errorstate;
AnnaBridge 167:e84263d55307 2377 }
AnnaBridge 167:e84263d55307 2378 else
AnnaBridge 167:e84263d55307 2379 {
AnnaBridge 167:e84263d55307 2380 /* Get Card identification number data */
AnnaBridge 167:e84263d55307 2381 hmmc->CID[0U] = SDIO_GetResponse(hmmc->Instance, SDIO_RESP1);
AnnaBridge 167:e84263d55307 2382 hmmc->CID[1U] = SDIO_GetResponse(hmmc->Instance, SDIO_RESP2);
AnnaBridge 167:e84263d55307 2383 hmmc->CID[2U] = SDIO_GetResponse(hmmc->Instance, SDIO_RESP3);
AnnaBridge 167:e84263d55307 2384 hmmc->CID[3U] = SDIO_GetResponse(hmmc->Instance, SDIO_RESP4);
AnnaBridge 167:e84263d55307 2385 }
AnnaBridge 167:e84263d55307 2386
AnnaBridge 167:e84263d55307 2387 /* Send CMD3 SET_REL_ADDR with argument 0 */
AnnaBridge 167:e84263d55307 2388 /* MMC Card publishes its RCA. */
AnnaBridge 167:e84263d55307 2389 errorstate = SDMMC_CmdSetRelAdd(hmmc->Instance, &mmc_rca);
AnnaBridge 167:e84263d55307 2390 if(errorstate != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 2391 {
AnnaBridge 167:e84263d55307 2392 return errorstate;
AnnaBridge 167:e84263d55307 2393 }
AnnaBridge 167:e84263d55307 2394
AnnaBridge 167:e84263d55307 2395 /* Get the MMC card RCA */
AnnaBridge 167:e84263d55307 2396 hmmc->MmcCard.RelCardAdd = mmc_rca;
AnnaBridge 167:e84263d55307 2397
AnnaBridge 167:e84263d55307 2398 /* Send CMD9 SEND_CSD with argument as card's RCA */
AnnaBridge 167:e84263d55307 2399 errorstate = SDMMC_CmdSendCSD(hmmc->Instance, (uint32_t)(hmmc->MmcCard.RelCardAdd << 16U));
AnnaBridge 167:e84263d55307 2400 if(errorstate != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 2401 {
AnnaBridge 167:e84263d55307 2402 return errorstate;
AnnaBridge 167:e84263d55307 2403 }
AnnaBridge 167:e84263d55307 2404 else
AnnaBridge 167:e84263d55307 2405 {
AnnaBridge 167:e84263d55307 2406 /* Get Card Specific Data */
AnnaBridge 167:e84263d55307 2407 hmmc->CSD[0U] = SDIO_GetResponse(hmmc->Instance, SDIO_RESP1);
AnnaBridge 167:e84263d55307 2408 hmmc->CSD[1U] = SDIO_GetResponse(hmmc->Instance, SDIO_RESP2);
AnnaBridge 167:e84263d55307 2409 hmmc->CSD[2U] = SDIO_GetResponse(hmmc->Instance, SDIO_RESP3);
AnnaBridge 167:e84263d55307 2410 hmmc->CSD[3U] = SDIO_GetResponse(hmmc->Instance, SDIO_RESP4);
AnnaBridge 167:e84263d55307 2411 }
AnnaBridge 167:e84263d55307 2412
AnnaBridge 167:e84263d55307 2413 /* Get the Card Class */
AnnaBridge 167:e84263d55307 2414 hmmc->MmcCard.Class = (SDIO_GetResponse(hmmc->Instance, SDIO_RESP2) >> 20U);
AnnaBridge 167:e84263d55307 2415
AnnaBridge 167:e84263d55307 2416 /* Get CSD parameters */
AnnaBridge 167:e84263d55307 2417 HAL_MMC_GetCardCSD(hmmc, &CSD);
AnnaBridge 167:e84263d55307 2418
AnnaBridge 167:e84263d55307 2419 /* Select the Card */
AnnaBridge 167:e84263d55307 2420 errorstate = SDMMC_CmdSelDesel(hmmc->Instance, (uint32_t)(((uint32_t)hmmc->MmcCard.RelCardAdd) << 16U));
AnnaBridge 167:e84263d55307 2421 if(errorstate != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 2422 {
AnnaBridge 167:e84263d55307 2423 return errorstate;
AnnaBridge 167:e84263d55307 2424 }
AnnaBridge 167:e84263d55307 2425
AnnaBridge 167:e84263d55307 2426 /* Configure SDIO peripheral interface */
AnnaBridge 167:e84263d55307 2427 SDIO_Init(hmmc->Instance, hmmc->Init);
AnnaBridge 167:e84263d55307 2428
AnnaBridge 167:e84263d55307 2429 /* All cards are initialized */
AnnaBridge 167:e84263d55307 2430 return HAL_MMC_ERROR_NONE;
AnnaBridge 167:e84263d55307 2431 }
AnnaBridge 167:e84263d55307 2432
AnnaBridge 167:e84263d55307 2433 /**
AnnaBridge 167:e84263d55307 2434 * @brief Enquires cards about their operating voltage and configures clock
AnnaBridge 167:e84263d55307 2435 * controls and stores MMC information that will be needed in future
AnnaBridge 167:e84263d55307 2436 * in the MMC handle.
AnnaBridge 167:e84263d55307 2437 * @param hmmc: Pointer to MMC handle
AnnaBridge 167:e84263d55307 2438 * @retval error state
AnnaBridge 167:e84263d55307 2439 */
AnnaBridge 167:e84263d55307 2440 static uint32_t MMC_PowerON(MMC_HandleTypeDef *hmmc)
AnnaBridge 167:e84263d55307 2441 {
AnnaBridge 167:e84263d55307 2442 __IO uint32_t count = 0U;
AnnaBridge 167:e84263d55307 2443 uint32_t response = 0U, validvoltage = 0U;
AnnaBridge 167:e84263d55307 2444 uint32_t errorstate = HAL_MMC_ERROR_NONE;
AnnaBridge 167:e84263d55307 2445
AnnaBridge 167:e84263d55307 2446 /* CMD0: GO_IDLE_STATE */
AnnaBridge 167:e84263d55307 2447 errorstate = SDMMC_CmdGoIdleState(hmmc->Instance);
AnnaBridge 167:e84263d55307 2448 if(errorstate != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 2449 {
AnnaBridge 167:e84263d55307 2450 return errorstate;
AnnaBridge 167:e84263d55307 2451 }
AnnaBridge 167:e84263d55307 2452
AnnaBridge 167:e84263d55307 2453 while(validvoltage == 0U)
AnnaBridge 167:e84263d55307 2454 {
AnnaBridge 167:e84263d55307 2455 if(count++ == SDMMC_MAX_VOLT_TRIAL)
AnnaBridge 167:e84263d55307 2456 {
AnnaBridge 167:e84263d55307 2457 return HAL_MMC_ERROR_INVALID_VOLTRANGE;
AnnaBridge 167:e84263d55307 2458 }
AnnaBridge 167:e84263d55307 2459
AnnaBridge 167:e84263d55307 2460 /* SEND CMD1 APP_CMD with MMC_HIGH_VOLTAGE_RANGE(0xC0FF8000) as argument */
AnnaBridge 167:e84263d55307 2461 errorstate = SDMMC_CmdOpCondition(hmmc->Instance, eMMC_HIGH_VOLTAGE_RANGE);
AnnaBridge 167:e84263d55307 2462 if(errorstate != HAL_MMC_ERROR_NONE)
AnnaBridge 167:e84263d55307 2463 {
AnnaBridge 167:e84263d55307 2464 return HAL_MMC_ERROR_UNSUPPORTED_FEATURE;
AnnaBridge 167:e84263d55307 2465 }
AnnaBridge 167:e84263d55307 2466
AnnaBridge 167:e84263d55307 2467 /* Get command response */
AnnaBridge 167:e84263d55307 2468 response = SDIO_GetResponse(hmmc->Instance, SDIO_RESP1);
AnnaBridge 167:e84263d55307 2469
AnnaBridge 167:e84263d55307 2470 /* Get operating voltage*/
AnnaBridge 167:e84263d55307 2471 validvoltage = (((response >> 31U) == 1U) ? 1U : 0U);
AnnaBridge 167:e84263d55307 2472 }
AnnaBridge 167:e84263d55307 2473
AnnaBridge 167:e84263d55307 2474 /* When power routine is finished and command returns valid voltage */
AnnaBridge 167:e84263d55307 2475 if ((response & eMMC_HIGH_VOLTAGE_RANGE) == MMC_HIGH_VOLTAGE_RANGE)
AnnaBridge 167:e84263d55307 2476 {
AnnaBridge 167:e84263d55307 2477 /* When voltage range of the card is within 2.7V and 3.6V */
AnnaBridge 167:e84263d55307 2478 hmmc->MmcCard.CardType = MMC_HIGH_VOLTAGE_CARD;
AnnaBridge 167:e84263d55307 2479 }
AnnaBridge 167:e84263d55307 2480 else
AnnaBridge 167:e84263d55307 2481 {
AnnaBridge 167:e84263d55307 2482 /* When voltage range of the card is within 1.65V and 1.95V or 2.7V and 3.6V */
AnnaBridge 167:e84263d55307 2483 hmmc->MmcCard.CardType = MMC_DUAL_VOLTAGE_CARD;
AnnaBridge 167:e84263d55307 2484 }
AnnaBridge 167:e84263d55307 2485
AnnaBridge 167:e84263d55307 2486 return HAL_MMC_ERROR_NONE;
AnnaBridge 167:e84263d55307 2487 }
AnnaBridge 167:e84263d55307 2488
AnnaBridge 167:e84263d55307 2489 /**
AnnaBridge 167:e84263d55307 2490 * @brief Turns the SDIO output signals off.
AnnaBridge 167:e84263d55307 2491 * @param hmmc: Pointer to MMC handle
AnnaBridge 167:e84263d55307 2492 * @retval HAL status
AnnaBridge 167:e84263d55307 2493 */
AnnaBridge 167:e84263d55307 2494 static HAL_StatusTypeDef MMC_PowerOFF(MMC_HandleTypeDef *hmmc)
AnnaBridge 167:e84263d55307 2495 {
AnnaBridge 167:e84263d55307 2496 /* Set Power State to OFF */
AnnaBridge 167:e84263d55307 2497 SDIO_PowerState_OFF(hmmc->Instance);
AnnaBridge 167:e84263d55307 2498
AnnaBridge 167:e84263d55307 2499 return HAL_OK;
AnnaBridge 167:e84263d55307 2500 }
AnnaBridge 167:e84263d55307 2501
AnnaBridge 167:e84263d55307 2502 /**
AnnaBridge 167:e84263d55307 2503 * @brief Returns the current card's status.
AnnaBridge 167:e84263d55307 2504 * @param hmmc: Pointer to MMC handle
AnnaBridge 167:e84263d55307 2505 * @param pCardStatus: pointer to the buffer that will contain the MMC card
AnnaBridge 167:e84263d55307 2506 * status (Card Status register)
AnnaBridge 167:e84263d55307 2507 * @retval error state
AnnaBridge 167:e84263d55307 2508 */
AnnaBridge 167:e84263d55307 2509 static uint32_t MMC_SendStatus(MMC_HandleTypeDef *hmmc, uint32_t *pCardStatus)
AnnaBridge 167:e84263d55307 2510 {
AnnaBridge 167:e84263d55307 2511 uint32_t errorstate = HAL_MMC_ERROR_NONE;
AnnaBridge 167:e84263d55307 2512
AnnaBridge 167:e84263d55307 2513 if(pCardStatus == NULL)
AnnaBridge 167:e84263d55307 2514 {
AnnaBridge 167:e84263d55307 2515 return HAL_MMC_ERROR_PARAM;
AnnaBridge 167:e84263d55307 2516 }
AnnaBridge 167:e84263d55307 2517
AnnaBridge 167:e84263d55307 2518 /* Send Status command */
AnnaBridge 167:e84263d55307 2519 errorstate = SDMMC_CmdSendStatus(hmmc->Instance, (uint32_t)(hmmc->MmcCard.RelCardAdd << 16U));
AnnaBridge 167:e84263d55307 2520 if(errorstate != HAL_OK)
AnnaBridge 167:e84263d55307 2521 {
AnnaBridge 167:e84263d55307 2522 return errorstate;
AnnaBridge 167:e84263d55307 2523 }
AnnaBridge 167:e84263d55307 2524
AnnaBridge 167:e84263d55307 2525 /* Get MMC card status */
AnnaBridge 167:e84263d55307 2526 *pCardStatus = SDIO_GetResponse(hmmc->Instance, SDIO_RESP1);
AnnaBridge 167:e84263d55307 2527
AnnaBridge 167:e84263d55307 2528 return HAL_MMC_ERROR_NONE;
AnnaBridge 167:e84263d55307 2529 }
AnnaBridge 167:e84263d55307 2530
AnnaBridge 167:e84263d55307 2531 /**
AnnaBridge 167:e84263d55307 2532 * @brief Wrap up reading in non-blocking mode.
AnnaBridge 167:e84263d55307 2533 * @param hmmc: pointer to a MMC_HandleTypeDef structure that contains
AnnaBridge 167:e84263d55307 2534 * the configuration information.
AnnaBridge 167:e84263d55307 2535 * @retval HAL status
AnnaBridge 167:e84263d55307 2536 */
AnnaBridge 167:e84263d55307 2537 static HAL_StatusTypeDef MMC_Read_IT(MMC_HandleTypeDef *hmmc)
AnnaBridge 167:e84263d55307 2538 {
AnnaBridge 167:e84263d55307 2539 uint32_t count = 0U;
AnnaBridge 167:e84263d55307 2540 uint32_t* tmp;
AnnaBridge 167:e84263d55307 2541
AnnaBridge 167:e84263d55307 2542 tmp = (uint32_t*)hmmc->pRxBuffPtr;
AnnaBridge 167:e84263d55307 2543
AnnaBridge 167:e84263d55307 2544 /* Read data from SDMMC Rx FIFO */
AnnaBridge 167:e84263d55307 2545 for(count = 0U; count < 8U; count++)
AnnaBridge 167:e84263d55307 2546 {
AnnaBridge 167:e84263d55307 2547 *(tmp + count) = SDIO_ReadFIFO(hmmc->Instance);
AnnaBridge 167:e84263d55307 2548 }
AnnaBridge 167:e84263d55307 2549
AnnaBridge 167:e84263d55307 2550 hmmc->pRxBuffPtr += 8U;
AnnaBridge 167:e84263d55307 2551
AnnaBridge 167:e84263d55307 2552 return HAL_OK;
AnnaBridge 167:e84263d55307 2553 }
AnnaBridge 167:e84263d55307 2554
AnnaBridge 167:e84263d55307 2555 /**
AnnaBridge 167:e84263d55307 2556 * @brief Wrap up writing in non-blocking mode.
AnnaBridge 167:e84263d55307 2557 * @param hmmc: pointer to a MMC_HandleTypeDef structure that contains
AnnaBridge 167:e84263d55307 2558 * the configuration information.
AnnaBridge 167:e84263d55307 2559 * @retval HAL status
AnnaBridge 167:e84263d55307 2560 */
AnnaBridge 167:e84263d55307 2561 static HAL_StatusTypeDef MMC_Write_IT(MMC_HandleTypeDef *hmmc)
AnnaBridge 167:e84263d55307 2562 {
AnnaBridge 167:e84263d55307 2563 uint32_t count = 0U;
AnnaBridge 167:e84263d55307 2564 uint32_t* tmp;
AnnaBridge 167:e84263d55307 2565
AnnaBridge 167:e84263d55307 2566 tmp = (uint32_t*)hmmc->pTxBuffPtr;
AnnaBridge 167:e84263d55307 2567
AnnaBridge 167:e84263d55307 2568 /* Write data to SDMMC Tx FIFO */
AnnaBridge 167:e84263d55307 2569 for(count = 0U; count < 8U; count++)
AnnaBridge 167:e84263d55307 2570 {
AnnaBridge 167:e84263d55307 2571 SDIO_WriteFIFO(hmmc->Instance, (tmp + count));
AnnaBridge 167:e84263d55307 2572 }
AnnaBridge 167:e84263d55307 2573
AnnaBridge 167:e84263d55307 2574 hmmc->pTxBuffPtr += 8U;
AnnaBridge 167:e84263d55307 2575
AnnaBridge 167:e84263d55307 2576 return HAL_OK;
AnnaBridge 167:e84263d55307 2577 }
AnnaBridge 167:e84263d55307 2578
AnnaBridge 167:e84263d55307 2579 /**
AnnaBridge 167:e84263d55307 2580 * @}
AnnaBridge 167:e84263d55307 2581 */
AnnaBridge 167:e84263d55307 2582
AnnaBridge 167:e84263d55307 2583 #endif /* HAL_MMC_MODULE_ENABLED */
AnnaBridge 167:e84263d55307 2584
AnnaBridge 167:e84263d55307 2585 /**
AnnaBridge 167:e84263d55307 2586 * @}
AnnaBridge 167:e84263d55307 2587 */
AnnaBridge 167:e84263d55307 2588
AnnaBridge 167:e84263d55307 2589 /**
AnnaBridge 167:e84263d55307 2590 * @}
AnnaBridge 167:e84263d55307 2591 */
AnnaBridge 167:e84263d55307 2592
AnnaBridge 167:e84263d55307 2593 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/