apm32s10x_qspi.h 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. /*!
  2. * @file apm32s10x_qspi.h
  3. *
  4. * @brief This file contains all the prototypes,enumeration and macros for the QSPI peripheral
  5. *
  6. * @version V1.0.1
  7. *
  8. * @date 2022-12-31
  9. *
  10. * @attention
  11. *
  12. * Copyright (C) 2022-2023 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. /* Define to prevent recursive inclusion */
  26. #ifndef __APM32S10X_QSPI_H
  27. #define __APM32S10X_QSPI_H
  28. #ifdef __cplusplus
  29. extern "C" {
  30. #endif
  31. #include "apm32s10x.h"
  32. /** @addtogroup APM32S10x_StdPeriphDriver
  33. @{
  34. */
  35. /** @addtogroup QSPI_Driver QSPI Driver
  36. @{
  37. */
  38. /** @defgroup QSPI_Macros Macros
  39. @{
  40. */
  41. /* CTRL1 register reset value */
  42. #define QSPI_CTRL1_RESET_VALUE ((uint32_t)0x4007)
  43. /* CTRL2 register reset value */
  44. #define QSPI_CTRL2_RESET_VALUE ((uint32_t)0x00)
  45. /* SSIEN register reset value */
  46. #define QSPI_SSIEN_RESET_VALUE ((uint32_t)0x00)
  47. /* SLAEN register reset value */
  48. #define QSPI_SLAEN_RESET_VALUE ((uint32_t)0x00)
  49. /* BR register reset value */
  50. #define QSPI_BR_RESET_VALUE ((uint32_t)0x00)
  51. /* TFTL register reset value */
  52. #define QSPI_TFTL_RESET_VALUE ((uint32_t)0x00)
  53. /* RFTL register reset value */
  54. #define QSPI_RFTL_RESET_VALUE ((uint32_t)0x00)
  55. /* TFL register reset value */
  56. #define QSPI_TFL_RESET_VALUE ((uint32_t)0x00)
  57. /* RFL register reset value */
  58. #define QSPI_RFL_RESET_VALUE ((uint32_t)0x00)
  59. /* STS register reset value */
  60. #define QSPI_STS_RESET_VALUE ((uint32_t)0x06)
  61. /* INTEN register reset value */
  62. #define QSPI_INTEN_RESET_VALUE ((uint32_t)0x7F)
  63. /* RSD register reset value */
  64. #define QSPI_RSD_RESET_VALUE ((uint32_t)0x00)
  65. /* CTRL3 register reset value */
  66. #define QSPI_CTRL3_RESET_VALUE ((uint32_t)0x200)
  67. /* IOSW register reset value */
  68. #define QSPI_IOSW_RESET_VALUE ((uint32_t)0x00)
  69. /**@} end of group QSPI_Macros */
  70. /** @defgroup QSPI_Enumerations Enumerations
  71. @{
  72. */
  73. /**
  74. * @brief Frame format
  75. */
  76. typedef enum
  77. {
  78. QSPI_FRF_STANDARD, /*!< Standard mode */
  79. QSPI_FRF_DUAL, /*!< Dual SPI */
  80. QSPI_FRF_QUAD /*!< QUAD SPI */
  81. } QSPI_FRF_T;
  82. /**
  83. * @brief Transmission mode
  84. */
  85. typedef enum
  86. {
  87. QSPI_TRANS_MODE_TX_RX, /*!< TX and RX mode */
  88. QSPI_TRANS_MODE_TX, /*!< TX mode only */
  89. QSPI_TRANS_MODE_RX, /*!< RX mode only */
  90. QSPI_TRANS_MODE_EEPROM_READ /*!< EEPROM read mode */
  91. } QSPI_TRANS_MODE_T;
  92. /**
  93. * @brief Clock polarity
  94. */
  95. typedef enum
  96. {
  97. QSPI_CLKPOL_LOW,
  98. QSPI_CLKPOL_HIGH
  99. } QSPI_CLKPOL_T;
  100. /**
  101. * @brief Clock phase
  102. */
  103. typedef enum
  104. {
  105. QSPI_CLKPHA_1EDGE,
  106. QSPI_CLKPHA_2EDGE
  107. } QSPI_CLKPHA_T;
  108. /**
  109. * @brief Data format size
  110. */
  111. typedef enum
  112. {
  113. QSPI_DFS_4BIT = 3,
  114. QSPI_DFS_5BIT,
  115. QSPI_DFS_6BIT,
  116. QSPI_DFS_7BIT,
  117. QSPI_DFS_8BIT,
  118. QSPI_DFS_9BIT,
  119. QSPI_DFS_10BIT,
  120. QSPI_DFS_11BIT,
  121. QSPI_DFS_12BIT,
  122. QSPI_DFS_13BIT,
  123. QSPI_DFS_14BIT,
  124. QSPI_DFS_15BIT,
  125. QSPI_DFS_16BIT,
  126. QSPI_DFS_17BIT,
  127. QSPI_DFS_18BIT,
  128. QSPI_DFS_19BIT,
  129. QSPI_DFS_20BIT,
  130. QSPI_DFS_21BIT,
  131. QSPI_DFS_22BIT,
  132. QSPI_DFS_23BIT,
  133. QSPI_DFS_24BIT,
  134. QSPI_DFS_25BIT,
  135. QSPI_DFS_26BIT,
  136. QSPI_DFS_27BIT,
  137. QSPI_DFS_28BIT,
  138. QSPI_DFS_29BIT,
  139. QSPI_DFS_30BIT,
  140. QSPI_DFS_31BIT,
  141. QSPI_DFS_32BIT
  142. } QSPI_DFS_T;
  143. /**
  144. * @brief QSPI flag
  145. */
  146. typedef enum
  147. {
  148. QSPI_FLAG_BUSY = BIT0, /*!< Busy flag */
  149. QSPI_FLAG_TFNF = BIT1, /*!< TX FIFO not full flag */
  150. QSPI_FLAG_TFE = BIT2, /*!< TX FIFO empty flag */
  151. QSPI_FLAG_RFNE = BIT3, /*!< RX FIFO not empty flag */
  152. QSPI_FLAG_RFF = BIT4, /*!< RX FIFO full flag */
  153. QSPI_FLAG_DCE = BIT6 /*!< Data collision error */
  154. } QSPI_FLAG_T;
  155. /**
  156. * @brief QSPI interrupt source
  157. */
  158. typedef enum
  159. {
  160. QSPI_INT_TFE = BIT0, /*!< TX FIFO empty interrupt */
  161. QSPI_INT_TFO = BIT1, /*!< TX FIFO overflow interrupt */
  162. QSPI_INT_RFU = BIT2, /*!< RX FIFO underflow interrupt */
  163. QSPI_INT_RFO = BIT3, /*!< RX FIFO overflow interrupt */
  164. QSPI_INT_RFF = BIT4, /*!< RX FIFO full interrupt */
  165. QSPI_INT_MST = BIT5 /*!< Master interrupt */
  166. } QSPI_INT_T;
  167. /**
  168. * @brief QSPI interrupt flag
  169. */
  170. typedef enum
  171. {
  172. QSPI_INT_FLAG_TFE = BIT0, /*!< TX FIFO empty interrupt flag */
  173. QSPI_INT_FLAG_TFO = BIT1, /*!< TX FIFO overflow interrupt flag */
  174. QSPI_INT_FLAG_RFU = BIT2, /*!< RX FIFO underflow interrupt flag */
  175. QSPI_INT_FLAG_RFO = BIT3, /*!< RX FIFO overflow interrupt flag */
  176. QSPI_INT_FLAG_RFF = BIT4, /*!< RX FIFO full interrupt flag */
  177. QSPI_INT_FLAG_MST = BIT5 /*!< Master interrupt flag */
  178. } QSPI_INT_FLAG_T;
  179. /**
  180. * @brief Reception sample edge
  181. */
  182. typedef enum
  183. {
  184. QSPI_RSE_RISING,
  185. QSPI_RSE_FALLING
  186. } QSPI_RSE_T;
  187. /**
  188. * @brief Instruction length
  189. */
  190. typedef enum
  191. {
  192. QSPI_INST_LEN_0,
  193. QSPI_INST_LEN_4BIT,
  194. QSPI_INST_LEN_8BIT,
  195. QSPI_INST_LEN_16BIT
  196. } QSPI_INST_LEN_T;
  197. /**
  198. * @brief QSPI address length
  199. */
  200. typedef enum
  201. {
  202. QSPI_ADDR_LEN_0,
  203. QSPI_ADDR_LEN_4BIT,
  204. QSPI_ADDR_LEN_8BIT,
  205. QSPI_ADDR_LEN_12BIT,
  206. QSPI_ADDR_LEN_16BIT,
  207. QSPI_ADDR_LEN_20BIT,
  208. QSPI_ADDR_LEN_24BIT,
  209. QSPI_ADDR_LEN_28BIT,
  210. QSPI_ADDR_LEN_32BIT,
  211. QSPI_ADDR_LEN_36BIT,
  212. QSPI_ADDR_LEN_40BIT,
  213. QSPI_ADDR_LEN_44BIT,
  214. QSPI_ADDR_LEN_48BIT,
  215. QSPI_ADDR_LEN_52BIT,
  216. QSPI_ADDR_LEN_56BIT,
  217. QSPI_ADDR_LEN_60BIT
  218. } QSPI_ADDR_LEN_T;
  219. /**
  220. * @brief Instruction and address transmission mode
  221. */
  222. typedef enum
  223. {
  224. QSPI_INST_ADDR_TYPE_STANDARD,
  225. QSPI_INST_TYPE_STANDARD,
  226. QSPI_INST_ADDR_TYPE_FRF
  227. } QSPI_INST_ADDR_TYPE_T;
  228. /**
  229. * @brief Slave Select Toggle
  230. */
  231. typedef enum
  232. {
  233. QSPI_SST_DISABLE,
  234. QSPI_SST_ENABLE
  235. } QSPI_SST_T;
  236. /**@} end of group QSPI_Enumerations */
  237. /** @defgroup QSPI_Structures Structures
  238. @{
  239. */
  240. typedef struct
  241. {
  242. QSPI_SST_T selectSlaveToggle; /*!< Slave Select Toggle */
  243. QSPI_FRF_T frameFormat; /*!< Frame format */
  244. uint16_t clockDiv; /*!< Clock divider */
  245. QSPI_CLKPOL_T clockPolarity; /*!< Clock polarity */
  246. QSPI_CLKPHA_T clockPhase; /*!< Clock phase */
  247. QSPI_DFS_T dataFrameSize; /*!< Data frame size */
  248. } QSPI_Config_T;
  249. /**@} end of group QSPI_Structures */
  250. /** @defgroup QSPI_Functions Functions
  251. @{
  252. */
  253. /* Reset */
  254. void QSPI_Reset(void);
  255. /* Configuration */
  256. void QSPI_Config(QSPI_Config_T* qspiConfig);
  257. void QSPI_ConfigStructInit(QSPI_Config_T* qspiConfig);
  258. /* Data frame size, frame number, frame format */
  259. void QSPI_ConfigFrameNum(uint16_t num);
  260. void QSPI_ConfigDataFrameSize(QSPI_DFS_T dfs);
  261. void QSPI_ConfigFrameFormat(QSPI_FRF_T frameFormat);
  262. /* Disable or Enable */
  263. void QSPI_Enable(void);
  264. void QSPI_Disable(void);
  265. /* TX and RX FIFO */
  266. uint8_t QSPI_ReadTxFifoDataNum(void);
  267. uint8_t QSPI_ReadRxFifoDataNum(void);
  268. void QSPI_ConfigRxFifoThreshold(uint8_t threshold);
  269. void QSPI_ConfigTxFifoThreshold(uint8_t threshold);
  270. void QSPI_ConfigTxFifoEmptyThreshold(uint8_t threshold);
  271. /* RX Sample */
  272. void QSPI_ConfigRxSampleEdge(QSPI_RSE_T rse);
  273. void QSPI_ConfigRxSampleDelay(uint8_t delay);
  274. /* Clock stretch */
  275. void QSPI_EnableClockStretch(void);
  276. void QSPI_DisableClockStretch(void);
  277. /* Instruction, address, Wait cycle */
  278. void QSPI_ConfigInstLen(QSPI_INST_LEN_T len);
  279. void QSPI_ConfigAddrLen(QSPI_ADDR_LEN_T len);
  280. void QSPI_ConfigInstAddrType(QSPI_INST_ADDR_TYPE_T type);
  281. void QSPI_ConfigWaitCycle(uint8_t cycle);
  282. /* IO */
  283. void QSPI_OpenIO(void);
  284. void QSPI_CloseIO(void);
  285. /* Transmission mode */
  286. void QSPI_ConfigTansMode(QSPI_TRANS_MODE_T mode);
  287. /* Rx and Tx data */
  288. uint32_t QSPI_RxData(void);
  289. void QSPI_TxData(uint32_t data);
  290. /* Slave */
  291. void QSPI_EnableSlave(void);
  292. void QSPI_DisableSlave(void);
  293. /* Interrupt */
  294. void QSPI_EnableInterrupt(uint32_t interrupt);
  295. void QSPI_DisableInterrupt(uint32_t interrupt);
  296. /* Flag */
  297. uint8_t QSPI_ReadStatusFlag(QSPI_FLAG_T flag);
  298. void QSPI_ClearStatusFlag(void);
  299. uint8_t QSPI_ReadIntFlag(QSPI_INT_FLAG_T flag);
  300. void QSPI_ClearIntFlag(uint32_t flag);
  301. /**@} end of group QSPI_Functions */
  302. /**@} end of group QSPI_Driver */
  303. /**@} end of group APM32S10x_StdPeriphDriver */
  304. #ifdef __cplusplus
  305. }
  306. #endif
  307. #endif /* __APM32S10X_QSPI_H_ */