apm32f10x_sdio.c 23 KB

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