gd32f30x_sdio.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772
  1. /*!
  2. \file gd32f30x_sdio.c
  3. \brief SDIO driver
  4. */
  5. /*
  6. Copyright (C) 2017 GigaDevice
  7. 2017-02-10, V1.0.1, firmware for GD32F30x
  8. */
  9. #include "gd32f30x_sdio.h"
  10. #define DEFAULT_RESET_VALUE 0x00000000U
  11. /*!
  12. \brief deinitialize the SDIO
  13. \param[in] none
  14. \param[out] none
  15. \retval none
  16. */
  17. void sdio_deinit(void)
  18. {
  19. SDIO_PWRCTL = DEFAULT_RESET_VALUE;
  20. SDIO_CLKCTL = DEFAULT_RESET_VALUE;
  21. SDIO_CMDAGMT = DEFAULT_RESET_VALUE;
  22. SDIO_CMDCTL = DEFAULT_RESET_VALUE;
  23. SDIO_DATATO = DEFAULT_RESET_VALUE;
  24. SDIO_DATALEN = DEFAULT_RESET_VALUE;
  25. SDIO_DATACTL = DEFAULT_RESET_VALUE;
  26. SDIO_INTC = DEFAULT_RESET_VALUE;
  27. SDIO_INTEN = DEFAULT_RESET_VALUE;
  28. }
  29. /*!
  30. \brief configure the SDIO clock
  31. \param[in] clock_edge: SDIO_CLK clock edge
  32. \arg SDIO_SDIOCLKEDGE_RISING: select the rising edge of the SDIOCLK to generate SDIO_CLK
  33. \arg SDIO_SDIOCLKEDGE_FALLING: select the falling edge of the SDIOCLK to generate SDIO_CLK
  34. \param[in] clock_bypass: clock bypass
  35. \arg SDIO_CLOCKBYPASS_ENABLE: clock bypass
  36. \arg SDIO_CLOCKBYPASS_DISABLE: no bypass
  37. \param[in] clock_powersave: SDIO_CLK clock dynamic switch on/off for power saving
  38. \arg SDIO_CLOCKPWRSAVE_ENABLE: SDIO_CLK closed when bus is idle
  39. \arg SDIO_CLOCKPWRSAVE_DISABLE: SDIO_CLK clock is always on
  40. \param[in] clock_division: clock division, less than 512
  41. \param[out] none
  42. \retval none
  43. */
  44. void sdio_clock_config(uint32_t clock_edge, uint32_t clock_bypass, uint32_t clock_powersave, uint16_t clock_division)
  45. {
  46. uint32_t clock_config = 0U;
  47. clock_config = SDIO_CLKCTL;
  48. /* reset the CLKEDGE, CLKBYP, CLKPWRSAV, DIV */
  49. clock_config &= ~(SDIO_CLKCTL_CLKEDGE | SDIO_CLKCTL_CLKBYP | SDIO_CLKCTL_CLKPWRSAV | SDIO_CLKCTL_DIV8 | SDIO_CLKCTL_DIV);
  50. /* if the clock division is greater or equal to 256, set the DIV[8] */
  51. if(clock_division >= 256U){
  52. clock_config |= SDIO_CLKCTL_DIV8;
  53. clock_division -= 256U;
  54. }
  55. /* configure the SDIO_CLKCTL according to the parameters */
  56. clock_config |= (clock_edge | clock_bypass | clock_powersave | clock_division);
  57. SDIO_CLKCTL = clock_config;
  58. }
  59. /*!
  60. \brief enable hardware clock control
  61. \param[in] none
  62. \param[out] none
  63. \retval none
  64. */
  65. void sdio_hardware_clock_enable(void)
  66. {
  67. SDIO_CLKCTL |= SDIO_CLKCTL_HWCLKEN;
  68. }
  69. /*!
  70. \brief disable hardware clock control
  71. \param[in] none
  72. \param[out] none
  73. \retval none
  74. */
  75. void sdio_hardware_clock_disable(void)
  76. {
  77. SDIO_CLKCTL &= ~SDIO_CLKCTL_HWCLKEN;
  78. }
  79. /*!
  80. \brief set different SDIO card bus mode
  81. \param[in] bus_mode: SDIO card bus mode
  82. \arg SDIO_BUSMODE_1BIT: 1-bit SDIO card bus mode
  83. \arg SDIO_BUSMODE_4BIT: 4-bit SDIO card bus mode
  84. \arg SDIO_BUSMODE_8BIT: 8-bit SDIO card bus mode
  85. \param[out] none
  86. \retval none
  87. */
  88. void sdio_bus_mode_set(uint32_t bus_mode)
  89. {
  90. /* reset the SDIO card bus mode bits and set according to bus_mode */
  91. SDIO_CLKCTL &= ~SDIO_CLKCTL_BUSMODE;
  92. SDIO_CLKCTL |= bus_mode;
  93. }
  94. /*!
  95. \brief set the SDIO power state
  96. \param[in] power_state: SDIO power state
  97. \arg SDIO_POWER_ON: SDIO power on
  98. \arg SDIO_POWER_OFF: SDIO power off
  99. \param[out] none
  100. \retval none
  101. */
  102. void sdio_power_state_set(uint32_t power_state)
  103. {
  104. SDIO_PWRCTL = power_state;
  105. }
  106. /*!
  107. \brief get the SDIO power state
  108. \param[in] none
  109. \param[out] none
  110. \retval SDIO power state
  111. \arg SDIO_POWER_ON: SDIO power on
  112. \arg SDIO_POWER_OFF: SDIO power off
  113. */
  114. uint32_t sdio_power_state_get(void)
  115. {
  116. return SDIO_PWRCTL;
  117. }
  118. /*!
  119. \brief enable SDIO_CLK clock output
  120. \param[in] none
  121. \param[out] none
  122. \retval none
  123. */
  124. void sdio_clock_enable(void)
  125. {
  126. SDIO_CLKCTL |= SDIO_CLKCTL_CLKEN;
  127. }
  128. /*!
  129. \brief disable SDIO_CLK clock output
  130. \param[in] none
  131. \param[out] none
  132. \retval none
  133. */
  134. void sdio_clock_disable(void)
  135. {
  136. SDIO_CLKCTL &= ~SDIO_CLKCTL_CLKEN;
  137. }
  138. /*!
  139. \brief configure the command and response
  140. \param[in] cmd_index: command index, refer to the related specifications
  141. \param[in] cmd_argument: command argument, refer to the related specifications
  142. \param[in] response_type: response type
  143. \arg SDIO_RESPONSETYPE_NO: no response
  144. \arg SDIO_RESPONSETYPE_SHORT: short response
  145. \arg SDIO_RESPONSETYPE_LONG: long response
  146. \param[out] none
  147. \retval none
  148. */
  149. void sdio_command_response_config(uint32_t cmd_index, uint32_t cmd_argument, uint32_t response_type)
  150. {
  151. uint32_t cmd_config = 0U;
  152. /* reset the command index, command argument and response type */
  153. SDIO_CMDAGMT &= ~SDIO_CMDAGMT_CMDAGMT;
  154. SDIO_CMDAGMT = cmd_argument;
  155. cmd_config = SDIO_CMDCTL;
  156. cmd_config &= ~(SDIO_CMDCTL_CMDIDX | SDIO_CMDCTL_CMDRESP);
  157. /* configure SDIO_CMDCTL and SDIO_CMDAGMT according to the parameters */
  158. cmd_config |= (cmd_index | response_type);
  159. SDIO_CMDCTL = cmd_config;
  160. }
  161. /*!
  162. \brief set the command state machine wait type
  163. \param[in] wait_type: wait type
  164. \arg SDIO_WAITTYPE_NO: not wait interrupt
  165. \arg SDIO_WAITTYPE_INTERRUPT: wait interrupt
  166. \arg SDIO_WAITTYPE_DATAEND: wait the end of data transfer
  167. \param[out] none
  168. \retval none
  169. */
  170. void sdio_wait_type_set(uint32_t wait_type)
  171. {
  172. /* reset INTWAIT and WAITDEND */
  173. SDIO_CMDCTL &= ~(SDIO_CMDCTL_INTWAIT | SDIO_CMDCTL_WAITDEND);
  174. /* set the wait type according to wait_type */
  175. SDIO_CMDCTL |= wait_type;
  176. }
  177. /*!
  178. \brief enable the CSM(command state machine)
  179. \param[in] none
  180. \param[out] none
  181. \retval none
  182. */
  183. void sdio_csm_enable(void)
  184. {
  185. SDIO_CMDCTL |= SDIO_CMDCTL_CSMEN;
  186. }
  187. /*!
  188. \brief disable the CSM(command state machine)
  189. \param[in] none
  190. \param[out] none
  191. \retval none
  192. */
  193. void sdio_csm_disable(void)
  194. {
  195. SDIO_CMDCTL &= ~SDIO_CMDCTL_CSMEN;
  196. }
  197. /*!
  198. \brief get the last response command index
  199. \param[in] none
  200. \param[out] none
  201. \retval last response command index
  202. */
  203. uint8_t sdio_command_index_get(void)
  204. {
  205. return (uint8_t)SDIO_RSPCMDIDX;
  206. }
  207. /*!
  208. \brief get the response for the last received command
  209. \param[in] responsex: SDIO response
  210. \arg SDIO_RESPONSE0: card response[31:0]/card response[127:96]
  211. \arg SDIO_RESPONSE1: card response[95:64]
  212. \arg SDIO_RESPONSE2: card response[63:32]
  213. \arg SDIO_RESPONSE3: card response[31:1], plus bit 0
  214. \param[out] none
  215. \retval response for the last received command
  216. */
  217. uint32_t sdio_response_get(uint32_t responsex)
  218. {
  219. uint32_t resp_content = 0U;
  220. switch(responsex){
  221. case SDIO_RESPONSE0:
  222. resp_content = SDIO_RESP0;
  223. break;
  224. case SDIO_RESPONSE1:
  225. resp_content = SDIO_RESP1;
  226. break;
  227. case SDIO_RESPONSE2:
  228. resp_content = SDIO_RESP2;
  229. break;
  230. case SDIO_RESPONSE3:
  231. resp_content = SDIO_RESP3;
  232. break;
  233. default:
  234. break;
  235. }
  236. return resp_content;
  237. }
  238. /*!
  239. \brief configure the data timeout, data length and data block size
  240. \param[in] data_timeout: data timeout period in card bus clock periods
  241. \param[in] data_length: number of data bytes to be transferred
  242. \param[in] data_blocksize: size of data block for block transfer
  243. \arg SDIO_DATABLOCKSIZE_1BYTE: block size = 1 byte
  244. \arg SDIO_DATABLOCKSIZE_2BYTES: block size = 2 bytes
  245. \arg SDIO_DATABLOCKSIZE_4BYTES: block size = 4 bytes
  246. \arg SDIO_DATABLOCKSIZE_8BYTES: block size = 8 bytes
  247. \arg SDIO_DATABLOCKSIZE_16BYTES: block size = 16 bytes
  248. \arg SDIO_DATABLOCKSIZE_32BYTES: block size = 32 bytes
  249. \arg SDIO_DATABLOCKSIZE_64BYTES: block size = 64 bytes
  250. \arg SDIO_DATABLOCKSIZE_128BYTES: block size = 128 bytes
  251. \arg SDIO_DATABLOCKSIZE_256BYTES: block size = 256 bytes
  252. \arg SDIO_DATABLOCKSIZE_512BYTES: block size = 512 bytes
  253. \arg SDIO_DATABLOCKSIZE_1024BYTES: block size = 1024 bytes
  254. \arg SDIO_DATABLOCKSIZE_2048BYTES: block size = 2048 bytes
  255. \arg SDIO_DATABLOCKSIZE_4096BYTES: block size = 4096 bytes
  256. \arg SDIO_DATABLOCKSIZE_8192BYTES: block size = 8192 bytes
  257. \arg SDIO_DATABLOCKSIZE_16384BYTES: block size = 16384 bytes
  258. \param[out] none
  259. \retval none
  260. */
  261. void sdio_data_config(uint32_t data_timeout, uint32_t data_length, uint32_t data_blocksize)
  262. {
  263. /* reset data timeout, data length and data block size */
  264. SDIO_DATATO &= ~SDIO_DATATO_DATATO;
  265. SDIO_DATALEN &= ~SDIO_DATALEN_DATALEN;
  266. SDIO_DATACTL &= ~SDIO_DATACTL_BLKSZ;
  267. /* configure the related parameters of data */
  268. SDIO_DATATO = data_timeout;
  269. SDIO_DATALEN = data_length;
  270. SDIO_DATACTL |= data_blocksize;
  271. }
  272. /*!
  273. \brief configure the data transfer mode and direction
  274. \param[in] transfer_mode: mode of data transfer
  275. \arg SDIO_TRANSMODE_BLOCK: block transfer
  276. \arg SDIO_TRANSMODE_STREAM: stream transfer or SDIO multibyte transfer
  277. \param[in] transfer_direction: data transfer direction, read or write
  278. \arg SDIO_TRANSDIRECTION_TOCARD: write data to card
  279. \arg SDIO_TRANSDIRECTION_TOSDIO: read data from card
  280. \param[out] none
  281. \retval none
  282. */
  283. void sdio_data_transfer_config(uint32_t transfer_mode, uint32_t transfer_direction)
  284. {
  285. uint32_t data_trans = 0U;
  286. /* reset the data transfer mode, transfer direction and set according to the parameters */
  287. data_trans = SDIO_DATACTL;
  288. data_trans &= ~(SDIO_DATACTL_TRANSMOD | SDIO_DATACTL_DATADIR);
  289. data_trans |= (transfer_mode | transfer_direction);
  290. SDIO_DATACTL = data_trans;
  291. }
  292. /*!
  293. \brief enable the DSM(data state machine) for data transfer
  294. \param[in] none
  295. \param[out] none
  296. \retval none
  297. */
  298. void sdio_dsm_enable(void)
  299. {
  300. SDIO_DATACTL |= SDIO_DATACTL_DATAEN;
  301. }
  302. /*!
  303. \brief disable the DSM(data state machine)
  304. \param[in] none
  305. \param[out] none
  306. \retval none
  307. */
  308. void sdio_dsm_disable(void)
  309. {
  310. SDIO_DATACTL &= ~SDIO_DATACTL_DATAEN;
  311. }
  312. /*!
  313. \brief write data(one word) to the transmit FIFO
  314. \param[in] data: 32-bit data write to card
  315. \param[out] none
  316. \retval none
  317. */
  318. void sdio_data_write(uint32_t data)
  319. {
  320. SDIO_FIFO = data;
  321. }
  322. /*!
  323. \brief read data(one word) from the receive FIFO
  324. \param[in] none
  325. \param[out] none
  326. \retval received data
  327. */
  328. uint32_t sdio_data_read(void)
  329. {
  330. return SDIO_FIFO;
  331. }
  332. /*!
  333. \brief get the number of remaining data bytes to be transferred to card
  334. \param[in] none
  335. \param[out] none
  336. \retval number of remaining data bytes to be transferred
  337. */
  338. uint32_t sdio_data_counter_get(void)
  339. {
  340. return SDIO_DATACNT;
  341. }
  342. /*!
  343. \brief get the number of words remaining to be written or read from FIFO
  344. \param[in] none
  345. \param[out] none
  346. \retval remaining number of words
  347. */
  348. uint32_t sdio_fifo_counter_get(void)
  349. {
  350. return SDIO_FIFOCNT;
  351. }
  352. /*!
  353. \brief enable the DMA request for SDIO
  354. \param[in] none
  355. \param[out] none
  356. \retval none
  357. */
  358. void sdio_dma_enable(void)
  359. {
  360. SDIO_DATACTL |= SDIO_DATACTL_DMAEN;
  361. }
  362. /*!
  363. \brief disable the DMA request for SDIO
  364. \param[in] none
  365. \param[out] none
  366. \retval none
  367. */
  368. void sdio_dma_disable(void)
  369. {
  370. SDIO_DATACTL &= ~SDIO_DATACTL_DMAEN;
  371. }
  372. /*!
  373. \brief get the flags state of SDIO
  374. \param[in] flag: flags state of SDIO
  375. \arg SDIO_FLAG_CCRCERR: command response received (CRC check failed) flag
  376. \arg SDIO_FLAG_DTCRCERR: data block sent/received (CRC check failed) flag
  377. \arg SDIO_FLAG_CMDTMOUT: command response timeout flag
  378. \arg SDIO_FLAG_DTTMOUT: data timeout flag
  379. \arg SDIO_FLAG_TXURE: transmit FIFO underrun error occurs flag
  380. \arg SDIO_FLAG_RXORE: received FIFO overrun error occurs flag
  381. \arg SDIO_FLAG_CMDRECV: command response received (CRC check passed) flag
  382. \arg SDIO_FLAG_CMDSEND: command sent (no response required) flag
  383. \arg SDIO_FLAG_DTEND: data end (data counter, SDIO_DATACNT, is zero) flag
  384. \arg SDIO_FLAG_STBITE: start bit error in the bus flag
  385. \arg SDIO_FLAG_DTBLKEND: data block sent/received (CRC check passed) flag
  386. \arg SDIO_FLAG_CMDRUN: command transmission in progress flag
  387. \arg SDIO_FLAG_TXRUN: data transmission in progress flag
  388. \arg SDIO_FLAG_RXRUN: data reception in progress flag
  389. \arg SDIO_FLAG_TFH: transmit FIFO is half empty flag: at least 8 words can be written into the FIFO
  390. \arg SDIO_FLAG_RFH: receive FIFO is half full flag: at least 8 words can be read in the FIFO
  391. \arg SDIO_FLAG_TFF: transmit FIFO is full flag
  392. \arg SDIO_FLAG_RFF: receive FIFO is full flag
  393. \arg SDIO_FLAG_TFE: transmit FIFO is empty flag
  394. \arg SDIO_FLAG_RFE: receive FIFO is empty flag
  395. \arg SDIO_FLAG_TXDTVAL: data is valid in transmit FIFO flag
  396. \arg SDIO_FLAG_RXDTVAL: data is valid in receive FIFO flag
  397. \arg SDIO_FLAG_SDIOINT: SD I/O interrupt received flag
  398. \arg SDIO_FLAG_ATAEND: CE-ATA command completion signal received (only for CMD61) flag
  399. \param[out] none
  400. \retval FlagStatus: SET or RESET
  401. */
  402. FlagStatus sdio_flag_get(uint32_t flag)
  403. {
  404. FlagStatus temp_flag = RESET;
  405. if(RESET != (SDIO_STAT & flag)){
  406. temp_flag = SET;
  407. }
  408. return temp_flag;
  409. }
  410. /*!
  411. \brief clear the pending flags of SDIO
  412. \param[in] flag: flags state of SDIO
  413. \arg SDIO_FLAG_CCRCERR: command response received (CRC check failed) flag
  414. \arg SDIO_FLAG_DTCRCERR: data block sent/received (CRC check failed) flag
  415. \arg SDIO_FLAG_CMDTMOUT: command response timeout flag
  416. \arg SDIO_FLAG_DTTMOUT: data timeout flag
  417. \arg SDIO_FLAG_TXURE: transmit FIFO underrun error occurs flag
  418. \arg SDIO_FLAG_RXORE: received FIFO overrun error occurs flag
  419. \arg SDIO_FLAG_CMDRECV: command response received (CRC check passed) flag
  420. \arg SDIO_FLAG_CMDSEND: command sent (no response required) flag
  421. \arg SDIO_FLAG_DTEND: data end (data counter, SDIO_DATACNT, is zero) flag
  422. \arg SDIO_FLAG_STBITE: start bit error in the bus flag
  423. \arg SDIO_FLAG_DTBLKEND: data block sent/received (CRC check passed) flag
  424. \arg SDIO_FLAG_SDIOINT: SD I/O interrupt received flag
  425. \arg SDIO_FLAG_ATAEND: CE-ATA command completion signal received (only for CMD61) flag
  426. \param[out] none
  427. \retval none
  428. */
  429. void sdio_flag_clear(uint32_t flag)
  430. {
  431. SDIO_INTC = flag;
  432. }
  433. /*!
  434. \brief enable the SDIO interrupt
  435. \param[in] int_flag: interrupt flags state of SDIO
  436. \arg SDIO_INT_CCRCERR: SDIO CCRCERR interrupt
  437. \arg SDIO_INT_DTCRCERR: SDIO DTCRCERR interrupt
  438. \arg SDIO_INT_CMDTMOUT: SDIO CMDTMOUT interrupt
  439. \arg SDIO_INT_DTTMOUT: SDIO DTTMOUT interrupt
  440. \arg SDIO_INT_TXURE: SDIO TXURE interrupt
  441. \arg SDIO_INT_RXORE: SDIO RXORE interrupt
  442. \arg SDIO_INT_CMDRECV: SDIO CMDRECV interrupt
  443. \arg SDIO_INT_CMDSEND: SDIO CMDSEND interrupt
  444. \arg SDIO_INT_DTEND: SDIO DTEND interrupt
  445. \arg SDIO_INT_STBITE: SDIO STBITE interrupt
  446. \arg SDIO_INT_DTBLKEND: SDIO DTBLKEND interrupt
  447. \arg SDIO_INT_CMDRUN: SDIO CMDRUN interrupt
  448. \arg SDIO_INT_TXRUN: SDIO TXRUN interrupt
  449. \arg SDIO_INT_RXRUN: SDIO RXRUN interrupt
  450. \arg SDIO_INT_TFH: SDIO TFH interrupt
  451. \arg SDIO_INT_RFH: SDIO RFH interrupt
  452. \arg SDIO_INT_TFF: SDIO TFF interrupt
  453. \arg SDIO_INT_RFF: SDIO RFF interrupt
  454. \arg SDIO_INT_TFE: SDIO TFE interrupt
  455. \arg SDIO_INT_RFE: SDIO RFE interrupt
  456. \arg SDIO_INT_TXDTVAL: SDIO TXDTVAL interrupt
  457. \arg SDIO_INT_RXDTVAL: SDIO RXDTVAL interrupt
  458. \arg SDIO_INT_SDIOINT: SDIO SDIOINT interrupt
  459. \arg SDIO_INT_ATAEND: SDIO ATAEND interrupt
  460. \param[out] none
  461. \retval none
  462. */
  463. void sdio_interrupt_enable(uint32_t int_flag)
  464. {
  465. SDIO_INTEN |= int_flag;
  466. }
  467. /*!
  468. \brief disable the SDIO interrupt
  469. \param[in] int_flag: interrupt flags state of SDIO
  470. \arg SDIO_INT_CCRCERR: SDIO CCRCERR interrupt
  471. \arg SDIO_INT_DTCRCERR: SDIO DTCRCERR interrupt
  472. \arg SDIO_INT_CMDTMOUT: SDIO CMDTMOUT interrupt
  473. \arg SDIO_INT_DTTMOUT: SDIO DTTMOUT interrupt
  474. \arg SDIO_INT_TXURE: SDIO TXURE interrupt
  475. \arg SDIO_INT_RXORE: SDIO RXORE interrupt
  476. \arg SDIO_INT_CMDRECV: SDIO CMDRECV interrupt
  477. \arg SDIO_INT_CMDSEND: SDIO CMDSEND interrupt
  478. \arg SDIO_INT_DTEND: SDIO DTEND interrupt
  479. \arg SDIO_INT_STBITE: SDIO STBITE interrupt
  480. \arg SDIO_INT_DTBLKEND: SDIO DTBLKEND interrupt
  481. \arg SDIO_INT_CMDRUN: SDIO CMDRUN interrupt
  482. \arg SDIO_INT_TXRUN: SDIO TXRUN interrupt
  483. \arg SDIO_INT_RXRUN: SDIO RXRUN interrupt
  484. \arg SDIO_INT_TFH: SDIO TFH interrupt
  485. \arg SDIO_INT_RFH: SDIO RFH interrupt
  486. \arg SDIO_INT_TFF: SDIO TFF interrupt
  487. \arg SDIO_INT_RFF: SDIO RFF interrupt
  488. \arg SDIO_INT_TFE: SDIO TFE interrupt
  489. \arg SDIO_INT_RFE: SDIO RFE interrupt
  490. \arg SDIO_INT_TXDTVAL: SDIO TXDTVAL interrupt
  491. \arg SDIO_INT_RXDTVAL: SDIO RXDTVAL interrupt
  492. \arg SDIO_INT_SDIOINT: SDIO SDIOINT interrupt
  493. \arg SDIO_INT_ATAEND: SDIO ATAEND interrupt
  494. \param[out] none
  495. \retval none
  496. */
  497. void sdio_interrupt_disable(uint32_t int_flag)
  498. {
  499. SDIO_INTEN &= ~int_flag;
  500. }
  501. /*!
  502. \brief get the interrupt flags state of SDIO
  503. \param[in] int_flag: interrupt flags state of SDIO
  504. \arg SDIO_INT_FLAG_CCRCERR: SDIO CCRCERR interrupt
  505. \arg SDIO_INT_FLAG_DTCRCERR: SDIO DTCRCERR interrupt
  506. \arg SDIO_INT_FLAG_CMDTMOUT: SDIO CMDTMOUT interrupt
  507. \arg SDIO_INT_FLAG_DTTMOUT: SDIO DTTMOUT interrupt
  508. \arg SDIO_INT_FLAG_TXURE: SDIO TXURE interrupt
  509. \arg SDIO_INT_FLAG_RXORE: SDIO RXORE interrupt
  510. \arg SDIO_INT_FLAG_CMDRECV: SDIO CMDRECV interrupt
  511. \arg SDIO_INT_FLAG_CMDSEND: SDIO CMDSEND interrupt
  512. \arg SDIO_INT_FLAG_DTEND: SDIO DTEND interrupt
  513. \arg SDIO_INT_FLAG_STBITE: SDIO STBITE interrupt
  514. \arg SDIO_INT_FLAG_DTBLKEND: SDIO DTBLKEND interrupt
  515. \arg SDIO_INT_FLAG_CMDRUN: SDIO CMDRUN interrupt
  516. \arg SDIO_INT_FLAG_TXRUN: SDIO TXRUN interrupt
  517. \arg SDIO_INT_FLAG_RXRUN: SDIO RXRUN interrupt
  518. \arg SDIO_INT_FLAG_TFH: SDIO TFH interrupt
  519. \arg SDIO_INT_FLAG_RFH: SDIO RFH interrupt
  520. \arg SDIO_INT_FLAG_TFF: SDIO TFF interrupt
  521. \arg SDIO_INT_FLAG_RFF: SDIO RFF interrupt
  522. \arg SDIO_INT_FLAG_TFE: SDIO TFE interrupt
  523. \arg SDIO_INT_FLAG_RFE: SDIO RFE interrupt
  524. \arg SDIO_INT_FLAG_TXDTVAL: SDIO TXDTVAL interrupt
  525. \arg SDIO_INT_FLAG_RXDTVAL: SDIO RXDTVAL interrupt
  526. \arg SDIO_INT_FLAG_SDIOINT: SDIO SDIOINT interrupt
  527. \arg SDIO_INT_FLAG_ATAEND: SDIO ATAEND interrupt
  528. \param[out] none
  529. \retval FlagStatus: SET or RESET
  530. */
  531. FlagStatus sdio_interrupt_flag_get(uint32_t int_flag)
  532. {
  533. uint32_t state = 0U;
  534. state = SDIO_STAT;
  535. if(state & int_flag){
  536. state = SDIO_INTEN;
  537. /* check whether the corresponding bit in SDIO_INTEN is set or not */
  538. if(state & int_flag){
  539. return SET;
  540. }
  541. }
  542. return RESET;
  543. }
  544. /*!
  545. \brief clear the interrupt pending flags of SDIO
  546. \param[in] int_flag: interrupt flags state of SDIO
  547. \arg SDIO_INT_FLAG_CCRCERR: command response received (CRC check failed) flag
  548. \arg SDIO_INT_FLAG_DTCRCERR: data block sent/received (CRC check failed) flag
  549. \arg SDIO_INT_FLAG_CMDTMOUT: command response timeout flag
  550. \arg SDIO_INT_FLAG_DTTMOUT: data timeout flag
  551. \arg SDIO_INT_FLAG_TXURE: transmit FIFO underrun error occurs flag
  552. \arg SDIO_INT_FLAG_RXORE: received FIFO overrun error occurs flag
  553. \arg SDIO_INT_FLAG_CMDRECV: command response received (CRC check passed) flag
  554. \arg SDIO_INT_FLAG_CMDSEND: command sent (no response required) flag
  555. \arg SDIO_INT_FLAG_DTEND: data end (data counter, SDIO_DATACNT, is zero) flag
  556. \arg SDIO_INT_FLAG_STBITE: start bit error in the bus flag
  557. \arg SDIO_INT_FLAG_DTBLKEND: data block sent/received (CRC check passed) flag
  558. \arg SDIO_INT_FLAG_SDIOINT: SD I/O interrupt received flag
  559. \arg SDIO_INT_FLAG_ATAEND: CE-ATA command completion signal received (only for CMD61) flag
  560. \param[out] none
  561. \retval none
  562. */
  563. void sdio_interrupt_flag_clear(uint32_t int_flag)
  564. {
  565. SDIO_INTC = int_flag;
  566. }
  567. /*!
  568. \brief enable the read wait mode(SD I/O only)
  569. \param[in] none
  570. \param[out] none
  571. \retval none
  572. */
  573. void sdio_readwait_enable(void)
  574. {
  575. SDIO_DATACTL |= SDIO_DATACTL_RWEN;
  576. }
  577. /*!
  578. \brief disable the read wait mode(SD I/O only)
  579. \param[in] none
  580. \param[out] none
  581. \retval none
  582. */
  583. void sdio_readwait_disable(void)
  584. {
  585. SDIO_DATACTL &= ~SDIO_DATACTL_RWEN;
  586. }
  587. /*!
  588. \brief enable the function that stop the read wait process(SD I/O only)
  589. \param[in] none
  590. \param[out] none
  591. \retval none
  592. */
  593. void sdio_stop_readwait_enable(void)
  594. {
  595. SDIO_DATACTL |= SDIO_DATACTL_RWSTOP;
  596. }
  597. /*!
  598. \brief disable the function that stop the read wait process(SD I/O only)
  599. \param[in] none
  600. \param[out] none
  601. \retval none
  602. */
  603. void sdio_stop_readwait_disable(void)
  604. {
  605. SDIO_DATACTL &= ~SDIO_DATACTL_RWSTOP;
  606. }
  607. /*!
  608. \brief set the read wait type(SD I/O only)
  609. \param[in] readwait_type: SD I/O read wait type
  610. \arg SDIO_READWAITTYPE_CLK: read wait control by stopping SDIO_CLK
  611. \arg SDIO_READWAITTYPE_DAT2: read wait control using SDIO_DAT[2]
  612. \param[out] none
  613. \retval none
  614. */
  615. void sdio_readwait_type_set(uint32_t readwait_type)
  616. {
  617. if(SDIO_READWAITTYPE_CLK == readwait_type){
  618. SDIO_DATACTL |= SDIO_DATACTL_RWTYPE;
  619. }else{
  620. SDIO_DATACTL &= ~SDIO_DATACTL_RWTYPE;
  621. }
  622. }
  623. /*!
  624. \brief enable the SD I/O mode specific operation(SD I/O only)
  625. \param[in] none
  626. \param[out] none
  627. \retval none
  628. */
  629. void sdio_operation_enable(void)
  630. {
  631. SDIO_DATACTL |= SDIO_DATACTL_IOEN;
  632. }
  633. /*!
  634. \brief disable the SD I/O mode specific operation(SD I/O only)
  635. \param[in] none
  636. \param[out] none
  637. \retval none
  638. */
  639. void sdio_operation_disable(void)
  640. {
  641. SDIO_DATACTL &= ~SDIO_DATACTL_IOEN;
  642. }
  643. /*!
  644. \brief enable the SD I/O suspend operation(SD I/O only)
  645. \param[in] none
  646. \param[out] none
  647. \retval none
  648. */
  649. void sdio_suspend_enable(void)
  650. {
  651. SDIO_CMDCTL |= SDIO_CMDCTL_SUSPEND;
  652. }
  653. /*!
  654. \brief disable the SD I/O suspend operation(SD I/O only)
  655. \param[in] none
  656. \param[out] none
  657. \retval none
  658. */
  659. void sdio_suspend_disable(void)
  660. {
  661. SDIO_CMDCTL &= ~SDIO_CMDCTL_SUSPEND;
  662. }
  663. /*!
  664. \brief enable the CE-ATA command(CE-ATA only)
  665. \param[in] none
  666. \param[out] none
  667. \retval none
  668. */
  669. void sdio_ceata_command_enable(void)
  670. {
  671. SDIO_CMDCTL |= SDIO_CMDCTL_ATAEN;
  672. }
  673. /*!
  674. \brief disable the CE-ATA command(CE-ATA only)
  675. \param[in] none
  676. \param[out] none
  677. \retval none
  678. */
  679. void sdio_ceata_command_disable(void)
  680. {
  681. SDIO_CMDCTL &= ~SDIO_CMDCTL_ATAEN;
  682. }
  683. /*!
  684. \brief enable the CE-ATA interrupt(CE-ATA only)
  685. \param[in] none
  686. \param[out] none
  687. \retval none
  688. */
  689. void sdio_ceata_interrupt_enable(void)
  690. {
  691. SDIO_CMDCTL &= ~SDIO_CMDCTL_NINTEN;
  692. }
  693. /*!
  694. \brief disable the CE-ATA interrupt(CE-ATA only)
  695. \param[in] none
  696. \param[out] none
  697. \retval none
  698. */
  699. void sdio_ceata_interrupt_disable(void)
  700. {
  701. SDIO_CMDCTL |= SDIO_CMDCTL_NINTEN;
  702. }
  703. /*!
  704. \brief enable the CE-ATA command completion signal(CE-ATA only)
  705. \param[in] none
  706. \param[out] none
  707. \retval none
  708. */
  709. void sdio_ceata_command_completion_enable(void)
  710. {
  711. SDIO_CMDCTL |= SDIO_CMDCTL_ENCMDC;
  712. }
  713. /*!
  714. \brief disable the CE-ATA command completion signal(CE-ATA only)
  715. \param[in] none
  716. \param[out] none
  717. \retval none
  718. */
  719. void sdio_ceata_command_completion_disable(void)
  720. {
  721. SDIO_CMDCTL &= ~SDIO_CMDCTL_ENCMDC;
  722. }