apm32f4xx_sdio.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720
  1. /*!
  2. * @file apm32f4Xx_sdio.c
  3. *
  4. * @brief This file provides all the SDIO firmware functions
  5. *
  6. * @version V1.0.2
  7. *
  8. * @date 2022-06-23
  9. *
  10. * @attention
  11. *
  12. * Copyright (C) 2021-2022 Geehy Semiconductor
  13. *
  14. * You may not use this file except in compliance with the
  15. * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE).
  16. *
  17. * The program is only for reference, which is distributed in the hope
  18. * that it will be usefull and instructional for customers to develop
  19. * their software. Unless required by applicable law or agreed to in
  20. * writing, the program is distributed on an "AS IS" BASIS, WITHOUT
  21. * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied.
  22. * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions
  23. * and limitations under the License.
  24. */
  25. #include "apm32f4Xx_sdio.h"
  26. #include "apm32f4Xx_rcm.h"
  27. /** @addtogroup APM32F4xx_StdPeriphDriver
  28. @{
  29. */
  30. /** @defgroup SDIO_Driver
  31. * @brief SDIO driver modules
  32. @{
  33. */
  34. /** @defgroup SDIO_Functions
  35. @{
  36. */
  37. /*!
  38. * @brief Reset sdio peripheral registers to their default reset values
  39. *
  40. * @param None
  41. *
  42. * @retval None
  43. */
  44. void SDIO_Reset(void)
  45. {
  46. RCM_EnableAPB2PeriphReset(RCM_APB2_PERIPH_SDIO);
  47. RCM_DisableAPB2PeriphReset(RCM_APB2_PERIPH_SDIO);
  48. }
  49. /*!
  50. * @brief Config the SDIO peripheral according to the specified parameters in the sdioConfig
  51. *
  52. * @param sdioConfig: pointer to a SDIO_Config_T structure
  53. *
  54. * @retval None
  55. */
  56. void SDIO_Config(SDIO_Config_T *sdioConfig)
  57. {
  58. SDIO->CLKCTRL_B.CLKDIV = sdioConfig->clockDiv;
  59. SDIO->CLKCTRL_B.PWRSAV = sdioConfig->clockPowerSave;
  60. SDIO->CLKCTRL_B.BYPASSEN = sdioConfig->clockBypass;
  61. SDIO->CLKCTRL_B.WBSEL = sdioConfig->busWide;
  62. SDIO->CLKCTRL_B.DEPSEL = sdioConfig->clockEdge;
  63. SDIO->CLKCTRL_B.HFCEN = sdioConfig->hardwareFlowControl;
  64. }
  65. /*!
  66. * @brief Fills each SDIO_Config_T member with its default value
  67. *
  68. * @param sdioConfig: pointer to a SDIO_Config_T structure
  69. *
  70. * @retval None
  71. */
  72. void SDIO_ConfigStructInit(SDIO_Config_T *sdioConfig)
  73. {
  74. sdioConfig->clockDiv = 0x00;
  75. sdioConfig->clockEdge = SDIO_CLOCK_EDGE_RISING;
  76. sdioConfig->clockBypass = SDIO_CLOCK_BYPASS_DISABLE;
  77. sdioConfig->clockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;
  78. sdioConfig->busWide = SDIO_BUS_WIDE_1B;
  79. sdioConfig->hardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
  80. }
  81. /*!
  82. * @brief Enables the SDIO clock
  83. *
  84. * @param None
  85. *
  86. * @retval None
  87. */
  88. void SDIO_EnableClock(void)
  89. {
  90. SDIO->CLKCTRL_B.CLKEN = SET;
  91. }
  92. /*!
  93. * @brief Disables the SDIO clock
  94. *
  95. * @param None
  96. *
  97. * @retval None
  98. */
  99. void SDIO_DisableClock(void)
  100. {
  101. SDIO->CLKCTRL_B.CLKEN = RESET;
  102. }
  103. /*!
  104. * @brief Sets the power status of the controller
  105. *
  106. * @param powerState: new state of the Power state
  107. * The parameter can be one of following values:
  108. * @arg SDIO_POWER_STATE_OFF : Power off
  109. * @arg SDIO_POWER_STATE_ON : Power on
  110. *
  111. * @retval None
  112. */
  113. void SDIO_ConfigPowerState(SDIO_POWER_STATE_T powerState)
  114. {
  115. SDIO->PWRCTRL_B.PWRCTRL = powerState;
  116. }
  117. /*!
  118. * @brief Reads the SDIO power state
  119. *
  120. * @param None
  121. *
  122. * @retval The new state SDIO power
  123. *
  124. * @note 0x00:Power OFF, 0x02:Power UP, 0x03:Power ON
  125. */
  126. uint32_t SDIO_ReadPowerState(void)
  127. {
  128. return (uint8_t)SDIO->PWRCTRL_B.PWRCTRL;
  129. }
  130. /*!
  131. * @brief Enables the SDIO DMA request
  132. *
  133. * @param None
  134. *
  135. * @retval None
  136. */
  137. void SDIO_EnableDMA(void)
  138. {
  139. SDIO->DCTRL_B.DMAEN = SET;
  140. }
  141. /*!
  142. * @brief Disables the SDIO DMA request
  143. *
  144. * @param None
  145. *
  146. * @retval None
  147. */
  148. void SDIO_DisableDMA(void)
  149. {
  150. SDIO->DCTRL_B.DMAEN = RESET;
  151. }
  152. /*!
  153. * @brief Configs the SDIO Command and send the command
  154. *
  155. * @param cmdConfig: pointer to a SDIO_CmdConfig_T structure
  156. *
  157. * @retval None
  158. */
  159. void SDIO_TxCommand(SDIO_CmdConfig_T *cmdConfig)
  160. {
  161. uint32_t tempReg = 0;
  162. SDIO->ARG = cmdConfig->argument;
  163. tempReg = SDIO->CMD;
  164. /* Clear CMDINDEX, WAITRES, WAITINT, WENDDATA, CPSMEN bits */
  165. tempReg &= ((uint32_t)0xFFFFF800);
  166. tempReg |= (uint32_t)(cmdConfig->cmdIndex) | (cmdConfig->response) << 6
  167. | (cmdConfig->wait) << 8 | (cmdConfig->CPSM) << 10;
  168. SDIO->CMD = tempReg;
  169. }
  170. /*!
  171. * @brief Fills each cmdConfig member with its default value
  172. *
  173. * @param cmdConfig: pointer to a SDIO_CmdConfig_T structure
  174. *
  175. * @retval None
  176. */
  177. void SDIO_TxCommandStructInit(SDIO_CmdConfig_T *cmdConfig)
  178. {
  179. cmdConfig->argument = 0x00;
  180. cmdConfig->cmdIndex = 0x00;
  181. cmdConfig->response = SDIO_RESPONSE_NO;
  182. cmdConfig->wait = SDIO_WAIT_NO;
  183. cmdConfig->CPSM = SDIO_CPSM_DISABLE;
  184. }
  185. /*!
  186. * @brief Reads the SDIO command response
  187. *
  188. * @param None
  189. *
  190. * @retval The command index of the last command response received
  191. */
  192. uint8_t SDIO_ReadCommandResponse(void)
  193. {
  194. return (uint8_t)(SDIO->CMDRES);
  195. }
  196. /*!
  197. * @brief Reads the SDIO response
  198. *
  199. * @param res: Specifies the SDIO response register
  200. * The parameter can be one of following values:
  201. * @arg SDIO_RES1 : Response Register 1
  202. * @arg SDIO_RES2 : Response Register 2
  203. * @arg SDIO_RES3 : Response Register 3
  204. * @arg SDIO_RES4 : Response Register 4
  205. *
  206. * @retval The Corresponding response register value
  207. */
  208. uint32_t SDIO_ReadResponse(SDIO_RES_T res)
  209. {
  210. __IO uint32_t tmp = 0;
  211. tmp = ((uint32_t)(SDIO_BASE + 0x14)) + res;
  212. return (*(__IO uint32_t *) tmp);
  213. }
  214. /*!
  215. * @brief Configs the SDIO Dataaccording to the specified parameters in the dataConfig
  216. *
  217. * @param dataConfig: pointer to a SDIO_DataConfig_T structure
  218. *
  219. * @retval None
  220. */
  221. void SDIO_ConfigData(SDIO_DataConfig_T *dataConfig)
  222. {
  223. uint32_t tempReg = 0;
  224. SDIO->DATATIME = dataConfig->dataTimeOut;
  225. SDIO->DATALEN = dataConfig->dataLength;
  226. tempReg = SDIO->DCTRL;
  227. /* Clear DTEN, DTSEL, DTDRCFG and DBSIZE bits */
  228. tempReg &= ((uint32_t)0xFFFFFF08);
  229. tempReg |= (uint32_t)(dataConfig->dataBlockSize) << 4 | (dataConfig->transferDir) << 1
  230. | (dataConfig->transferMode) << 2 | (dataConfig->DPSM);
  231. SDIO->DCTRL = tempReg;
  232. }
  233. /*!
  234. * @brief Fills each SDIO_DataConfig_T member with its default value
  235. *
  236. * @param dataConfig: pointer to a SDIO_DataConfig_T structure
  237. *
  238. * @retval None
  239. */
  240. void SDIO_ConfigDataStructInit(SDIO_DataConfig_T *dataConfig)
  241. {
  242. dataConfig->dataTimeOut = 0xFFFFFFFF;
  243. dataConfig->dataLength = 0x00;
  244. dataConfig->dataBlockSize = SDIO_DATA_BLOCKSIZE_1B;
  245. dataConfig->transferDir = SDIO_TRANSFER_DIR_TO_CARD;
  246. dataConfig->transferMode = SDIO_TRANSFER_MODE_BLOCK;
  247. dataConfig->DPSM = SDIO_DPSM_DISABLE;
  248. }
  249. /*!
  250. * @brief Reads the SDIO Data counter
  251. *
  252. * @param None
  253. *
  254. * @retval The SDIO Data counter value
  255. */
  256. uint32_t SDIO_ReadDataCounter(void)
  257. {
  258. return SDIO->DCNT;
  259. }
  260. /*!
  261. * @brief Write the SDIO Data
  262. *
  263. * @param data : a 32-bit data to write
  264. *
  265. * @retval None
  266. */
  267. void SDIO_WriteData(uint32_t data)
  268. {
  269. SDIO->FIFODATA = data;
  270. }
  271. /*!
  272. * @brief Reads the SDIO Data
  273. *
  274. * @param None
  275. *
  276. * @retval The SDIO FIFO Data value
  277. */
  278. uint32_t SDIO_ReadData(void)
  279. {
  280. return SDIO->FIFODATA;
  281. }
  282. /*!
  283. * @brief Reads the SDIO FIFO count value
  284. *
  285. * @param None
  286. *
  287. * @retval The SDIO FIFO count value
  288. */
  289. uint32_t SDIO_ReadFIFOCount(void)
  290. {
  291. return SDIO->FIFOCNT;
  292. }
  293. /*!
  294. * @brief Enables SDIO start read wait
  295. *
  296. * @param None
  297. *
  298. * @retval None
  299. */
  300. void SDIO_EnableStartReadWait(void)
  301. {
  302. SDIO->DCTRL_B.RWSTR = SET;
  303. }
  304. /*!
  305. * @brief Disables SDIO stop read wait
  306. *
  307. * @param None
  308. *
  309. * @retval None
  310. */
  311. void SDIO_DisableStartReadWait(void)
  312. {
  313. SDIO->DCTRL_B.RWSTR = RESET;
  314. }
  315. /*!
  316. * @brief Disables SDIO start read wait
  317. *
  318. * @param None
  319. *
  320. * @retval None
  321. */
  322. void SDIO_DisableStopReadWait(void)
  323. {
  324. SDIO->DCTRL_B.RWSTOP = RESET;
  325. }
  326. /*!
  327. * @brief Enables SDIO stop read wait
  328. *
  329. * @param None
  330. *
  331. * @retval None
  332. */
  333. void SDIO_EnableStopReadWait(void)
  334. {
  335. SDIO->DCTRL_B.RWSTOP = SET;
  336. }
  337. /*!
  338. * @brief Config the read wait interval
  339. *
  340. * @param readWaitMode: SDIO read Wait Mode
  341. * The parameter can be one of following values:
  342. * @arg SDIO_READ_WAIT_MODE_DATA2 : Read Wait control using SDIO_DATA2
  343. * @arg SDIO_READ_WAIT_MODE_CLK : Read Wait control by stopping SDIOCLK
  344. *
  345. * @retval None
  346. *
  347. * @note
  348. */
  349. void SDIO_ConfigSDIOReadWaitMode(SDIO_READ_WAIT_MODE_T readWaitMode)
  350. {
  351. SDIO->DCTRL_B.RDWAIT = readWaitMode;
  352. }
  353. /*!
  354. * @brief Enables SDIO SD I/O Mode Operation
  355. *
  356. * @param None
  357. *
  358. * @retval None
  359. */
  360. void SDIO_EnableSDIO(void)
  361. {
  362. SDIO->DCTRL_B.SDIOF = SET;
  363. }
  364. /*!
  365. * @brief Disables SDIO SD I/O Mode Operation
  366. *
  367. * @param None
  368. *
  369. * @retval None
  370. */
  371. void SDIO_DisableSDIO(void)
  372. {
  373. SDIO->DCTRL_B.SDIOF = RESET;
  374. }
  375. /*!
  376. * @brief Ensables SDIO SD I/O Mode suspend command sending
  377. *
  378. * @param None
  379. *
  380. * @retval None
  381. */
  382. void SDIO_EnableTxSDIOSuspend(void)
  383. {
  384. SDIO->CMD_B.SDIOSC = SET;
  385. }
  386. /*!
  387. * @brief Disables SDIO SD I/O Mode suspend command sending
  388. *
  389. * @param None
  390. *
  391. * @retval None
  392. */
  393. void SDIO_DisableTxSDIOSuspend(void)
  394. {
  395. SDIO->CMD_B.SDIOSC = RESET;
  396. }
  397. /*!
  398. * @brief Enables the command completion signal
  399. *
  400. * @param None
  401. *
  402. * @retval None
  403. */
  404. void SDIO_EnableCommandCompletion(void)
  405. {
  406. SDIO->CMD_B.CMDCPEN = SET;
  407. }
  408. /*!
  409. * @brief Disables the command completion signal
  410. *
  411. * @param None
  412. *
  413. * @retval None
  414. */
  415. void SDIO_DisableCommandCompletion(void)
  416. {
  417. SDIO->CMD_B.CMDCPEN = RESET;
  418. }
  419. /*!
  420. * @brief Enables the CE-ATA interrupt
  421. *
  422. * @param None
  423. *
  424. * @retval None
  425. */
  426. void SDIO_EnableCEATAInterrupt(void)
  427. {
  428. SDIO->CMD_B.INTEN = RESET;
  429. }
  430. /*!
  431. * @brief Disables the CE-ATA interrupt
  432. *
  433. * @param None
  434. *
  435. * @retval None
  436. */
  437. void SDIO_DisableCEATAInterrupt(void)
  438. {
  439. SDIO->CMD_B.INTEN = SET;
  440. }
  441. /*!
  442. * @brief Ensables Sends CE-ATA command
  443. *
  444. * @param None
  445. *
  446. * @retval None
  447. */
  448. void SDIO_EnableTxCEATA(void)
  449. {
  450. SDIO->CMD_B.ATACMD = SET;
  451. }
  452. /*!
  453. * @brief Disables Sends CE-ATA command
  454. *
  455. * @param None
  456. *
  457. * @retval None
  458. */
  459. void SDIO_DisableTxCEATA(void)
  460. {
  461. SDIO->CMD_B.ATACMD = RESET;
  462. }
  463. /*!
  464. * @brief Enables the specified SDIO interrupt
  465. *
  466. * @param interrupt: Select the SDIO interrupt source
  467. * The parameter can be any combination of following values:
  468. * @arg SDIO_INT_COMRESP : Command response received (CRC check failed) interrupt
  469. * @arg SDIO_INT_DBDR : Data block sent/received (CRC check failed) interrupt
  470. * @arg SDIO_INT_CMDRESTO : Command response timeout interrupt
  471. * @arg SDIO_INT_DATATO : Data timeout interrupt
  472. * @arg SDIO_INT_TXUDRER : Transmit FIFO underrun error interrupt
  473. * @arg SDIO_INT_RXOVRER : Received FIFO overrun error interrupt
  474. * @arg SDIO_INT_CMDRES : Command response received (CRC check passed) interrupt
  475. * @arg SDIO_INT_CMDSENT : Command sent (no response required) interrupt
  476. * @arg SDIO_INT_DATAEND : Data end (data counter, SDIDCOUNT, is zero) interrupt
  477. * @arg SDIO_INT_SBE : Start bit not detected on all data signals in wide bus mode interrupt
  478. * @arg SDIO_INT_DBCP : Data block sent/received (CRC check passed) interrupt
  479. * @arg SDIO_INT_CMDACT : Command transfer in progress interrupt
  480. * @arg SDIO_INT_TXACT : Data transmit in progress interrupt
  481. * @arg SDIO_INT_RXACT : Data receive in progress interrupt
  482. * @arg SDIO_INT_TXFHF : Transmit FIFO Half Empty interrupt
  483. * @arg SDIO_INT_RXFHF : Receive FIFO Half Full interrupt
  484. * @arg SDIO_INT_TXFF : Transmit FIFO full interrupt
  485. * @arg SDIO_INT_RXFF : Receive FIFO full interrupt
  486. * @arg SDIO_INT_TXFE : Transmit FIFO empty interrupt
  487. * @arg SDIO_INT_RXFE : Receive FIFO empty interrupt
  488. * @arg SDIO_INT_TXDA : Data available in transmit FIFO interrupt
  489. * @arg SDIO_INT_RXDA : Data available in receive FIFO interrupt
  490. * @arg SDIO_INT_SDIOINT : SD I/O interrupt received interrupt
  491. * @arg SDIO_INT_ATAEND : CE-ATA command completion signal received for CMD61 interrupt
  492. *
  493. * @retval None
  494. */
  495. void SDIO_EnableInterrupt(uint32_t interrupt)
  496. {
  497. SDIO->MASK |= interrupt;
  498. }
  499. /*!
  500. * @brief Disables the specified SDIO interrupt
  501. *
  502. * @param interrupt: Select the SDIO interrupt source
  503. * The parameter can be any combination of following values:
  504. * @arg SDIO_INT_COMRESP : Command response received (CRC check failed) interrupt
  505. * @arg SDIO_INT_DBDR : Data block sent/received (CRC check failed) interrupt
  506. * @arg SDIO_INT_CMDRESTO : Command response timeout interrupt
  507. * @arg SDIO_INT_DATATO : Data timeout interrupt
  508. * @arg SDIO_INT_TXUDRER : Transmit FIFO underrun error interrupt
  509. * @arg SDIO_INT_RXOVRER : Received FIFO overrun error interrupt
  510. * @arg SDIO_INT_CMDRES : Command response received (CRC check passed) interrupt
  511. * @arg SDIO_INT_CMDSENT : Command sent (no response required) interrupt
  512. * @arg SDIO_INT_DATAEND : Data end (data counter, SDIDCOUNT, is zero) interrupt
  513. * @arg SDIO_INT_SBE : Start bit not detected on all data signals in wide bus mode interrupt
  514. * @arg SDIO_INT_DBCP : Data block sent/received (CRC check passed) interrupt
  515. * @arg SDIO_INT_CMDACT : Command transfer in progress interrupt
  516. * @arg SDIO_INT_TXACT : Data transmit in progress interrupt
  517. * @arg SDIO_INT_RXACT : Data receive in progress interrupt
  518. * @arg SDIO_INT_TXFHF : Transmit FIFO Half Empty interrupt
  519. * @arg SDIO_INT_RXFHF : Receive FIFO Half Full interrupt
  520. * @arg SDIO_INT_TXFF : Transmit FIFO full interrupt
  521. * @arg SDIO_INT_RXFF : Receive FIFO full interrupt
  522. * @arg SDIO_INT_TXFE : Transmit FIFO empty interrupt
  523. * @arg SDIO_INT_RXFE : Receive FIFO empty interrupt
  524. * @arg SDIO_INT_TXDA : Data available in transmit FIFO interrupt
  525. * @arg SDIO_INT_RXDA : Data available in receive FIFO interrupt
  526. * @arg SDIO_INT_SDIOINT : SD I/O interrupt received interrupt
  527. * @arg SDIO_INT_ATAEND : CE-ATA command completion signal received for CMD61 interrupt
  528. *
  529. * @retval None
  530. */
  531. void SDIO_DisableInterrupt(uint32_t interrupt)
  532. {
  533. SDIO->MASK &= ~interrupt;
  534. }
  535. /*!
  536. * @brief Reads the specified SDIO flag
  537. *
  538. * @param flag: Select the flag to read
  539. * The parameter can be one of following values:
  540. * @arg SDIO_FLAG_COMRESP : Command response received (CRC check failed) flag
  541. * @arg SDIO_FLAG_DBDR : Data block sent/received (CRC check failed) flag
  542. * @arg SDIO_FLAG_CMDRESTO : Command response timeout flag
  543. * @arg SDIO_FLAG_DATATO : Data timeout flag
  544. * @arg SDIO_FLAG_TXUDRER : Transmit FIFO underrun error flag
  545. * @arg SDIO_FLAG_RXOVRER : Received FIFO overrun error flag
  546. * @arg SDIO_FLAG_CMDRES : Command response received (CRC check passed) flag
  547. * @arg SDIO_FLAG_CMDSENT : Command sent (no response required) flag
  548. * @arg SDIO_FLAG_DATAEND : Data end (data counter is zero) flag
  549. * @arg SDIO_FLAG_SBE : Start bit not detected on all data signals in wide bus mode flag
  550. * @arg SDIO_FLAG_DBCP : Data block sent/received (CRC check passed) flag
  551. * @arg SDIO_FLAG_CMDACT : Command transfer in progress flag
  552. * @arg SDIO_FLAG_TXACT : Data transmit in progress flag
  553. * @arg SDIO_FLAG_RXACT : Data receive in progress flag
  554. * @arg SDIO_FLAG_TXFHF : Transmit FIFO Half Empty flag
  555. * @arg SDIO_FLAG_RXFHF : Receive FIFO Half Full flag
  556. * @arg SDIO_FLAG_TXFF : Transmit FIFO full flag
  557. * @arg SDIO_FLAG_RXFF : Receive FIFO full flag
  558. * @arg SDIO_FLAG_TXFE : Transmit FIFO empty flag
  559. * @arg SDIO_FLAG_RXFE : Receive FIFO empty flag
  560. * @arg SDIO_FLAG_TXDA : Data available in transmit FIFO flag
  561. * @arg SDIO_FLAG_RXDA : Data available in receive FIFO flag
  562. * @arg SDIO_FLAG_SDIOINT : SD I/O interrupt received flag
  563. * @arg SDIO_FLAG_ATAEND : CE-ATA command completion signal received for CMD61 flag
  564. *
  565. * @retval SET or RESET
  566. */
  567. uint8_t SDIO_ReadStatusFlag(SDIO_FLAG_T flag)
  568. {
  569. return (SDIO->STS & flag) ? SET : RESET;
  570. }
  571. /*!
  572. * @brief Clears the specified SDIO flag
  573. *
  574. * @param flag: Select the flag to clear
  575. * The parameter can be any combination of following values:
  576. * @arg SDIO_FLAG_COMRESP : Command response received (CRC check failed) flag
  577. * @arg SDIO_FLAG_DBDR : Data block sent/received (CRC check failed) flag
  578. * @arg SDIO_FLAG_CMDRESTO : Command response timeout flag
  579. * @arg SDIO_FLAG_DATATO : Data timeout flag
  580. * @arg SDIO_FLAG_TXUDRER : Transmit FIFO underrun error flag
  581. * @arg SDIO_FLAG_RXOVRER : Received FIFO overrun error flag
  582. * @arg SDIO_FLAG_CMDRES : Command response received (CRC check passed) flag
  583. * @arg SDIO_FLAG_CMDSENT : Command sent (no response required) flag
  584. * @arg SDIO_FLAG_DATAEND : Data end (data counter is zero) flag
  585. * @arg SDIO_FLAG_SBE : Start bit not detected on all data signals in wide bus mode flag
  586. * @arg SDIO_FLAG_DBCP : Data block sent/received (CRC check passed) flag
  587. * @arg SDIO_FLAG_SDIOINT : SD I/O interrupt received flag
  588. * @arg SDIO_FLAG_ATAEND : CE-ATA command completion signal received for CMD61 flag
  589. *
  590. * @retval None
  591. */
  592. void SDIO_ClearStatusFlag(uint32_t flag)
  593. {
  594. SDIO->ICF = flag;
  595. }
  596. /*!
  597. * @brief Reads the specified SDIO Interrupt flag
  598. *
  599. * @param flag: Select the SDIO interrupt source
  600. * The parameter can be one of following values:
  601. * @arg SDIO_INT_COMRESP : Command response received (CRC check failed) interrupt
  602. * @arg SDIO_INT_DBDR : Data block sent/received (CRC check failed) interrupt
  603. * @arg SDIO_INT_CMDRESTO : Command response timeout interrupt
  604. * @arg SDIO_INT_DATATO : Data timeout interrupt
  605. * @arg SDIO_INT_TXUDRER : Transmit FIFO underrun error interrupt
  606. * @arg SDIO_INT_RXOVRER : Received FIFO overrun error interrupt
  607. * @arg SDIO_INT_CMDRES : Command response received (CRC check passed) interrupt
  608. * @arg SDIO_INT_CMDSENT : Command sent (no response required) interrupt
  609. * @arg SDIO_INT_DATAEND : Data end (data counter is zero) interrupt
  610. * @arg SDIO_INT_SBE : Start bit not detected on all data signals in wide bus mode interrupt
  611. * @arg SDIO_INT_DBCP : Data block sent/received (CRC check passed) interrupt
  612. * @arg SDIO_INT_CMDACT : Command transfer in progress interrupt
  613. * @arg SDIO_INT_TXACT : Data transmit in progress interrupt
  614. * @arg SDIO_INT_RXACT : Data receive in progress interrupt
  615. * @arg SDIO_INT_TXFHF : Transmit FIFO Half Empty interrupt
  616. * @arg SDIO_INT_RXFHF : Receive FIFO Half Full interrupt
  617. * @arg SDIO_INT_TXFF : Transmit FIFO full interrupt
  618. * @arg SDIO_INT_RXFF : Receive FIFO full interrupt
  619. * @arg SDIO_INT_TXFE : Transmit FIFO empty interrupt
  620. * @arg SDIO_INT_RXFE : Receive FIFO empty interrupt
  621. * @arg SDIO_INT_TXDA : Data available in transmit FIFO interrupt
  622. * @arg SDIO_INT_RXDA : Data available in receive FIFO interrupt
  623. * @arg SDIO_INT_SDIOINT : SD I/O interrupt received interrupt
  624. * @arg SDIO_INT_ATAEND : CE-ATA command completion signal received for CMD61 interrupt
  625. *
  626. * @retval SET or RESET
  627. */
  628. uint8_t SDIO_ReadIntFlag(SDIO_INT_T flag)
  629. {
  630. uint32_t intEnable;
  631. uint32_t intStatus;
  632. intEnable = (uint32_t)(SDIO->MASK & flag);
  633. intStatus = (uint32_t)(SDIO->STS & flag);
  634. if (intEnable && intStatus)
  635. {
  636. return SET;
  637. }
  638. return RESET;
  639. }
  640. /*!
  641. * @brief Clears the specified SDIO Interrupt pending bits
  642. *
  643. * @param flag: Select the SDIO interrupt source
  644. * The parameter can be any combination of following values:
  645. * @arg SDIO_INT_COMRESP : Command response received (CRC check failed) interrupt
  646. * @arg SDIO_INT_DBDR : Data block sent/received (CRC check failed) interrupt
  647. * @arg SDIO_INT_CMDRESTO : Command response timeout interrupt
  648. * @arg SDIO_INT_DATATO : Data timeout interrupt
  649. * @arg SDIO_INT_TXUDRER : Transmit FIFO underrun error interrupt
  650. * @arg SDIO_INT_RXOVRER : Received FIFO overrun error interrupt
  651. * @arg SDIO_INT_CMDRES : Command response received (CRC check passed) interrupt
  652. * @arg SDIO_INT_CMDSENT : Command sent (no response required) interrupt
  653. * @arg SDIO_INT_DATAEND : Data end (data counter is zero) interrupt
  654. * @arg SDIO_INT_SBE : Start bit not detected on all data signals in wide bus mode interrupt
  655. * @arg SDIO_INT_DBCP : Data block sent/received (CRC check passed) interrupt
  656. * @arg SDIO_INT_SDIOINT : SD I/O interrupt received interrupt
  657. * @arg SDIO_INT_ATAEND : CE-ATA command completion signal received for CMD61 interrupt
  658. *
  659. * @retval None
  660. */
  661. void SDIO_ClearIntFlag(uint32_t flag)
  662. {
  663. SDIO->ICF = flag;
  664. }
  665. /**@} end of group SDIO_Functions */
  666. /**@} end of group SDIO_Driver */
  667. /**@} end of group APM32F4xx_StdPeriphDriver */