n32g45x_qspi.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. /*****************************************************************************
  2. * Copyright (c) 2019, Nations Technologies Inc.
  3. *
  4. * All rights reserved.
  5. * ****************************************************************************
  6. *
  7. * Redistribution and use in source and binary forms, with or without
  8. * modification, are permitted provided that the following conditions are met:
  9. *
  10. * - Redistributions of source code must retain the above copyright notice,
  11. * this list of conditions and the disclaimer below.
  12. *
  13. * Nations' name may not be used to endorse or promote products derived from
  14. * this software without specific prior written permission.
  15. *
  16. * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY NATIONS "AS IS" AND ANY EXPRESS OR
  17. * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  18. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
  19. * DISCLAIMED. IN NO EVENT SHALL NATIONS BE LIABLE FOR ANY DIRECT, INDIRECT,
  20. * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  21. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  22. * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  23. * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  24. * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  25. * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  26. * ****************************************************************************/
  27. /**
  28. * @file n32g45x_qspi.h
  29. * @author Nations
  30. * @version v1.0.1
  31. *
  32. * @copyright Copyright (c) 2019, Nations Technologies Inc. All rights reserved.
  33. */
  34. #ifndef __N32G45X_QSPI_H__
  35. #define __N32G45X_QSPI_H__
  36. #ifdef __cplusplus
  37. extern "C" {
  38. #endif
  39. #include "n32g45x.h"
  40. #include <stdbool.h>
  41. /** @addtogroup N32G45X_StdPeriph_Driver
  42. * @{
  43. */
  44. /** @addtogroup QSPI
  45. * @brief QSPI driver modules
  46. * @{
  47. */
  48. ////////////////////////////////////////////////////////////////////////////////////////////////////
  49. typedef enum
  50. {
  51. STANDARD_SPI_FORMAT_SEL = 0,
  52. DUAL_SPI_FORMAT_SEL,
  53. QUAD_SPI_FORMAT_SEL,
  54. XIP_SPI_FORMAT_SEL
  55. } QSPI_FORMAT_SEL;
  56. typedef enum
  57. {
  58. TX_AND_RX = 0,
  59. TX_ONLY,
  60. RX_ONLY
  61. } QSPI_DATA_DIR;
  62. typedef enum
  63. {
  64. QSPI_NSS_PORTA_SEL,
  65. QSPI_NSS_PORTC_SEL,
  66. QSPI_NSS_PORTF_SEL
  67. } QSPI_NSS_PORT_SEL;
  68. typedef enum
  69. {
  70. QSPI_NULL = 0,
  71. QSPI_SUCCESS,
  72. } QSPI_STATUS;
  73. ////////////////////////////////////////////////////////////////////////////////////////////////////
  74. typedef struct
  75. {
  76. /*QSPI_CTRL0*/
  77. uint32_t DFS;
  78. uint32_t FRF;
  79. uint32_t SCPH;
  80. uint32_t SCPOL;
  81. uint32_t TMOD;
  82. uint32_t SSTE;
  83. uint32_t CFS;
  84. uint32_t SPI_FRF;
  85. /*QSPI_CTRL1*/
  86. uint32_t NDF;
  87. /*QSPI_MW_CTRL*/
  88. uint32_t MWMOD;
  89. uint32_t MC_DIR;
  90. uint32_t MHS_EN;
  91. /*QSPI_BAUD*/
  92. uint32_t CLK_DIV;
  93. /*QSPI_TXFT*/
  94. uint32_t TXFT;
  95. /*QSPI_RXFT*/
  96. uint32_t RXFT;
  97. /*QSPI_TXFN*/
  98. uint32_t TXFN;
  99. /*QSPI_RXFN*/
  100. uint32_t RXFN;
  101. /*QSPI_RS_DELAY*/
  102. uint32_t SDCN;
  103. uint32_t SES;
  104. /*QSPI_ENH_CTRL0*/
  105. uint32_t ENHANCED_TRANS_TYPE;
  106. uint32_t ENHANCED_ADDR_LEN;
  107. uint32_t ENHANCED_INST_L;
  108. uint32_t ENHANCED_WAIT_CYCLES;
  109. uint32_t ENHANCED_SPI_DDR_EN;
  110. uint32_t ENHANCED_INST_DDR_EN;
  111. uint32_t ENHANCED_CLK_STRETCH_EN;
  112. /*QSPI_DDR_TXDE*/
  113. uint32_t TXDE;
  114. /*QSPI_XIP_MODE*/
  115. uint32_t XIP_MD_BITS;
  116. /*QSPI_XIP_INCR_TOC*/
  117. uint32_t ITOC;
  118. /*QSPI_XIP_WRAP_TOC*/
  119. uint32_t WTOC;
  120. /*QSPI_XIP_CTRL*/
  121. uint32_t XIP_FRF;
  122. uint32_t XIP_TRANS_TYPE;
  123. uint32_t XIP_ADDR_LEN;
  124. uint32_t XIP_INST_L;
  125. uint32_t XIP_MD_BITS_EN;
  126. uint32_t XIP_WAIT_CYCLES;
  127. uint32_t XIP_DFS_HC;
  128. uint32_t XIP_DDR_EN;
  129. uint32_t XIP_INST_DDR_EN;
  130. uint32_t XIP_INST_EN;
  131. uint32_t XIP_CT_EN;
  132. uint32_t XIP_MBL;
  133. /*QSPI_XIP_TOUT*/
  134. uint32_t XTOUT;
  135. } QSPI_InitType;
  136. ////////////////////////////////////////////////////////////////////////////////////////////////////
  137. #define QSPI_TIME_OUT_CNT 200
  138. #define IS_QSPI_SPI_FRF(SPI_FRF) \
  139. (((SPI_FRF) == QSPI_CTRL0_SPI_FRF_STANDARD_FORMAT) || ((SPI_FRF) == QSPI_CTRL0_SPI_FRF_DUAL_FORMAT) || ((SPI_FRF) == QSPI_CTRL0_SPI_FRF_QUAD_FORMAT))
  140. #define IS_QSPI_CFS(CFS) ((((CFS) >= QSPI_CTRL0_CFS_2_BIT) && ((CFS) <= QSPI_CTRL0_CFS_16_BIT)) || ((CFS) == QSPI_CTRL0_CFS_1_BIT))
  141. #define IS_QSPI_SSTE(SSTE) (((SSTE) == QSPI_CTRL0_SSTE_EN) || ((SSTE) == 0))
  142. #define IS_QSPI_TMOD(TMOD) \
  143. (((TMOD) == QSPI_CTRL0_TMOD_TX_AND_RX) || ((TMOD) == QSPI_CTRL0_TMOD_TX_ONLY) || ((TMOD) == QSPI_CTRL0_TMOD_RX_ONLY) || ((TMOD) == QSPI_CTRL0_TMOD_EEPROM_READ))
  144. #define IS_QSPI_SCPOL(SCPOL) (((SCPOL) == QSPI_CTRL0_SCPOL_LOW) || ((SCPOL) == QSPI_CTRL0_SCPOL_HIGH))
  145. #define IS_QSPI_SCPH(SCPH) (((SCPH) == QSPI_CTRL0_SCPH_FIRST_EDGE) || ((SCPH) == QSPI_CTRL0_SCPH_SECOND_EDGE))
  146. #define IS_QSPI_FRF(FRF) (((FRF) == QSPI_CTRL0_FRF_MOTOROLA) || ((FRF) == QSPI_CTRL0_FRF_TI) || ((FRF) == QSPI_CTRL0_FRF_MICROWIRE))
  147. #define IS_QSPI_DFS(DFS) (((DFS) >= QSPI_CTRL0_DFS_4_BIT) && ((DFS) <= QSPI_CTRL0_DFS_32_BIT))
  148. #define IS_QSPI_NDF(NDF) (((NDF) <= 0xFFFF))
  149. #define IS_QSPI_MWMOD(MWMOD) (((MWMOD) == QSPI_MW_CTRL_MWMOD_UNSEQUENTIAL) || ((MWMOD) == QSPI_MW_CTRL_MWMOD_SEQUENTIAL))
  150. #define IS_QSPI_MC_DIR(MC_DIR) (((MC_DIR) == QSPI_MW_CTRL_MC_DIR_RX) || ((MC_DIR) == QSPI_MW_CTRL_MC_DIR_TX))
  151. #define IS_QSPI_MHS_EN(MHS_EN) (((MHS_EN) == QSPI_MW_CTRL_MHS_EN) || ((MHS_EN) == 0))
  152. #define IS_QSPI_CLK_DIV(CLK_DIV) (((CLK_DIV) <= 0xFFFF))
  153. #define IS_QSPI_TXFT(TXFT) (((TXFT) <= 0x1FFFFF))
  154. #define IS_QSPI_RXFT(RXFT) (((RXFT) <= 0x1F))
  155. #define IS_QSPI_TXFN(TXFN) (((TXFN) <= 0x3F))
  156. #define IS_QSPI_RXFN(RXFN) (((RXFN) <= 0x3F))
  157. #define IS_QSPI_DMA_CTRL(DMA_CTRL) (((DMA_CTRL) == QSPI_DMA_CTRL_TX_DMA_EN) || ((DMA_CTRL) == QSPI_DMA_CTRL_RX_DMA_EN))
  158. #define IS_QSPI_DMATDL_CTRL(DMATDL_CTRL) (((DMATDL_CTRL) <= 0x3F))
  159. #define IS_QSPI_DMARDL_CTRL(DMARDL_CTRL) (((DMARDL_CTRL) <= 0x3F))
  160. #define IS_QSPI_SES(SES) (((SES) == QSPI_RS_DELAY_SES_RISING_EDGE) || ((SES) == QSPI_RS_DELAY_SES_FALLING_EDGE))
  161. #define IS_QSPI_SDCN(SDCN) (((SDCN) <= 0xFF))
  162. #define IS_QSPI_ENH_CLK_STRETCH_EN(ENH_CLK_STRETCH_EN) (((ENH_CLK_STRETCH_EN) == QSPI_ENH_CTRL0_CLK_STRETCH_EN) || ((ENH_CLK_STRETCH_EN) == 0))
  163. #define IS_QSPI_ENH_INST_DDR_EN(ENH_INST_DDR_EN) (((ENH_INST_DDR_EN) == QSPI_ENH_CTRL0_INST_DDR_EN) || ((ENH_INST_DDR_EN) == 0))
  164. #define IS_QSPI_ENH_SPI_DDR_EN(ENH_SPI_DDR_EN) (((ENH_SPI_DDR_EN) == QSPI_ENH_CTRL0_SPI_DDR_EN) || ((ENH_SPI_DDR_EN) == 0))
  165. #define IS_QSPI_ENH_WAIT_CYCLES(ENH_WAIT_CYCLES) ((((ENH_WAIT_CYCLES) >= QSPI_ENH_CTRL0_WAIT_1CYCLES) && ((ENH_WAIT_CYCLES) <= QSPI_ENH_CTRL0_WAIT_31CYCLES)) || \
  166. ((ENH_WAIT_CYCLES) == 0))
  167. #define IS_QSPI_ENH_INST_L(ENH_INST_L) \
  168. (((ENH_INST_L) == QSPI_ENH_CTRL0_INST_L_0_LINE) || ((ENH_INST_L) == QSPI_ENH_CTRL0_INST_L_4_LINE) || \
  169. ((ENH_INST_L) == QSPI_ENH_CTRL0_INST_L_8_LINE) || ((ENH_INST_L) == QSPI_ENH_CTRL0_INST_L_16_LINE))
  170. #define IS_QSPI_ENH_ADDR_LEN(ENH_ADDR_LEN) ((((ENH_ADDR_LEN) >= QSPI_ENH_CTRL0_ADDR_LEN_4_BIT) && ((ENH_ADDR_LEN) <= QSPI_ENH_CTRL0_ADDR_LEN_60_BIT)) || \
  171. ((ENH_ADDR_LEN) == 0))
  172. #define IS_QSPI_ENH_TRANS_TYPE(ENH_TRANS_TYPE) (((ENH_TRANS_TYPE) == QSPI_ENH_CTRL0_TRANS_TYPE_STANDARD) || \
  173. ((ENH_TRANS_TYPE) == QSPI_ENH_CTRL0_TRANS_TYPE_ADDRESS_BY_FRF) || \
  174. ((ENH_TRANS_TYPE) == QSPI_ENH_CTRL0_TRANS_TYPE_ALL_BY_FRF))
  175. #define IS_QSPI_DDR_TXDE(DDR_TXDE) (((DDR_TXDE) <= 0xFF))
  176. #define IS_QSPI_XIP_MODE(XIP_MODE) (((XIP_MODE) <= 0xFFFF))
  177. #define IS_QSPI_XIP_INCR_TOC(XIP_INCR_TOC) (((XIP_INCR_TOC) <= 0xFFFF))
  178. #define IS_QSPI_XIP_WRAP_TOC(XIP_WRAP_TOC) (((XIP_WRAP_TOC) <= 0xFFFF))
  179. #define IS_QSPI_XIP_TOUT(XIP_TOUT) (((XIP_TOUT) <= 0xFF))
  180. #define IS_QSPI_XIP_MBL(XIP_MBL) \
  181. (((XIP_MBL) == QSPI_XIP_CTRL_XIP_MBL_LEN_2_BIT) || ((XIP_MBL) == QSPI_XIP_CTRL_XIP_MBL_LEN_4_BIT) || \
  182. ((XIP_MBL) == QSPI_XIP_CTRL_XIP_MBL_LEN_8_BIT) || ((XIP_MBL) == QSPI_XIP_CTRL_XIP_MBL_LEN_16_BIT))
  183. #define IS_QSPI_XIP_CT_EN(XIP_CT_EN) (((XIP_CT_EN) == QSPI_XIP_CTRL_XIP_CT_EN) || ((XIP_CT_EN) == 0))
  184. #define IS_QSPI_XIP_INST_EN(XIP_INST_EN) (((XIP_INST_EN) == QSPI_XIP_CTRL_XIP_INST_EN) || ((XIP_INST_EN) == 0))
  185. #define IS_QSPI_INST_DDR_EN(INST_DDR_EN) (((INST_DDR_EN) == QSPI_XIP_CTRL_XIP_INST_EN) || ((INST_DDR_EN) == 0))
  186. #define IS_QSPI_DDR_EN(DDR_EN) (((DDR_EN) == QSPI_XIP_CTRL_DDR_EN) || ((DDR_EN) == 0))
  187. #define IS_QSPI_XIP_DFS_HC(XIP_DFS_HC) (((XIP_DFS_HC) == QSPI_XIP_CTRL_DFS_HC) || ((XIP_DFS_HC) == 0))
  188. #define IS_QSPI_XIP_WAIT_CYCLES(XIP_WAIT_CYCLES) ((((XIP_WAIT_CYCLES) >= QSPI_XIP_CTRL_WAIT_1CYCLES) && ((XIP_WAIT_CYCLES) <= QSPI_XIP_CTRL_WAIT_31CYCLES)) || \
  189. ((XIP_WAIT_CYCLES) == 0))
  190. #define IS_QSPI_XIP_MD_BIT_EN(XIP_MD_BIT_EN) (((XIP_MD_BIT_EN) == QSPI_XIP_CTRL_MD_BIT_EN) || ((XIP_MD_BIT_EN) == 0))
  191. #define IS_QSPI_XIP_INST_L(XIP_INST_L) \
  192. (((XIP_INST_L) == QSPI_XIP_CTRL_INST_L_0_LINE) || ((XIP_INST_L) == QSPI_XIP_CTRL_INST_L_4_LINE) || \
  193. ((XIP_INST_L) == QSPI_XIP_CTRL_INST_L_8_LINE) || ((XIP_INST_L) == QSPI_XIP_CTRL_INST_L_16_LINE))
  194. #define IS_QSPI_XIP_ADDR_LEN(XIP_ADDR_LEN) ((((XIP_ADDR_LEN) >= QSPI_XIP_CTRL_ADDR_4BIT) && ((XIP_ADDR_LEN) <= QSPI_XIP_CTRL_ADDR_60BIT)) || \
  195. ((XIP_ADDR_LEN) == 0))
  196. #define IS_QSPI_XIP_TRANS_TYPE(XIP_TRANS_TYPE) (((XIP_TRANS_TYPE) == QSPI_XIP_CTRL_TRANS_TYPE_STANDARD_SPI) || \
  197. ((XIP_TRANS_TYPE) == QSPI_XIP_CTRL_TRANS_TYPE_ADDRESS_BY_XIP_FRF) || \
  198. ((XIP_TRANS_TYPE) == QSPI_XIP_CTRL_TRANS_TYPE_INSTRUCT_BY_XIP_FRF))
  199. #define IS_QSPI_XIP_FRF(XIP_FRF) (((XIP_FRF) == QSPI_XIP_CTRL_FRF_2_LINE) || ((XIP_FRF) == QSPI_XIP_CTRL_FRF_4_LINE) || ((XIP_FRF) == 0))
  200. ////////////////////////////////////////////////////////////////////////////////////////////////////
  201. void QSPI_Cmd(bool cmd);
  202. void QSPI_XIP_Cmd(bool cmd);
  203. void QSPI_DeInit(void);
  204. void QspiInitConfig(QSPI_InitType* QSPI_InitStruct);
  205. void QSPI_GPIO(QSPI_NSS_PORT_SEL qspi_nss_port_sel, bool IO1_Input, bool IO3_Output);
  206. void QSPI_Tx_DMA_CTRL_Config(uint8_t Cmd,uint8_t TxDataLevel);
  207. void QSPI_Rx_DMA_CTRL_Config(uint8_t Cmd, uint8_t RxDataLevel);
  208. uint16_t QSPI_GetITStatus(uint16_t FLAG);
  209. void QSPI_ClearITFLAG(uint16_t FLAG);
  210. void QSPI_XIP_ClearITFLAG(uint16_t FLAG);
  211. bool GetQspiBusyStatus(void);
  212. bool GetQspiTxDataBusyStatus(void);
  213. bool GetQspiTxDataEmptyStatus(void);
  214. bool GetQspiRxHaveDataStatus(void);
  215. bool GetQspiRxDataFullStatus(void);
  216. bool GetQspiDataConflictErrorStatus(void);
  217. void QspiSendWord(uint32_t SendData);
  218. uint32_t QspiReadWord(void);
  219. uint32_t QspiGetDataPointer(void);
  220. uint32_t QspiReadRxFifoNum(void);
  221. void ClrFifo(void);
  222. uint32_t GetFifoData(uint32_t* pData, uint32_t Len);
  223. void QspiSendAndGetWords(uint32_t* pSrcData, uint32_t* pDstData, uint32_t cnt);
  224. uint32_t QspiSendWordAndGetWords(uint32_t WrData, uint32_t* pRdData, uint8_t LastRd);
  225. #ifdef __cplusplus
  226. }
  227. #endif
  228. #endif /*__N32G45X_QSPI_H__ */
  229. /**
  230. * @}
  231. */
  232. /**
  233. * @}
  234. */