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