apm32f10x_qspi.h 8.5 KB

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