apm32f10x_sdio.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418
  1. /*!
  2. * @file apm32f10x_sdio.h
  3. *
  4. * @brief This file contains all the functions prototypes for the SDIO firmware library
  5. *
  6. * @version V1.0.1
  7. *
  8. * @date 2021-03-23
  9. *
  10. */
  11. #ifndef __APM32F10X_SDIO_H
  12. #define __APM32F10X_SDIO_H
  13. #include "apm32f10x.h"
  14. #ifdef __cplusplus
  15. extern "C" {
  16. #endif
  17. /** @addtogroup Peripherals_Library Standard Peripheral Library
  18. @{
  19. */
  20. /** @addtogroup SDIO_Driver SDIO Driver
  21. @{
  22. */
  23. /** @addtogroup SDIO_Enumerations Enumerations
  24. @{
  25. */
  26. /**
  27. * @brief SDIO clock edge
  28. */
  29. typedef enum
  30. {
  31. SDIO_CLOCK_EDGE_RISING = 0x00000000,
  32. SDIO_CLOCK_EDGE_FALLING = 0x00002000
  33. }SDIO_CLOCK_EDGE_T;
  34. /**
  35. * @brief SDIO clock bypass
  36. */
  37. typedef enum
  38. {
  39. SDIO_CLOCK_BYPASS_DISABLE = 0x00000000,
  40. SDIO_CLOCK_BYPASS_ENABLE = 0x00000400
  41. }SDIO_CLOCK_BYPASS_T;
  42. /**
  43. * @brief SDIO clock power save
  44. */
  45. typedef enum
  46. {
  47. SDIO_CLOCK_POWER_SAVE_DISABLE = 0x00000000,
  48. SDIO_CLOCK_POWER_SAVE_ENABLE = 0x00000200
  49. }SDIO_CLOCK_POWER_SAVE_T;
  50. /**
  51. * @brief SDIO bus wide
  52. */
  53. typedef enum
  54. {
  55. SDIO_BUSWIDE_1B = 0x00000000,
  56. SDIO_BUSWIDE_4B = 0x00000800,
  57. SDIO_BUSWIDE_8B = 0x00001000
  58. }SDIO_BUSWIDE_T;
  59. /**
  60. * @brief SDIO hardware flow control
  61. */
  62. typedef enum
  63. {
  64. SDIO_HARDWARE_FLOW_CONTROL_DISABLE = 0x00000000,
  65. SDIO_HARDWARE_FLOW_CONTROL_ENABLE = 0x00004000
  66. }SDIO_HARDWARE_FLOW_CONTROL_T;
  67. /**
  68. * @brief SDIO power state
  69. */
  70. typedef enum
  71. {
  72. SDIO_POWER_STATE_OFF = 0x00000000,
  73. SDIO_POWER_STATE_ON = 0x00000003
  74. }SDIO_POWER_STATE_T;
  75. /**
  76. * @brief SDIO interrupt sources
  77. */
  78. typedef enum
  79. {
  80. SDIO_INT_COMRESP = 0x00000001,
  81. SDIO_INT_DBDR = 0x00000002,
  82. SDIO_INT_CMDRESTO = 0x00000004,
  83. SDIO_INT_DATATO = 0x00000008,
  84. SDIO_INT_TXUDRER = 0x00000010,
  85. SDIO_INT_RXOVRER = 0x00000020,
  86. SDIO_INT_CMDRES = 0x00000040,
  87. SDIO_INT_CMDSENT = 0x00000080,
  88. SDIO_INT_DATAEND = 0x00000100,
  89. SDIO_INT_SBE = 0x00000200,
  90. SDIO_INT_DBCP = 0x00000400,
  91. SDIO_INT_CMDACT = 0x00000800,
  92. SDIO_INT_TXACT = 0x00001000,
  93. SDIO_INT_RXACT = 0x00002000,
  94. SDIO_INT_TXFHF = 0x00004000,
  95. SDIO_INT_RXFHF = 0x00008000,
  96. SDIO_INT_TXFF = 0x00010000,
  97. SDIO_INT_RXFF = 0x00020000,
  98. SDIO_INT_TXFE = 0x00040000,
  99. SDIO_INT_RXFE = 0x00080000,
  100. SDIO_INT_TXDA = 0x00100000,
  101. SDIO_INT_RXDA = 0x00200000,
  102. SDIO_INT_SDIOINT = 0x00400000,
  103. SDIO_INT_ATAEND = 0x00800000
  104. }SDIO_INT_T;
  105. /**
  106. * @brief SDIO response
  107. */
  108. typedef enum
  109. {
  110. SDIO_RESPONSE_NO = 0x00000000,
  111. SDIO_RESPONSE_SHORT = 0x00000040,
  112. SDIO_RESPONSE_LONG = 0x000000C0
  113. }SDIO_RESPONSE_T;
  114. /**
  115. * @brief SDIO wait interrupt state
  116. */
  117. typedef enum
  118. {
  119. SDIO_WAIT_NO = 0x00000000,
  120. SDIO_WAIT_INT = 0x00000100,
  121. SDIO_WAIT_PEND = 0x00000200
  122. }SDIO_WAIT_T;
  123. /**
  124. * @brief SDIO CPSM state
  125. */
  126. typedef enum
  127. {
  128. SDIO_CPSM_DISABLE = 0x00000000,
  129. SDIO_CPSM_ENABLE = 0x00000400
  130. }SDIO_CPSM_T;
  131. /**
  132. * @brief SDIO response registers
  133. */
  134. typedef enum
  135. {
  136. SDIO_RES1 = 0x00000000,
  137. SDIO_RES2 = 0x00000004,
  138. SDIO_RES3 = 0x00000008,
  139. SDIO_RES4 = 0x0000000C
  140. }SDIO_RES_T;
  141. /**
  142. * @brief SDIO data block size
  143. */
  144. typedef enum
  145. {
  146. SDIO_DATA_BLOCKSIZE_1B = 0x00000000,
  147. SDIO_DATA_BLOCKSIZE_2B = 0x00000010,
  148. SDIO_DATA_BLOCKSIZE_4B = 0x00000020,
  149. SDIO_DATA_BLOCKSIZE_8B = 0x00000030,
  150. SDIO_DATA_BLOCKSIZE_16B = 0x00000040,
  151. SDIO_DATA_BLOCKSIZE_32B = 0x00000050,
  152. SDIO_DATA_BLOCKSIZE_64B = 0x00000060,
  153. SDIO_DATA_BLOCKSIZE_128B = 0x00000070,
  154. SDIO_DATA_BLOCKSIZE_256B = 0x00000080,
  155. SDIO_DATA_BLOCKSIZE_512B = 0x00000090,
  156. SDIO_DATA_BLOCKSIZE_1024B = 0x000000A0,
  157. SDIO_DATA_BLOCKSIZE_2048B = 0x000000B0,
  158. SDIO_DATA_BLOCKSIZE_496B = 0x000000C0,
  159. SDIO_DATA_BLOCKSIZE_8192B = 0x000000D0,
  160. SDIO_DATA_BLOCKSIZE_16384B = 0x000000E0
  161. }SDIO_DATA_BLOCKSIZE_T;
  162. /**
  163. * @brief SDIO transfer direction
  164. */
  165. typedef enum
  166. {
  167. SDIO_TRANSFER_DIR_TOCARD = 0x00000000,
  168. SDIO_TRANSFER_DIR_TOSDIO = 0x00000002
  169. }SDIO_TRANSFER_DIR_T;
  170. /**
  171. * @brief SDIO transfer type
  172. */
  173. typedef enum
  174. {
  175. SDIO_TRANSFER_MODE_BLOCK = 0x00000000,
  176. SDIO_TRANSFER_MODE_STREAM = 0x00000004
  177. }SDIO_TRANSFER_MODE_T;
  178. /**
  179. * @brief SDIO DPSM state
  180. */
  181. typedef enum
  182. {
  183. SDIO_DPSM_DISABLE = 0x00000000,
  184. SDIO_DPSM_ENABLE = 0x00000001
  185. }SDIO_DPSM_T;
  186. /**
  187. * @brief SDIO flag
  188. */
  189. typedef enum
  190. {
  191. SDIO_FLAG_COMRESP = 0x00000001,
  192. SDIO_FLAG_DBDR = 0x00000002,
  193. SDIO_FLAG_CMDRESTO = 0x00000004,
  194. SDIO_FLAG_DATATO = 0x00000008,
  195. SDIO_FLAG_TXUDRER = 0x00000010,
  196. SDIO_FLAG_RXOVRER = 0x00000020,
  197. SDIO_FLAG_CMDRES = 0x00000040,
  198. SDIO_FLAG_CMDSENT = 0x00000080,
  199. SDIO_FLAG_DATAEND = 0x00000100,
  200. SDIO_FLAG_SBE = 0x00000200,
  201. SDIO_FLAG_DBCP = 0x00000400,
  202. SDIO_FLAG_CMDACT = 0x00000800,
  203. SDIO_FLAG_TXACT = 0x00001000,
  204. SDIO_FLAG_RXACT = 0x00002000,
  205. SDIO_FLAG_TXFHF = 0x00004000,
  206. SDIO_FLAG_RXFHF = 0x00008000,
  207. SDIO_FLAG_TXFF = 0x00010000,
  208. SDIO_FLAG_RXFF = 0x00020000,
  209. SDIO_FLAG_TXFE = 0x00040000,
  210. SDIO_FLAG_RXFE = 0x00080000,
  211. SDIO_FLAG_TXDA = 0x00100000,
  212. SDIO_FLAG_RXDA = 0x00200000,
  213. SDIO_FLAG_SDIOINT = 0x00400000,
  214. SDIO_FLAG_ATAEND = 0x00800000
  215. }SDIO_FLAG_T;
  216. /**
  217. * @brief SDIO read wait mode
  218. */
  219. typedef enum
  220. {
  221. SDIO_READ_WAIT_MODE_CLK = 0x00000001,
  222. SDIO_READ_WAIT_MODE_DATA2 = 0x00000000
  223. }SDIO_READ_WAIT_MODE_T;
  224. /**@} end of group SDIO_Enumerations*/
  225. /** @addtogroup SDIO_Macros Macros
  226. @{
  227. */
  228. /** ------------ SDIO registers bit address in the alias region ----------- */
  229. #define SDIO_OFFSET (SDIO_BASE - PERIPH_BASE)
  230. /* --- CLKCTRL Register ---*/
  231. /* Alias word address of CLKEN bit */
  232. #define CLKCTRL_OFFSET (SDIO_OFFSET + 0x04)
  233. #define CLKEN_BitNumber 0x08
  234. #define CLKCTRL_CLKEN_BB (PERIPH_BB_BASE + (CLKCTRL_OFFSET * 32) + (CLKEN_BitNumber * 4))
  235. /* --- CMD Register ---*/
  236. /* Alias word address of SDIOSC bit */
  237. #define CMD_OFFSET (SDIO_OFFSET + 0x0C)
  238. #define SDIOSC_BitNumber 0x0B
  239. #define CMD_SDIOSC_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (SDIOSC_BitNumber * 4))
  240. /* Alias word address of CMDCPEN bit */
  241. #define CMDCPEN_BitNumber 0x0C
  242. #define CMD_CMDCPEN_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (CMDCPEN_BitNumber * 4))
  243. /* Alias word address of INTEN bit */
  244. #define INTEN_BitNumber 0x0D
  245. #define CMD_INTEN_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (INTEN_BitNumber * 4))
  246. /* Alias word address of ATACMD bit */
  247. #define ATACMD_BitNumber 0x0E
  248. #define CMD_ATACMD_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (ATACMD_BitNumber * 4))
  249. /* --- DCTRL Register ---*/
  250. /* Alias word address of DMAEN bit */
  251. #define DCTRL_OFFSET (SDIO_OFFSET + 0x2C)
  252. #define DMAEN_BitNumber 0x03
  253. #define DCTRL_DMAEN_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (DMAEN_BitNumber * 4))
  254. /* Alias word address of RWSTR bit */
  255. #define RWSTR_BitNumber 0x08
  256. #define DCTRL_RWSTR_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWSTR_BitNumber * 4))
  257. /* Alias word address of RWSTOP bit */
  258. #define RWSTOP_BitNumber 0x09
  259. #define DCTRL_RWSTOP_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWSTOP_BitNumber * 4))
  260. /* Alias word address of RDWAIT bit */
  261. #define RDWAIT_BitNumber 0x0A
  262. #define DCTRL_RDWAIT_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RDWAIT_BitNumber * 4))
  263. /* Alias word address of SDIOF bit */
  264. #define SDIOF_BitNumber 0x0B
  265. #define DCTRL_SDIOF_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (SDIOF_BitNumber * 4))
  266. /**@} end of group SDIO_Macros*/
  267. /** @addtogroup SDIO_Structure Data Structure
  268. @{
  269. */
  270. /**
  271. * @brief SDIO Config structure definition
  272. */
  273. typedef struct
  274. {
  275. SDIO_CLOCK_EDGE_T clockEdge;
  276. SDIO_CLOCK_BYPASS_T clockBypass;
  277. SDIO_CLOCK_POWER_SAVE_T clockPowerSave;
  278. SDIO_BUSWIDE_T busWide;
  279. SDIO_HARDWARE_FLOW_CONTROL_T hardwareFlowControl;
  280. uint8_t clockDiv;
  281. }SDIO_Config_T;
  282. /**
  283. * @brief SDIO CMD Config structure definition
  284. */
  285. typedef struct
  286. {
  287. uint32_t argument;
  288. uint32_t cmdIndex;
  289. SDIO_RESPONSE_T response;
  290. SDIO_WAIT_T wait;
  291. SDIO_CPSM_T CPSM;
  292. }SDIO_CMDConfig_T;
  293. /**
  294. * @brief SDIO Data Config structure definition
  295. */
  296. typedef struct
  297. {
  298. uint32_t dataTimeOut;
  299. uint32_t dataLength;
  300. SDIO_DATA_BLOCKSIZE_T dataBlockSize;
  301. SDIO_TRANSFER_DIR_T transferDir;
  302. SDIO_TRANSFER_MODE_T transferMode;
  303. SDIO_DPSM_T DPSM;
  304. }SDIO_DataConfig_T;
  305. /**@} end of group SDIO_Structure*/
  306. /** @addtogroup SDIO_Fuctions Fuctions
  307. @{
  308. */
  309. /** SDIO reset and configuration */
  310. void SDIO_Reset(void);
  311. void SDIO_Config(SDIO_Config_T* sdioConfig);
  312. void SDIO_ConfigStructInit(SDIO_Config_T* sdioConfig);
  313. void SDIO_EnableClock(void);
  314. void SDIO_DisableClock(void);
  315. void SDIO_ConfigPowerState(SDIO_POWER_STATE_T powerState);
  316. uint32_t SDIO_ReadPowerState(void);
  317. /** DMA */
  318. void SDIO_EnableDMA(void);
  319. void SDIO_DisableDMA(void);
  320. /** Command */
  321. void SDIO_TxCommand(SDIO_CMDConfig_T *cmdConfig);
  322. void SDIO_TxCommandStructInit(SDIO_CMDConfig_T* cmdconfig);
  323. uint8_t SDIO_ReadCommandResponse(void);
  324. uint32_t SDIO_ReadResponse(SDIO_RES_T res);
  325. /** SDIO data configuration */
  326. void SDIO_ConfigData(SDIO_DataConfig_T* dataConfig);
  327. void SDIO_ConfigDataStructInit(SDIO_DataConfig_T* dataConfig);
  328. uint32_t SDIO_ReadDataCounter(void);
  329. void SDIO_WriteData(uint32_t data);
  330. uint32_t SDIO_ReadData(void);
  331. uint32_t SDIO_ReadFIFOCount(void);
  332. /** SDIO mode */
  333. void SDIO_EnableStartReadWait(void);
  334. void SDIO_DisableStartReadWait(void);
  335. void SDIO_EnableStopReadWait(void);
  336. void SDIO_DisableStopReadWait(void);
  337. void SDIO_ConfigSDIOReadWaitMode(SDIO_READ_WAIT_MODE_T readWaitMode);
  338. void SDIO_EnableSDIO(void);
  339. void SDIO_DisableSDIO(void);
  340. void SDIO_EnableTxSDIOSuspend(void);
  341. void SDIO_DisableTxSDIOSuspend(void);
  342. void SDIO_EnableCommandCompletion(void);
  343. void SDIO_DisableCommandCompletion(void);
  344. void SDIO_EnableCEATAInterrupt(void);
  345. void SDIO_DisableCEATAInterrupt(void);
  346. void SDIO_EnableTxCEATA(void);
  347. void SDIO_DisableTxCEATA(void);
  348. /** Interrupt and flags */
  349. void SDIO_EnableInterrupt(uint32_t interrupt);
  350. void SDIO_DisableInterrupt(uint32_t interrupt);
  351. uint8_t SDIO_ReadStatusFlag(SDIO_FLAG_T flag);
  352. void SDIO_ClearStatusFlag(uint32_t flag);
  353. uint8_t SDIO_ReadIntFlag(SDIO_INT_T flag);
  354. void SDIO_ClearIntFlag(uint32_t flag);
  355. /**@} end of group SDIO_Fuctions*/
  356. /**@} end of group SDIO_Driver*/
  357. /**@} end of group Peripherals_Library*/
  358. #ifdef __cplusplus
  359. }
  360. #endif
  361. #endif /* __APM32F10X_SDIO_H */