ch32v30x_sdio.c 21 KB

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