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