1 /********************************** (C) COPYRIGHT  *******************************
2 * File Name          : ch32f20x_SDIO.c
3 * Author             : WCH
4 * Version            : V1.0.0
5 * Date               : 2021/08/08
6 * Description        : This file provides all the SDIO firmware functions.
7 *******************************************************************************/
8 #include "ch32f20x_sdio.h"
9 #include "ch32f20x_rcc.h"
10 
11 
12 #define SDIO_OFFSET              (SDIO_BASE - PERIPH_BASE)
13 
14 /* CLKCR register clear mask */
15 #define CLKCR_CLEAR_MASK         ((uint32_t)0xFFFF8100)
16 
17 /* SDIO PWRCTRL Mask */
18 #define PWR_PWRCTRL_MASK         ((uint32_t)0xFFFFFFFC)
19 
20 /* SDIO DCTRL Clear Mask */
21 #define DCTRL_CLEAR_MASK         ((uint32_t)0xFFFFFF08)
22 
23 /* CMD Register clear mask */
24 #define CMD_CLEAR_MASK           ((uint32_t)0xFFFFF800)
25 
26 /* SDIO RESP Registers Address */
27 #define SDIO_RESP_ADDR           ((uint32_t)(SDIO_BASE + 0x14))
28 
29 /*******************************************************************************
30 * Function Name  : SDIO_DeInit
31 * Description    : Deinitializes the SDIO peripheral registers to their default reset values.
32 * Input          : None
33 * Return         : None
34 *******************************************************************************/
SDIO_DeInit(void)35 void SDIO_DeInit(void)
36 {
37   SDIO->POWER = 0x00000000;
38   SDIO->CLKCR = 0x00000000;
39   SDIO->ARG = 0x00000000;
40   SDIO->CMD = 0x00000000;
41   SDIO->DTIMER = 0x00000000;
42   SDIO->DLEN = 0x00000000;
43   SDIO->DCTRL = 0x00000000;
44   SDIO->ICR = 0x00C007FF;
45   SDIO->MASK = 0x00000000;
46 }
47 
48 /*******************************************************************************
49 * Function Name  : SDIO_Init
50 * Description    : Initializes the SDIO peripheral according to the specified
51 *      parameters in the SDIO_InitStruct.
52 * Input          : SDIO_InitStruct : pointer to a SDIO_InitTypeDef structure
53 *      that contains the configuration information for the SDIO peripheral.
54 * Return         : None
55 *******************************************************************************/
SDIO_Init(SDIO_InitTypeDef * SDIO_InitStruct)56 void SDIO_Init(SDIO_InitTypeDef* SDIO_InitStruct)
57 {
58   uint32_t tmpreg = 0;
59 
60   tmpreg = SDIO->CLKCR;
61   tmpreg &= CLKCR_CLEAR_MASK;
62   tmpreg |= (SDIO_InitStruct->SDIO_ClockDiv  | SDIO_InitStruct->SDIO_ClockPowerSave |
63              SDIO_InitStruct->SDIO_ClockBypass | SDIO_InitStruct->SDIO_BusWide |
64              SDIO_InitStruct->SDIO_ClockEdge | SDIO_InitStruct->SDIO_HardwareFlowControl);
65 
66   SDIO->CLKCR = tmpreg;
67 }
68 
69 /*******************************************************************************
70 * Function Name  : SDIO_StructInit
71 * Description    : Fills each SDIO_InitStruct member with its default value.
72 * Input          : SDIO_InitStruct: pointer to an SDIO_InitTypeDef structure which
73 *                    will be initialized.
74 * Return         : None
75 *******************************************************************************/
SDIO_StructInit(SDIO_InitTypeDef * SDIO_InitStruct)76 void SDIO_StructInit(SDIO_InitTypeDef* SDIO_InitStruct)
77 {
78   SDIO_InitStruct->SDIO_ClockDiv = 0x00;
79   SDIO_InitStruct->SDIO_ClockEdge = SDIO_ClockEdge_Rising;
80   SDIO_InitStruct->SDIO_ClockBypass = SDIO_ClockBypass_Disable;
81   SDIO_InitStruct->SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable;
82   SDIO_InitStruct->SDIO_BusWide = SDIO_BusWide_1b;
83   SDIO_InitStruct->SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable;
84 }
85 
86 /*******************************************************************************
87 * Function Name  : SDIO_ClockCmd
88 * Description    : Enables or disables the SDIO Clock.
89 * Input          : SDIO_InitStruct: pointer to an SDIO_InitTypeDef structure which
90 *                    will be initialized.
91 *                  NewState��ENABLE or DISABLE.
92 * Return         : None
93 *******************************************************************************/
SDIO_ClockCmd(FunctionalState NewState)94 void SDIO_ClockCmd(FunctionalState NewState)
95 {
96   if(NewState) SDIO->CLKCR |= ((uint32_t)1<<8);
97   else SDIO->CLKCR &= ~((uint32_t)1<<8);
98 }
99 
100 /*******************************************************************************
101 * Function Name  : SDIO_SetPowerState
102 * Description    : Sets the power status of the controller.
103 * Input          : SDIO_PowerState: new state of the Power state.
104 *                    SDIO_PowerState_OFF
105 *                    SDIO_PowerState_ON
106 * Return         : None
107 *******************************************************************************/
SDIO_SetPowerState(uint32_t SDIO_PowerState)108 void SDIO_SetPowerState(uint32_t SDIO_PowerState)
109 {
110 
111   SDIO->POWER &= PWR_PWRCTRL_MASK;
112   SDIO->POWER |= SDIO_PowerState;
113 }
114 
115 /*******************************************************************************
116 * Function Name  : SDIO_GetPowerState
117 * Description    : Gets the power status of the controller.
118 * Input          : None
119 * Return         :
120 *                  - 0x00: Power OFF
121 *                  - 0x02: Power UP
122 *                  - 0x03: Power ON
123 *******************************************************************************/
SDIO_GetPowerState(void)124 uint32_t SDIO_GetPowerState(void)
125 {
126   return (SDIO->POWER & (~PWR_PWRCTRL_MASK));
127 }
128 
129 /*******************************************************************************
130 * Function Name  : SDIO_ITConfig
131 * Description    : Enables or disables the SDIO interrupts.
132 * Input          : DIO_IT: specifies the SDIO interrupt sources to be enabled or disabled.
133 *                    SDIO_IT_CCRCFAIL
134 *                    SDIO_IT_DCRCFAIL
135 *                    SDIO_IT_CTIMEOUT
136 *                    SDIO_IT_DTIMEOUT
137 *                    SDIO_IT_TXUNDERR
138 *                    SDIO_IT_RXOVERR
139 *                    SDIO_IT_CMDREND
140 *                    SDIO_IT_CMDSENT
141 *                    SDIO_IT_DATAEND
142 *                    SDIO_IT_STBITERR
143 *                    SDIO_IT_DBCKEND
144 *                    SDIO_IT_CMDACT
145 *                    SDIO_IT_TXACT
146 *                    SDIO_IT_RXACT
147 *                    SDIO_IT_TXFIFOHE
148 *                    SDIO_IT_RXFIFOHF
149 *                    SDIO_IT_TXFIFOF
150 *                    SDIO_IT_RXFIFOF
151 *                    SDIO_IT_TXFIFOE
152 *                    SDIO_IT_RXFIFOE
153 *                    SDIO_IT_TXDAVL
154 *                    SDIO_IT_RXDAVL
155 *                    SDIO_IT_SDIOIT
156 *                    SDIO_IT_CEATAEND
157 *                  NewState:ENABLE or DISABLE.
158 * Return         : None
159 *******************************************************************************/
SDIO_ITConfig(uint32_t SDIO_IT,FunctionalState NewState)160 void SDIO_ITConfig(uint32_t SDIO_IT, FunctionalState NewState)
161 {
162   if (NewState != DISABLE)
163   {
164     SDIO->MASK |= SDIO_IT;
165   }
166   else
167   {
168     SDIO->MASK &= ~SDIO_IT;
169   }
170 }
171 
172 /*******************************************************************************
173 * Function Name  : SDIO_DMACmd
174 * Description    : Enables or disables the SDIO DMA request.
175 * Input          : NewState:ENABLE or DISABLE.
176 * Return         : None
177 *******************************************************************************/
SDIO_DMACmd(FunctionalState NewState)178 void SDIO_DMACmd(FunctionalState NewState)
179 {
180   if(NewState) SDIO->DCTRL |= ((uint32_t)1<<3);
181   else SDIO->DCTRL &= ~((uint32_t)1<<3);
182 }
183 
184 /*******************************************************************************
185 * Function Name  : SDIO_SendCommand
186 * Description    : Initializes the SDIO Command according to the specified
187 *       parameters in the SDIO_CmdInitStruct and send the command.
188 * Input          : SDIO_CmdInitStruct : pointer to a SDIO_CmdInitTypeDef
189 *       structure that contains the configuration information for the SDIO command.
190 * Return         : None
191 *******************************************************************************/
SDIO_SendCommand(SDIO_CmdInitTypeDef * SDIO_CmdInitStruct)192 void SDIO_SendCommand(SDIO_CmdInitTypeDef *SDIO_CmdInitStruct)
193 {
194   uint32_t tmpreg = 0;
195 
196   SDIO->ARG = SDIO_CmdInitStruct->SDIO_Argument;
197 
198   tmpreg = SDIO->CMD;
199   tmpreg &= CMD_CLEAR_MASK;
200   tmpreg |= (uint32_t)SDIO_CmdInitStruct->SDIO_CmdIndex | SDIO_CmdInitStruct->SDIO_Response
201            | SDIO_CmdInitStruct->SDIO_Wait | SDIO_CmdInitStruct->SDIO_CPSM;
202 
203   SDIO->CMD = tmpreg;
204 }
205 
206 /*******************************************************************************
207 * Function Name  : SDIO_CmdStructInit
208 * Description    : Fills each SDIO_CmdInitStruct member with its default value.
209 * Input          : SDIO_CmdInitStruct: pointer to an SDIO_CmdInitTypeDef
210 *        structure which will be initialized.
211 * Return         : None
212 *******************************************************************************/
SDIO_CmdStructInit(SDIO_CmdInitTypeDef * SDIO_CmdInitStruct)213 void SDIO_CmdStructInit(SDIO_CmdInitTypeDef* SDIO_CmdInitStruct)
214 {
215   SDIO_CmdInitStruct->SDIO_Argument = 0x00;
216   SDIO_CmdInitStruct->SDIO_CmdIndex = 0x00;
217   SDIO_CmdInitStruct->SDIO_Response = SDIO_Response_No;
218   SDIO_CmdInitStruct->SDIO_Wait = SDIO_Wait_No;
219   SDIO_CmdInitStruct->SDIO_CPSM = SDIO_CPSM_Disable;
220 }
221 
222 /*******************************************************************************
223 * Function Name  : SDIO_GetCommandResponse
224 * Description    : Returns command index of last command for which response received.
225 * Input          : None
226 * Return         : Returns the command index of the last command response received.
227 *******************************************************************************/
SDIO_GetCommandResponse(void)228 uint8_t SDIO_GetCommandResponse(void)
229 {
230   return (uint8_t)(SDIO->RESPCMD);
231 }
232 
233 
234 /*******************************************************************************
235 * Function Name  : SDIO_GetResponse
236 * Description    : Returns response received from the card for the last command.
237 * Input          : SDIO_RESP: Specifies the SDIO response register.
238 *                    SDIO_RESP1: Response Register 1
239 *                    SDIO_RESP2: Response Register 2
240 *                    SDIO_RESP3: Response Register 3
241 *                    SDIO_RESP4: Response Register 4
242 * Return         : Returns the command index of the last command response received.
243 *******************************************************************************/
SDIO_GetResponse(uint32_t SDIO_RESP)244 uint32_t SDIO_GetResponse(uint32_t SDIO_RESP)
245 {
246   __IO uint32_t tmp = 0;
247 
248   tmp = SDIO_RESP_ADDR + SDIO_RESP;
249 
250   return (*(__IO uint32_t *) tmp);
251 }
252 
253 /*******************************************************************************
254 * Function Name  : SDIO_DataConfig
255 * Description    : Initializes the SDIO data path according to the specified
256 * Input          : SDIO_DataInitStruct : pointer to a SDIO_DataInitTypeDef structure that
257 *                    contains the configuration information for the SDIO command.
258 * Return         : None
259 *******************************************************************************/
SDIO_DataConfig(SDIO_DataInitTypeDef * SDIO_DataInitStruct)260 void SDIO_DataConfig(SDIO_DataInitTypeDef* SDIO_DataInitStruct)
261 {
262   uint32_t tmpreg = 0;
263 
264   SDIO->DTIMER = SDIO_DataInitStruct->SDIO_DataTimeOut;
265   SDIO->DLEN = SDIO_DataInitStruct->SDIO_DataLength;
266   tmpreg = SDIO->DCTRL;
267   tmpreg &= DCTRL_CLEAR_MASK;
268   tmpreg |= (uint32_t)SDIO_DataInitStruct->SDIO_DataBlockSize | SDIO_DataInitStruct->SDIO_TransferDir
269            | SDIO_DataInitStruct->SDIO_TransferMode | SDIO_DataInitStruct->SDIO_DPSM;
270 
271   SDIO->DCTRL = tmpreg;
272 }
273 
274 /*******************************************************************************
275 * Function Name  : SDIO_DataStructInit
276 * Description    : Fills each SDIO_DataInitStruct member with its default value.
277 * Input          : SDIO_DataInitStruct: pointer to an SDIO_DataInitTypeDef structure which
278 *                  will be initialized.
279 * Return         : None
280 *******************************************************************************/
SDIO_DataStructInit(SDIO_DataInitTypeDef * SDIO_DataInitStruct)281 void SDIO_DataStructInit(SDIO_DataInitTypeDef* SDIO_DataInitStruct)
282 {
283   SDIO_DataInitStruct->SDIO_DataTimeOut = 0xFFFFFFFF;
284   SDIO_DataInitStruct->SDIO_DataLength = 0x00;
285   SDIO_DataInitStruct->SDIO_DataBlockSize = SDIO_DataBlockSize_1b;
286   SDIO_DataInitStruct->SDIO_TransferDir = SDIO_TransferDir_ToCard;
287   SDIO_DataInitStruct->SDIO_TransferMode = SDIO_TransferMode_Block;
288   SDIO_DataInitStruct->SDIO_DPSM = SDIO_DPSM_Disable;
289 }
290 
291 /*******************************************************************************
292 * Function Name  : SDIO_GetDataCounter
293 * Description    : Returns number of remaining data bytes to be transferred.
294 * Input          : None
295 * Return         : Number of remaining data bytes to be transferred
296 *******************************************************************************/
SDIO_GetDataCounter(void)297 uint32_t SDIO_GetDataCounter(void)
298 {
299   return SDIO->DCOUNT;
300 }
301 
302 /*******************************************************************************
303 * Function Name  : SDIO_ReadData
304 * Description    : Read one data word from Rx FIFO.
305 * Input          : None
306 * Return         : Data received
307 *******************************************************************************/
SDIO_ReadData(void)308 uint32_t SDIO_ReadData(void)
309 {
310   return SDIO->FIFO;
311 }
312 
313 /*******************************************************************************
314 * Function Name  : SDIO_WriteData
315 * Description    : Write one data word to Tx FIFO.
316 * Input          : Data: 32-bit data word to write.
317 * Return         : None
318 *******************************************************************************/
SDIO_WriteData(uint32_t Data)319 void SDIO_WriteData(uint32_t Data)
320 {
321   SDIO->FIFO = Data;
322 }
323 
324 /*******************************************************************************
325 * Function Name  : SDIO_GetFIFOCount
326 * Description    : Returns the number of words left to be written to or read from FIFO.
327 * Input          : None
328 * Return         : Remaining number of words.
329 *******************************************************************************/
SDIO_GetFIFOCount(void)330 uint32_t SDIO_GetFIFOCount(void)
331 {
332   return SDIO->FIFOCNT;
333 }
334 
335 /*******************************************************************************
336 * Function Name  : SDIO_StartSDIOReadWait
337 * Description    : Starts the SD I/O Read Wait operation.
338 * Input          : NewState��ENABLE or DISABLE.
339 * Return         : None
340 *******************************************************************************/
SDIO_StartSDIOReadWait(FunctionalState NewState)341 void SDIO_StartSDIOReadWait(FunctionalState NewState)
342 {
343   if(NewState) SDIO->DCTRL |= ((uint32_t)1<<8);
344   else SDIO->DCTRL &= ~((uint32_t)1<<8);
345 }
346 
347 /*******************************************************************************
348 * Function Name  : SDIO_StopSDIOReadWait
349 * Description    : Stops the SD I/O Read Wait operation.
350 * Input          : NewState��ENABLE or DISABLE.
351 * Return         : None
352 *******************************************************************************/
SDIO_StopSDIOReadWait(FunctionalState NewState)353 void SDIO_StopSDIOReadWait(FunctionalState NewState)
354 {
355   if(NewState) SDIO->DCTRL |= ((uint32_t)1<<9);
356   else SDIO->DCTRL &= ~((uint32_t)1<<9);
357 
358 }
359 
360 /*******************************************************************************
361 * Function Name  : SDIO_SetSDIOReadWaitMode
362 * Description    : Sets one of the two options of inserting read wait interval.
363 * Input          : SDIO_ReadWaitMode: SD I/O Read Wait operation mode.
364 *                    SDIO_ReadWaitMode_CLK: Read Wait control by stopping SDIOCLK
365 *                    SDIO_ReadWaitMode_DATA2: Read Wait control using SDIO_DATA2
366 * Return         : None
367 *******************************************************************************/
SDIO_SetSDIOReadWaitMode(uint32_t SDIO_ReadWaitMode)368 void SDIO_SetSDIOReadWaitMode(uint32_t SDIO_ReadWaitMode)
369 {
370   if(SDIO_ReadWaitMode) SDIO->DCTRL |= ((uint32_t)1<<10);
371   else SDIO->DCTRL &= ~((uint32_t)1<<10);
372 }
373 
374 /*******************************************************************************
375 * Function Name  : SDIO_SetSDIOOperation
376 * Description    : Enables or disables the SD I/O Mode Operation.
377 * Input          : NewState: ENABLE or DISABLE.
378 * Return         : None
379 *******************************************************************************/
SDIO_SetSDIOOperation(FunctionalState NewState)380 void SDIO_SetSDIOOperation(FunctionalState NewState)
381 {
382   if(NewState) SDIO->DCTRL |= ((uint32_t)1<<11);
383   else SDIO->DCTRL &= ~((uint32_t)1<<11);
384 }
385 
386 /*******************************************************************************
387 * Function Name  : SDIO_SendSDIOSuspendCmd
388 * Description    : Enables or disables the SD I/O Mode suspend command sending.
389 * Input          : NewState: ENABLE or DISABLE.
390 * Return         : None
391 *******************************************************************************/
SDIO_SendSDIOSuspendCmd(FunctionalState NewState)392 void SDIO_SendSDIOSuspendCmd(FunctionalState NewState)
393 {
394   if(NewState) SDIO->CMD |= ((uint32_t)1<<11);
395   else SDIO->CMD &= ~((uint32_t)1<<11);
396 }
397 
398 /*******************************************************************************
399 * Function Name  : SDIO_CommandCompletionCmd
400 * Description    : Enables or disables the command completion signal.
401 * Input          : NewState: ENABLE or DISABLE.
402 * Return         : None
403 *******************************************************************************/
SDIO_CommandCompletionCmd(FunctionalState NewState)404 void SDIO_CommandCompletionCmd(FunctionalState NewState)
405 {
406   if(NewState) SDIO->CMD |= ((uint32_t)1<<12);
407   else SDIO->CMD &= ~((uint32_t)1<<12);
408 }
409 
410 /*******************************************************************************
411 * Function Name  : SDIO_CEATAITCmd
412 * Description    : Enables or disables the CE-ATA interrupt.
413 * Input          : NewState: ENABLE or DISABLE.
414 * Return         : None
415 *******************************************************************************/
SDIO_CEATAITCmd(FunctionalState NewState)416 void SDIO_CEATAITCmd(FunctionalState NewState)
417 {
418   if(NewState) SDIO->CMD |= ((uint32_t)1<<13);
419   else SDIO->CMD &= ~((uint32_t)1<<13);
420 }
421 
422 /*******************************************************************************
423 * Function Name  : SDIO_SendCEATACmd
424 * Description    : Sends CE-ATA command (CMD61).
425 * Input          : NewState: ENABLE or DISABLE.
426 * Return         : None
427 *******************************************************************************/
SDIO_SendCEATACmd(FunctionalState NewState)428 void SDIO_SendCEATACmd(FunctionalState NewState)
429 {
430   if(NewState) SDIO->CMD |= ((uint32_t)1<<14);
431   else SDIO->CMD &= ~((uint32_t)1<<14);
432 }
433 
434 /*******************************************************************************
435 * Function Name  : SDIO_GetFlagStatus
436 * Description    : Checks whether the specified SDIO flag is set or not.
437 * Input          : SDIO_FLAG: specifies the flag to check.
438 *                    SDIO_FLAG_CCRCFAIL: Command response received (CRC check failed)
439 *                    SDIO_FLAG_DCRCFAIL: Data block sent/received (CRC check failed)
440 *                    SDIO_FLAG_CTIMEOUT: Command response timeout
441 *                    SDIO_FLAG_DTIMEOUT: Data timeout
442 *                    SDIO_FLAG_TXUNDERR: Transmit FIFO underrun error
443 *                    SDIO_FLAG_RXOVERR:  Received FIFO overrun error
444 *                    SDIO_FLAG_CMDREND:  Command response received (CRC check passed)
445 *                    SDIO_FLAG_CMDSENT:  Command sent (no response required)
446 *                    SDIO_FLAG_DATAEND:  Data end (data counter, SDIDCOUNT, is zero)
447 *                    SDIO_FLAG_STBITERR: Start bit not detected on all data signals in wide
448 *                              bus mode.
449 *                    SDIO_FLAG_DBCKEND:  Data block sent/received (CRC check passed)
450 *                    SDIO_FLAG_CMDACT:   Command transfer in progress
451 *                    SDIO_FLAG_TXACT:    Data transmit in progress
452 *                    SDIO_FLAG_RXACT:    Data receive in progress
453 *                    SDIO_FLAG_TXFIFOHE: Transmit FIFO Half Empty
454 *                    SDIO_FLAG_RXFIFOHF: Receive FIFO Half Full
455 *                    SDIO_FLAG_TXFIFOF:  Transmit FIFO full
456 *                    SDIO_FLAG_RXFIFOF:  Receive FIFO full
457 *                    SDIO_FLAG_TXFIFOE:  Transmit FIFO empty
458 *                    SDIO_FLAG_RXFIFOE:  Receive FIFO empty
459 *                    SDIO_FLAG_TXDAVL:   Data available in transmit FIFO
460 *                    SDIO_FLAG_RXDAVL:   Data available in receive FIFO
461 *                    SDIO_FLAG_SDIOIT:   SD I/O interrupt received
462 *                    SDIO_FLAG_CEATAEND: CE-ATA command completion signal received for CMD61
463 * Return         : ITStatus��SET or RESET
464 *******************************************************************************/
SDIO_GetFlagStatus(uint32_t SDIO_FLAG)465 FlagStatus SDIO_GetFlagStatus(uint32_t SDIO_FLAG)
466 {
467   FlagStatus bitstatus = RESET;
468 
469   if ((SDIO->STA & SDIO_FLAG) != (uint32_t)RESET)
470   {
471     bitstatus = SET;
472   }
473   else
474   {
475     bitstatus = RESET;
476   }
477   return bitstatus;
478 }
479 
480 
481 /*******************************************************************************
482 * Function Name  : SDIO_ClearFlag
483 * Description    : Clears the SDIO's pending flags.
484 * Input          : SDIO_FLAG: specifies the flag to clear.
485 *                    SDIO_FLAG_CCRCFAIL: Command response received (CRC check failed)
486 *                    SDIO_FLAG_DCRCFAIL: Data block sent/received (CRC check failed)
487 *                    SDIO_FLAG_CTIMEOUT: Command response timeout
488 *                    SDIO_FLAG_DTIMEOUT: Data timeout
489 *                    SDIO_FLAG_TXUNDERR: Transmit FIFO underrun error
490 *                    SDIO_FLAG_RXOVERR:  Received FIFO overrun error
491 *                    SDIO_FLAG_CMDREND:  Command response received (CRC check passed)
492 *                    SDIO_FLAG_CMDSENT:  Command sent (no response required)
493 *                    SDIO_FLAG_DATAEND:  Data end (data counter, SDIDCOUNT, is zero)
494 *                    SDIO_FLAG_STBITERR: Start bit not detected on all data signals in wide
495 *                              bus mode
496 *                    SDIO_FLAG_DBCKEND:  Data block sent/received (CRC check passed)
497 *                    SDIO_FLAG_SDIOIT:   SD I/O interrupt received
498 *                    SDIO_FLAG_CEATAEND: CE-ATA command completion signal received for CMD61
499 * Return         : None
500 *******************************************************************************/
SDIO_ClearFlag(uint32_t SDIO_FLAG)501 void SDIO_ClearFlag(uint32_t SDIO_FLAG)
502 {
503   SDIO->ICR = SDIO_FLAG;
504 }
505 
506 /*******************************************************************************
507 * Function Name  : SDIO_GetITStatus
508 * Description    : Checks whether the specified SDIO interrupt has occurred or not.
509 * Input          : SDIO_IT: specifies the SDIO interrupt source to check.
510 *                    SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt
511 *                    SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt
512 *                    SDIO_IT_CTIMEOUT: Command response timeout interrupt
513 *                    SDIO_IT_DTIMEOUT: Data timeout interrupt
514 *                    SDIO_IT_TXUNDERR: Transmit FIFO underrun error interrupt
515 *                    SDIO_IT_RXOVERR:  Received FIFO overrun error interrupt
516 *                    SDIO_IT_CMDREND:  Command response received (CRC check passed) interrupt
517 *                    SDIO_IT_CMDSENT:  Command sent (no response required) interrupt
518 *                    SDIO_IT_DATAEND:  Data end (data counter, SDIDCOUNT, is zero) interrupt
519 *                    SDIO_IT_STBITERR: Start bit not detected on all data signals in wide
520 *                            bus mode interrupt
521 *                    SDIO_IT_DBCKEND:  Data block sent/received (CRC check passed) interrupt
522 *                    SDIO_IT_CMDACT:   Command transfer in progress interrupt
523 *                    SDIO_IT_TXACT:    Data transmit in progress interrupt
524 *                    SDIO_IT_RXACT:    Data receive in progress interrupt
525 *                    SDIO_IT_TXFIFOHE: Transmit FIFO Half Empty interrupt
526 *                    SDIO_IT_RXFIFOHF: Receive FIFO Half Full interrupt
527 *                    SDIO_IT_TXFIFOF:  Transmit FIFO full interrupt
528 *                    SDIO_IT_RXFIFOF:  Receive FIFO full interrupt
529 *                    SDIO_IT_TXFIFOE:  Transmit FIFO empty interrupt
530 *                    SDIO_IT_RXFIFOE:  Receive FIFO empty interrupt
531 *                    SDIO_IT_TXDAVL:   Data available in transmit FIFO interrupt
532 *                    SDIO_IT_RXDAVL:   Data available in receive FIFO interrupt
533 *                    SDIO_IT_SDIOIT:   SD I/O interrupt received interrupt
534 *                    SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 interrupt
535 * Return         : ITStatus��SET or RESET
536 *******************************************************************************/
SDIO_GetITStatus(uint32_t SDIO_IT)537 ITStatus SDIO_GetITStatus(uint32_t SDIO_IT)
538 {
539   ITStatus bitstatus = RESET;
540 
541   if ((SDIO->STA & SDIO_IT) != (uint32_t)RESET)
542   {
543     bitstatus = SET;
544   }
545   else
546   {
547     bitstatus = RESET;
548   }
549   return bitstatus;
550 }
551 
552 /*******************************************************************************
553 * Function Name  : SDIO_ClearITPendingBit
554 * Description    : Clears the SDIO's interrupt pending bits.
555 * Input          : SDIO_IT: specifies the interrupt pending bit to clear.
556 *                    SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt
557 *                    SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt
558 *                    SDIO_IT_CTIMEOUT: Command response timeout interrupt
559 *                    SDIO_IT_DTIMEOUT: Data timeout interrupt
560 *                    SDIO_IT_TXUNDERR: Transmit FIFO underrun error interrupt
561 *                    SDIO_IT_RXOVERR:  Received FIFO overrun error interrupt
562 *                    SDIO_IT_CMDREND:  Command response received (CRC check passed) interrupt
563 *                    SDIO_IT_CMDSENT:  Command sent (no response required) interrupt
564 *                    SDIO_IT_DATAEND:  Data end (data counter, SDIDCOUNT, is zero) interrupt
565 *                    SDIO_IT_STBITERR: Start bit not detected on all data signals in wide
566 *                            bus mode interrupt
567 *                    SDIO_IT_SDIOIT:   SD I/O interrupt received interrupt
568 *                    SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61
569 * Return         : None
570 *******************************************************************************/
SDIO_ClearITPendingBit(uint32_t SDIO_IT)571 void SDIO_ClearITPendingBit(uint32_t SDIO_IT)
572 {
573   SDIO->ICR = SDIO_IT;
574 }
575