gd32f10x_sdio.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636
  1. /**
  2. ******************************************************************************
  3. * @brief SDIO functions of the firmware library.
  4. ******************************************************************************
  5. */
  6. #ifdef GD32F10X_HD
  7. /* Includes ------------------------------------------------------------------*/
  8. #include "gd32f10x_sdio.h"
  9. #include "gd32f10x_rcc.h"
  10. /** @addtogroup GD32F10x_Firmware
  11. * @{
  12. */
  13. /** @defgroup SDIO
  14. * @brief SDIO driver modules
  15. * @{
  16. */
  17. /** @defgroup SDIO_Private_Defines
  18. * @{
  19. */
  20. /* SDIO registers bit mask */
  21. /* CLKCTLR register mask */
  22. #define CLKCTLR_CLEAR_MASK ((uint32_t)0xFFFF8100)
  23. /* POWER_PWRSTATE mask */
  24. #define POWER_PWRSTATE_MASK ((uint32_t)0xFFFFFFFC)
  25. /* DTCTLR register mask */
  26. #define DTCTLR_CLEAR_MASK ((uint32_t)0xFFFFFF08)
  27. /* CMD register mask */
  28. #define CMD_CLEAR_MASK ((uint32_t)0xFFFFF800)
  29. /* SDIO RESP Registers Address */
  30. #define SDIO_RESP_ADDR ((uint32_t)(SDIO_BASE + 0x14))
  31. /**
  32. * @}
  33. */
  34. /** @defgroup SDIO_Private_Functions
  35. * @{
  36. */
  37. /**
  38. * @brief Deinitialize the SDIO .
  39. * @param None
  40. * @retval None
  41. */
  42. void SDIO_DeInit(void)
  43. {
  44. SDIO->POWER = 0x00000000;
  45. SDIO->CLKCTLR = 0x00000000;
  46. SDIO->PARA = 0x00000000;
  47. SDIO->CMD = 0x00000000;
  48. SDIO->DTTR = 0x00000000;
  49. SDIO->DTLEN = 0x00000000;
  50. SDIO->DTCTLR = 0x00000000;
  51. SDIO->ICR = 0x00C007FF;
  52. SDIO->IER = 0x00000000;
  53. }
  54. /**
  55. * @brief Initialize the SDIO .
  56. * @param SDIO_InitParaStruct : pointer to a SDIO_InitPara structure .
  57. * @retval None
  58. */
  59. void SDIO_Init(SDIO_InitPara *SDIO_InitParaStruct)
  60. {
  61. uint32_t temp = 0;
  62. /* SDIO CLKCTLR Configuration */
  63. /* Get the SDIO CLKCTLR value */
  64. temp = SDIO->CLKCTLR;
  65. /* Clear CLKCTLR register */
  66. temp &= CLKCTLR_CLEAR_MASK;
  67. /* Configure the SDIO_ClockDiv value */
  68. /* Configure the SDIO_ClockPWRSave value */
  69. /* Configure the SDIO_ClockBypassState value */
  70. /* Configure the SDIO_BusMode value */
  71. /* Configure the SDIO_ClockEdge value */
  72. /* Configure the SDIO_HWFlowCtrlState value */
  73. temp |= (SDIO_InitParaStruct->SDIO_ClockDiv | SDIO_InitParaStruct->SDIO_ClockPWRSave |
  74. SDIO_InitParaStruct->SDIO_ClockBypassState | SDIO_InitParaStruct->SDIO_BusMode |
  75. SDIO_InitParaStruct->SDIO_ClockEdge | SDIO_InitParaStruct->SDIO_HWFlowCtrlState);
  76. /* Update the SDIO CLKCTLR */
  77. SDIO->CLKCTLR = temp;
  78. }
  79. /**
  80. * @brief Fill each SDIO_InitParaStruct Struct member with a default value.
  81. * @param SDIO_InitParaStruct: pointer to an SDIO_InitPara structure.
  82. * @retval None
  83. */
  84. void SDIO_ParaInit(SDIO_InitPara *SDIO_InitParaStruct)
  85. {
  86. /* Fill the default value */
  87. SDIO_InitParaStruct->SDIO_ClockDiv = 0x00;
  88. SDIO_InitParaStruct->SDIO_ClockEdge = SDIO_CLOCKEDGE_RISING;
  89. SDIO_InitParaStruct->SDIO_ClockBypassState = SDIO_CLOCKBYPASSSTATE_DISABLE;
  90. SDIO_InitParaStruct->SDIO_ClockPWRSave = SDIO_CLOCKPWRSAVE_DISABLE;
  91. SDIO_InitParaStruct->SDIO_BusMode = SDIO_BUSMODE_1B;
  92. SDIO_InitParaStruct->SDIO_HWFlowCtrlState = SDIO_HWFLOWCTRLSTATE_DISABLE;
  93. }
  94. /**
  95. * @brief ENABLE or DISABLE the SDIO Clock.
  96. * @param NewValue: ENABLE or DISABLE.
  97. * @retval None
  98. */
  99. void SDIO_Clock_Enable(TypeState NewValue)
  100. {
  101. if (NewValue != DISABLE) {
  102. SDIO->CLKCTLR |= SDIO_CLKCTLR_CKEN;
  103. } else {
  104. SDIO->CLKCTLR &= (uint16_t)~(SDIO_CLKCTLR_CKEN);
  105. }
  106. }
  107. /**
  108. * @brief Configure the power state of SDIO.
  109. * @param SDIO_PwrState: new Power state for SDIO.
  110. * This value will be :
  111. * @arg SDIO_PWRSTATE_ON
  112. * @arg SDIO_PWRSTATE_OFF
  113. * @retval None
  114. */
  115. void SDIO_SetPWRState(uint32_t SDIO_PwrState)
  116. {
  117. /* Update the SDIO POWER */
  118. SDIO->POWER |= SDIO_PwrState;
  119. }
  120. /**
  121. * @brief Get the power state of SDIO.
  122. * @param None
  123. * @retval Power state for SDIO.
  124. * This value will be :
  125. * - 0x00: Power OFF
  126. * - 0x02: Power UP
  127. * - 0x03: Power ON
  128. */
  129. uint32_t SDIO_GetPWRState(void)
  130. {
  131. return (SDIO->POWER & (~POWER_PWRSTATE_MASK));
  132. }
  133. /**
  134. * @brief Configure interrupts enables.
  135. * @param SDIO_INT: The interrupts sources to configure.
  136. * This value will be :
  137. * @arg SDIO_INT_CCRCFAIL: Command response CRC failed interrupt
  138. * @arg SDIO_INT_DTCRCFAIL: Data CRC failed interrupt
  139. * @arg SDIO_INT_CMDTMOUT: Command response timeout interrupt
  140. * @arg SDIO_INT_DTTMOUT: Data timeout interrupt
  141. * @arg SDIO_INT_TXURE: Transmit FIFO underrun error interrupt
  142. * @arg SDIO_INT_RXORE: Received FIFO overrun error interrupt
  143. * @arg SDIO_INT_CMDREND: Command response received (CRC check passed) interrupt
  144. * @arg SDIO_INT_CMDSENT: Command sent (no response required) interrupt
  145. * @arg SDIO_INT_DTEND: Data end (data counter, SDIDTCNT, is zero) interrupt
  146. * @arg SDIO_INT_STBITE: Start bit not detected on all data signals in wide bus mode interrupt
  147. * @arg SDIO_INT_DTBLKEND: Data block sent/received (CRC check passed) interrupt
  148. * @arg SDIO_INT_CMDRUN: Command transfer in progress interrupt
  149. * @arg SDIO_INT_TXRUN: Data transmit in progress interrupt
  150. * @arg SDIO_INT_RXRUN: Data receive in progress interrupt
  151. * @arg SDIO_INT_TXFIFOHE: Transmit FIFO Half Empty interrupt
  152. * @arg SDIO_INT_RXFIFOHF: Receive FIFO Half Full interrupt
  153. * @arg SDIO_INT_TXFIFOF: Transmit FIFO full interrupt
  154. * @arg SDIO_INT_RXFIFOF: Receive FIFO full interrupt
  155. * @arg SDIO_INT_TXFIFOE: Transmit FIFO empty interrupt
  156. * @arg SDIO_INT_RXFIFOE: Receive FIFO empty interrupt
  157. * @arg SDIO_INT_TXDTVAL: Data valid in transmit FIFO interrupt
  158. * @arg SDIO_INT_RXDTVAL: Data valid in receive FIFO interrupt
  159. * @arg SDIO_INT_SDIOINT: SD I/O interrupt received interrupt
  160. * @arg SDIO_INT_ATAEND: CE-ATA command completion signal received for CMD61 interrupt
  161. * @param NewValue: ENABLE or DISABLE.
  162. * @retval None
  163. */
  164. void SDIO_INTConfig(uint32_t SDIO_INT, TypeState NewValue)
  165. {
  166. if (NewValue != DISABLE) {
  167. /* Enable the interrupt */
  168. SDIO->IER |= SDIO_INT;
  169. } else {
  170. /* Disable the interrupt */
  171. SDIO->IER &= ~SDIO_INT;
  172. }
  173. }
  174. /**
  175. * @brief Enable or disable the DMA request for SDIO.
  176. * @param NewValue: ENABLE or DISABLE.
  177. * @retval None
  178. */
  179. void SDIO_DMA_Enable(TypeState NewValue)
  180. {
  181. if (NewValue != DISABLE) {
  182. /* Enable DMA request */
  183. SDIO->DTCTLR |= SDIO_DTCTLR_DMAEN;
  184. } else {
  185. /* Disenable DMA request */
  186. SDIO->DTCTLR &= (uint16_t)~((uint16_t)SDIO_DTCTLR_DMAEN);
  187. }
  188. }
  189. /**
  190. * @brief Initialize the SDIO Command.
  191. * @param SDIO_CmdInitParaStruct : pointer to a SDIO_CmdInitPara structure.
  192. * @retval None
  193. */
  194. void SDIO_SendCMD(SDIO_CmdInitPara *SDIO_CmdInitParaStruct)
  195. {
  196. uint32_t temp = 0;
  197. /* SDIO PARA Configuration */
  198. /* Configure the SDIO_CMDParameter value */
  199. SDIO->PARA = SDIO_CmdInitParaStruct->SDIO_CMDParameter;
  200. /* SDIO CMD Configuration */
  201. /* Get the SDIO CMD value */
  202. temp = SDIO->CMD;
  203. /* Clear CMD register */
  204. temp &= CMD_CLEAR_MASK;
  205. /* Configure the SDIO_CMDIndex value */
  206. /* Configure the SDIO_ResponseType value */
  207. /* Configure the SDIO_WaitINTState value */
  208. /* Configure the SDIO_CSMState value */
  209. temp |= (uint32_t)SDIO_CmdInitParaStruct->SDIO_CMDIndex | SDIO_CmdInitParaStruct->SDIO_ResponseType
  210. | SDIO_CmdInitParaStruct->SDIO_WaitINTState | SDIO_CmdInitParaStruct->SDIO_CSMState;
  211. /* Update the SDIO CMD */
  212. SDIO->CMD = temp;
  213. }
  214. /**
  215. * @brief Fill SDIO_CmdInitStruct member with a default value.
  216. * @param SDIO_CmdInitParaStruct: pointer to an SDIO_CmdInitPara structure.
  217. * @retval None
  218. */
  219. void SDIO_CMDParaInit(SDIO_CmdInitPara *SDIO_CmdInitParaStruct)
  220. {
  221. /* Fill the default value */
  222. SDIO_CmdInitParaStruct->SDIO_CMDParameter = 0x00;
  223. SDIO_CmdInitParaStruct->SDIO_CMDIndex = 0x00;
  224. SDIO_CmdInitParaStruct->SDIO_ResponseType = SDIO_RESPONSETYPE_NO ;
  225. SDIO_CmdInitParaStruct->SDIO_WaitINTState = SDIO_WAITINTSTATE_NO;
  226. SDIO_CmdInitParaStruct->SDIO_CSMState = SDIO_CSMSTATE_DISABLE;
  227. }
  228. /**
  229. * @brief Return last response command index.
  230. * @param None
  231. * @retval Return last response command index.
  232. */
  233. uint8_t SDIO_GetCMDResponse(void)
  234. {
  235. return (uint8_t)(SDIO->RESPCMD);
  236. }
  237. /**
  238. * @brief Return the response for the last received command.
  239. * @param SDIO_RESP: The SDIO response registers.
  240. * This value will be :
  241. * @arg SDIO_RESP1: Response Register 1
  242. * @arg SDIO_RESP2: Response Register 2
  243. * @arg SDIO_RESP3: Response Register 3
  244. * @arg SDIO_RESP4: Response Register 4
  245. * @retval The Corresponding response register value.
  246. */
  247. uint32_t SDIO_GetResponse(uint32_t SDIO_RESP)
  248. {
  249. __IO uint32_t temp = 0;
  250. temp = SDIO_RESP_ADDR + SDIO_RESP;
  251. return (*(__IO uint32_t *) temp);
  252. }
  253. /**
  254. * @brief Initialize the SDIO SDIO_DataInitParaStruct members.
  255. * @param SDIO_DataInitParaStruct : pointer to a SDIO_DataInitPara structure.
  256. * @retval None
  257. */
  258. void SDIO_DataConfig(SDIO_DataInitPara *SDIO_DataInitParaStruct)
  259. {
  260. uint32_t temp = 0;
  261. /* SDIO DTTR Configuration */
  262. /* Set the SDIO SDIO_DataTimeOut value */
  263. SDIO->DTTR = SDIO_DataInitParaStruct->SDIO_DataTimeOut;
  264. /* SDIO DTLEN Configuration */
  265. /* Set the SDIO SDIO_DataLength value */
  266. SDIO->DTLEN = SDIO_DataInitParaStruct->SDIO_DataLength;
  267. /* SDIO DTCTLR Configuration */
  268. /* Get the SDIO DTCTLR value */
  269. temp = SDIO->DTCTLR;
  270. /* Clear DTCTLR register */
  271. temp &= DTCTLR_CLEAR_MASK;
  272. /* Configure the SDIO_DataBlockSize value */
  273. /* Configure the SDIO_TransDirection value */
  274. /* Configure the SDIO_TransMode value */
  275. /* Configure the SDIO_DSMState value */
  276. temp |= (uint32_t)SDIO_DataInitParaStruct->SDIO_DataBlockSize | SDIO_DataInitParaStruct->SDIO_TransDirection
  277. | SDIO_DataInitParaStruct->SDIO_TransMode | SDIO_DataInitParaStruct->SDIO_DSMState;
  278. /* Update the SDIO DTCTLR */
  279. SDIO->DTCTLR = temp;
  280. }
  281. /**
  282. * @brief Fill each SDIO_DataInitParaStruct member with a default value.
  283. * @param SDIO_DataInitParaStruct: pointer to an SDIO_DataInitPara structure.
  284. * @retval None
  285. */
  286. void SDIO_DataParaInit(SDIO_DataInitPara *SDIO_DataInitParaStruct)
  287. {
  288. /* Fill the default value */
  289. SDIO_DataInitParaStruct->SDIO_DataTimeOut = 0xFFFFFFFF;
  290. SDIO_DataInitParaStruct->SDIO_DataLength = 0x00;
  291. SDIO_DataInitParaStruct->SDIO_DataBlockSize = SDIO_DATABLOCKSIZE_1B;
  292. SDIO_DataInitParaStruct->SDIO_TransDirection = SDIO_TRANSDIRECTION_TOCARD;
  293. SDIO_DataInitParaStruct->SDIO_TransMode = SDIO_TRANSMODE_BLOCK;
  294. SDIO_DataInitParaStruct->SDIO_DSMState = SDIO_DSMSTATE_DISABLE;
  295. }
  296. /**
  297. * @brief Return the number of remaining data bytes to be transferred to card.
  298. * @param None
  299. * @retval Number of remaining data bytes to be transferred
  300. */
  301. uint32_t SDIO_GetDataCount(void)
  302. {
  303. return SDIO->DTCNT;
  304. }
  305. /**
  306. * @brief Read one word from receive FIFO.
  307. * @param None
  308. * @retval Data received
  309. */
  310. uint32_t SDIO_ReadData(void)
  311. {
  312. return SDIO->FIFO;
  313. }
  314. /**
  315. * @brief Write one word to transmit FIFO.
  316. * @param Data: 32-bit data write to the card.
  317. * @retval None
  318. */
  319. void SDIO_WriteData(uint32_t Data)
  320. {
  321. SDIO->FIFO = Data;
  322. }
  323. /**
  324. * @brief Return the number of words remaining to be written or read from FIFO.
  325. * @param None
  326. * @retval Remaining number of words.
  327. */
  328. uint32_t SDIO_GetFIFOCount(void)
  329. {
  330. return SDIO->FIFOCNT;
  331. }
  332. /**
  333. * @brief Start SD I/O Read Wait operation.
  334. * @param NewValue: ENABLE or DISABLE.
  335. * @retval None
  336. */
  337. void SDIO_StartSDIOReadWait(TypeState NewValue)
  338. {
  339. if (NewValue != DISABLE) {
  340. /* Start Read Wait operation */
  341. SDIO->DTCTLR |= SDIO_DTCTLR_RWSTART;
  342. } else {
  343. SDIO->DTCTLR &= (uint16_t)~((uint16_t)SDIO_DTCTLR_RWSTART);
  344. }
  345. }
  346. /**
  347. * @brief Stop the SD I/O Read Wait operation.
  348. * @param NewValue: ENABLE or DISABLE.
  349. * @retval None
  350. */
  351. void SDIO_StopSDIOReadWait(TypeState NewValue)
  352. {
  353. if (NewValue != DISABLE) {
  354. SDIO->DTCTLR |= SDIO_DTCTLR_RWSTOP;
  355. } else {
  356. /* Stop Read Wait operation */
  357. SDIO->DTCTLR &= (uint16_t)~((uint16_t)SDIO_DTCTLR_RWSTOP);
  358. }
  359. }
  360. /**
  361. * @brief Configure the SD I/O read wait mode.
  362. * @param SDIO_ReadWaitMode: SD I/O Read Wait operation mode.
  363. * This value will be :
  364. * @arg SDIO_READWAITMODE_CLK: Read Wait operation realize by stopping SDIOCLK
  365. * @arg SDIO_READWAITMODE_DAT2: Read Wait operation use SDIO_DAT2
  366. * @retval None
  367. */
  368. void SDIO_SetSDIOReadWaitMode(uint32_t SDIO_ReadWaitMode)
  369. {
  370. if (SDIO_ReadWaitMode == SDIO_READWAITMODE_CLK) {
  371. /* Read Wait operation stop SDIOCLK */
  372. SDIO->DTCTLR |= SDIO_DTCTLR_RWMODE;
  373. } else {
  374. /* Read Wait operation use SDIO_DAT2 */
  375. SDIO->DTCTLR &= (uint16_t)~((uint16_t)SDIO_DTCTLR_RWMODE);
  376. }
  377. }
  378. /**
  379. * @brief SD I/O Mode Operation configuration.
  380. * @param NewValue: ENABLE or DISABLE.
  381. * @retval None
  382. */
  383. void SDIO_SetSDIOOperation(TypeState NewValue)
  384. {
  385. if (NewValue != DISABLE) {
  386. /* Enable I/O Mode Operation */
  387. SDIO->DTCTLR |= SDIO_DTCTLR_SDIOEN;
  388. } else {
  389. /* Disenable I/O Mode Operation */
  390. SDIO->DTCTLR &= (uint16_t)~((uint16_t)SDIO_DTCTLR_SDIOEN);
  391. }
  392. }
  393. /**
  394. * @brief Enable or disable the SD I/O suspend operation.
  395. * @param NewValue: ENABLE or DISABLE.
  396. * @retval None
  397. */
  398. void SDIO_SendSDIOSuspend_Enable(TypeState NewValue)
  399. {
  400. if (NewValue != DISABLE) {
  401. /* Enable suspend operation */
  402. SDIO->CMD |= SDIO_CMD_SDIOSUSPEND;
  403. } else {
  404. /* Disenable suspend operation */
  405. SDIO->CMD &= (uint16_t)~((uint16_t)SDIO_CMD_SDIOSUSPEND);
  406. }
  407. }
  408. /**
  409. * @brief Enable or disable the CE-ATA command completion signal.
  410. * @param NewValue: ENABLE or DISABLE.
  411. * @retval None
  412. */
  413. void SDIO_CMDCompletion_Enable(TypeState NewValue)
  414. {
  415. if (NewValue != DISABLE) {
  416. /* Enable CE-ATA command completion signal */
  417. SDIO->CMD |= SDIO_CMD_ENCMDC;
  418. } else {
  419. /* Disenable CE-ATA command completion signal */
  420. SDIO->CMD &= (uint16_t)~((uint16_t)SDIO_CMD_ENCMDC);
  421. }
  422. }
  423. /**
  424. * @brief Enable or disable the CE-ATA interrupt.
  425. * @param NewValue: ENABLE or DISABLE.
  426. * @retval None
  427. */
  428. void SDIO_CEATAInt_Enable(TypeState NewValue)
  429. {
  430. if (NewValue != ENABLE) {
  431. /* Enable CE-ATA interrupt */
  432. SDIO->CMD |= SDIO_CMD_NIEN;
  433. } else {
  434. /* Disenable CE-ATA interrupt */
  435. SDIO->CMD &= (uint16_t)~((uint16_t)SDIO_CMD_NIEN);
  436. }
  437. }
  438. /**
  439. * @brief Send CE-ATA command (CMD61).
  440. * @param NewValue: ENABLE or DISABLE.
  441. * @retval None
  442. */
  443. void SDIO_SendCEATA_Enable(TypeState NewValue)
  444. {
  445. if (NewValue != DISABLE) {
  446. SDIO->CMD |= SDIO_CMD_ATACMD;
  447. } else {
  448. SDIO->CMD &= (uint16_t)~((uint16_t)SDIO_CMD_ATACMD);
  449. }
  450. }
  451. /**
  452. * @brief Check whether the flag is set or not.
  453. * @param SDIO_FLAG: the flag to check.
  454. * This value will be :
  455. * @arg SDIO_FLAG_CCRCFAIL: Command response received (CRC failed)
  456. * @arg SDIO_FLAG_DTCRCFAIL: Data block sent/received (CRC failed)
  457. * @arg SDIO_FLAG_CMDTMOUT: Command response timeout
  458. * @arg SDIO_FLAG_DTTMOUT: Data timeout
  459. * @arg SDIO_FLAG_TXURE: Transmit FIFO underrun error
  460. * @arg SDIO_FLAG_RXORE: Received FIFO overrun error
  461. * @arg SDIO_FLAG_CMDREND: Command response received (CRC check passed)
  462. * @arg SDIO_FLAG_CMDSENT: Command sent (no response required)
  463. * @arg SDIO_FLAG_DTEND: Data end (data counter, SDIDTCNT, is zero)
  464. * @arg SDIO_FLAG_STBITE: Start bit not detected on all data signals in wide
  465. * bus mode.
  466. * @arg SDIO_FLAG_DTBLKEND: Data block sent/received (CRC check passed)
  467. * @arg SDIO_FLAG_CMDRUN: Command transfer in progress
  468. * @arg SDIO_FLAG_TXRUN: Data transmit in progress
  469. * @arg SDIO_FLAG_RXRUN: Data receive in progress
  470. * @arg SDIO_FLAG_TXFIFOHE: Transmit FIFO Half Empty
  471. * @arg SDIO_FLAG_RXFIFOHF: Receive FIFO Half Full
  472. * @arg SDIO_FLAG_TXFIFOF: Transmit FIFO full
  473. * @arg SDIO_FLAG_RXFIFOF: Receive FIFO full
  474. * @arg SDIO_FLAG_TXFIFOE: Transmit FIFO empty
  475. * @arg SDIO_FLAG_RXFIFOE: Receive FIFO empty
  476. * @arg SDIO_FLAG_TXDTVAL: Data available in transmit FIFO
  477. * @arg SDIO_FLAG_RXDTVAL: Data available in receive FIFO
  478. * @arg SDIO_FLAG_SDIOINT: SD I/O interrupt received
  479. * @arg SDIO_FLAG_ATAEND: CE-ATA command completion signal received for CMD61
  480. * @retval The new state of SDIO_FLAG (SET or RESET).
  481. */
  482. TypeState SDIO_GetBitState(uint32_t SDIO_FLAG)
  483. {
  484. if ((SDIO->STR & SDIO_FLAG) != (uint32_t)RESET) {
  485. return SET;
  486. } else {
  487. return RESET;
  488. }
  489. }
  490. /**
  491. * @brief Clear the pending flags.
  492. * @param SDIO_FLAG: the flag to clear.
  493. * This value will be :
  494. * @arg SDIO_FLAG_CCRCFAIL: Command response received (CRC check failed)
  495. * @arg SDIO_FLAG_DTCRCFAIL: Data block sent/received (CRC check failed)
  496. * @arg SDIO_FLAG_CMDTMOUT: Command response timeout
  497. * @arg SDIO_FLAG_DTTMOUT: Data timeout
  498. * @arg SDIO_FLAG_TXURE: Transmit FIFO underrun error
  499. * @arg SDIO_FLAG_RXORE: Received FIFO overrun error
  500. * @arg SDIO_FLAG_CMDREND: Command response received (CRC check passed)
  501. * @arg SDIO_FLAG_CMDSENT: Command sent (no response required)
  502. * @arg SDIO_FLAG_DTEND: Data end (data counter, SDIO_DTCNT, is zero)
  503. * @arg SDIO_FLAG_STBITE: Start bit not detected on all data signals in wide bus mode
  504. * @arg SDIO_FLAG_DTBLKEND: Data block sent/received (CRC check passed)
  505. * @arg SDIO_FLAG_SDIOINT: SD I/O interrupt received
  506. * @arg SDIO_FLAG_ATAEND: CE-ATA command completion signal received for CMD61
  507. * @retval None
  508. */
  509. void SDIO_ClearBitState(uint32_t SDIO_FLAG)
  510. {
  511. SDIO->ICR = SDIO_FLAG;
  512. }
  513. /**
  514. * @brief Check whether the interrupt is pending or not.
  515. * @param SDIO_INT: the SDIO interrupt source to check.
  516. * This value will be :
  517. * @arg SDIO_INT_CCRCFAIL: Command response received (CRC check failed) interrupt
  518. * @arg SDIO_INT_DTCRCFAIL: Data block sent/received (CRC check failed) interrupt
  519. * @arg SDIO_INT_CMDTMOUT: Command response timeout interrupt
  520. * @arg SDIO_INT_DTTMOUT: Data timeout interrupt
  521. * @arg SDIO_INT_TXURE: Transmit FIFO underrun error interrupt
  522. * @arg SDIO_INT_RXORE: Received FIFO overrun error interrupt
  523. * @arg SDIO_INT_CMDREND: Command response received (CRC check passed) interrupt
  524. * @arg SDIO_INT_CMDSENT: Command sent (no response required) interrupt
  525. * @arg SDIO_INT_DTEND: Data end (data counter, SDIDTCNT, is zero) interrupt
  526. * @arg SDIO_INT_STBITE: Start bit not detected on all data signals in wide bus mode interrupt
  527. * @arg SDIO_INT_DTBLKEND: Data block sent/received (CRC check passed) interrupt
  528. * @arg SDIO_INT_CMDRUN: Command transfer in progress interrupt
  529. * @arg SDIO_INT_TXRUN: Data transmit in progress interrupt
  530. * @arg SDIO_INT_RXRUN: Data receive in progress interrupt
  531. * @arg SDIO_INT_TXFIFOHE: Transmit FIFO Half Empty interrupt
  532. * @arg SDIO_INT_RXFIFOHF: Receive FIFO Half Full interrupt
  533. * @arg SDIO_INT_TXFIFOF: Transmit FIFO full interrupt
  534. * @arg SDIO_INT_RXFIFOF: Receive FIFO full interrupt
  535. * @arg SDIO_INT_TXFIFOE: Transmit FIFO empty interrupt
  536. * @arg SDIO_INT_RXFIFOE: Receive FIFO empty interrupt
  537. * @arg SDIO_INT_TXDTVAL: Data available in transmit FIFO interrupt
  538. * @arg SDIO_INT_RXDTVAL: Data available in receive FIFO interrupt
  539. * @arg SDIO_INT_SDIOINT: SD I/O interrupt received interrupt
  540. * @arg SDIO_INT_ATAEND: CE-ATA command completion signal received for CMD61 interrupt
  541. * @retval The new state of SDIO_INT (SET or RESET).
  542. */
  543. TypeState SDIO_GetIntBitState(uint32_t SDIO_INT)
  544. {
  545. if ((SDIO->STR & SDIO_INT) != (uint32_t)RESET) {
  546. return SET;
  547. } else {
  548. return RESET;
  549. }
  550. }
  551. /**
  552. * @brief Clear the interrupt pending bits.
  553. * @param SDIO_INT: the interrupt pending bit to clear.
  554. * This value will be :
  555. * @arg SDIO_INT_CCRCFAIL: Command response received (CRC check failed) interrupt
  556. * @arg SDIO_INT_DTCRCFAIL: Data block sent/received (CRC check failed) interrupt
  557. * @arg SDIO_INT_CMDTMOUT: Command response timeout interrupt
  558. * @arg SDIO_INT_DTTMOUT: Data timeout interrupt
  559. * @arg SDIO_INT_TXURE: Transmit FIFO underrun error interrupt
  560. * @arg SDIO_INT_RXORE: Received FIFO overrun error interrupt
  561. * @arg SDIO_INT_CMDREND: Command response received (CRC check passed) interrupt
  562. * @arg SDIO_INT_CMDSENT: Command sent (no response required) interrupt
  563. * @arg SDIO_INT_DTEND: Data end (data counter, SDIDTCNT, is zero) interrupt
  564. * @arg SDIO_INT_STBITE: Start bit not detected on all data signals in wide
  565. * bus mode interrupt
  566. * @arg SDIO_INT_SDIOINT: SD I/O interrupt received interrupt
  567. * @arg SDIO_INT_ATAEND: CE-ATA command completion signal received for CMD61
  568. * @retval None
  569. */
  570. void SDIO_ClearIntBitState(uint32_t SDIO_INT)
  571. {
  572. SDIO->ICR = SDIO_INT;
  573. }
  574. /**
  575. * @}
  576. */
  577. /**
  578. * @}
  579. */
  580. /**
  581. * @}
  582. */
  583. #endif