hc32f460_qspi.h 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. /*******************************************************************************
  2. * Copyright (C) 2020, Huada Semiconductor Co., Ltd. All rights reserved.
  3. *
  4. * This software component is licensed by HDSC under BSD 3-Clause license
  5. * (the "License"); You may not use this file except in compliance with the
  6. * License. You may obtain a copy of the License at:
  7. * opensource.org/licenses/BSD-3-Clause
  8. */
  9. /******************************************************************************/
  10. /** \file hc32f460_qspi.h
  11. **
  12. ** A detailed description is available at
  13. ** @link QspiGroup Queued SPI description @endlink
  14. **
  15. ** - 2018-11-20 CDT First version for Device Driver Library of Qspi.
  16. **
  17. ******************************************************************************/
  18. #ifndef __HC32F460_QSPI_H__
  19. #define __HC32F460_QSPI_H__
  20. /*******************************************************************************
  21. * Include files
  22. ******************************************************************************/
  23. #include "hc32_common.h"
  24. #include "ddl_config.h"
  25. #if (DDL_QSPI_ENABLE == DDL_ON)
  26. /* C binding of definitions if building with C++ compiler */
  27. #ifdef __cplusplus
  28. extern "C"
  29. {
  30. #endif
  31. /**
  32. *******************************************************************************
  33. ** \defgroup QspiGroup Queued SPI(QSPI)
  34. **
  35. ******************************************************************************/
  36. //@{
  37. /*******************************************************************************
  38. * Global type definitions ('typedef')
  39. ******************************************************************************/
  40. /**
  41. *******************************************************************************
  42. ** \brief QSPI spi protocol enumeration
  43. ******************************************************************************/
  44. typedef enum en_qspi_spi_protocol
  45. {
  46. QspiProtocolExtendSpi = 0u, ///< Extend spi protocol
  47. QspiProtocolTwoWiresSpi = 1u, ///< Two wires spi protocol
  48. QspiProtocolFourWiresSpi = 2u, ///< Four wires spi protocol
  49. } en_qspi_spi_protocol_t;
  50. /**
  51. *******************************************************************************
  52. ** \brief QSPI spi Mode enumeration
  53. ******************************************************************************/
  54. typedef enum en_qspi_spi_mode
  55. {
  56. QspiSpiMode0 = 0u, ///< Spi mode 0(QSCK normalcy is Low level)
  57. QspiSpiMode3 = 1u, ///< Spi mode 3(QSCK normalcy is High level)
  58. } en_qspi_spi_mode_t;
  59. /**
  60. *******************************************************************************
  61. ** \brief QSPI bus communication mode enumeration
  62. ******************************************************************************/
  63. typedef enum en_qspi_bus_mode
  64. {
  65. QspiBusModeRomAccess = 0u, ///< Rom access mode
  66. QspiBusModeDirectAccess = 1u, ///< Direct communication mode
  67. } en_qspi_bus_mode_t;
  68. /**
  69. *******************************************************************************
  70. ** \brief QSPI prefetch data stop config enumeration
  71. ******************************************************************************/
  72. typedef enum en_qspi_prefetch_config
  73. {
  74. QspiPrefetchStopComplete = 0u, ///< Stop after prefetch data complete
  75. QspiPrefetchStopImmediately = 1u, ///< Immediately stop prefetch
  76. } en_qspi_prefetch_config_t;
  77. /**
  78. *******************************************************************************
  79. ** \brief QSPI read mode enumeration
  80. ******************************************************************************/
  81. typedef enum en_qspi_read_mode
  82. {
  83. QspiReadModeStandard = 0u, ///< Standard read
  84. QspiReadModeFast = 1u, ///< Fast read
  85. QspiReadModeTwoWiresOutput = 2u, ///< Two wires output fast read
  86. QspiReadModeTwoWiresIO = 3u, ///< Two wires input/output fast read
  87. QspiReadModeFourWiresOutput = 4u, ///< Four wires output fast read
  88. QspiReadModeFourWiresIO = 5u, ///< Four wires input/output fast read
  89. QspiReadModeCustomStandard = 6u, ///< Custom standard read
  90. QspiReadModeCustomFast = 7u, ///< Custom fast read
  91. } en_qspi_read_mode_t;
  92. /**
  93. *******************************************************************************
  94. ** \brief QSPI QSSN valid extend time enumeration
  95. ******************************************************************************/
  96. typedef enum en_qspi_qssn_valid_extend_time
  97. {
  98. QspiQssnValidExtendNot = 0u, ///< Don't extend QSSN valid time
  99. QspiQssnValidExtendSck32 = 1u, ///< QSSN valid time extend 32 QSCK cycles
  100. QspiQssnValidExtendSck128 = 2u, ///< QSSN valid time extend 138 QSCK cycles
  101. QspiQssnValidExtendSckEver = 3u, ///< QSSN valid time extend to ever
  102. } en_qspi_qssn_valid_extend_time_t;
  103. /**
  104. *******************************************************************************
  105. ** \brief QSPI QSCK duty cycle correction enumeration
  106. ******************************************************************************/
  107. typedef enum en_qspi_qsck_duty_correction
  108. {
  109. QspiQsckDutyCorrNot = 0u, ///< Don't correction duty cycle
  110. QspiQsckDutyCorrHalfHclk = 1u, ///< QSCK's rising edge delay 0.5 HCLK cycle when Qsck select HCLK is odd
  111. } en_qspi_qsck_duty_correction_t;
  112. /**
  113. *******************************************************************************
  114. ** \brief QSPI WP Pin output level enumeration
  115. ******************************************************************************/
  116. typedef enum en_qspi_wp_pin_level
  117. {
  118. QspiWpPinOutputLow = 0u, ///< WP pin(QIO2) output low level
  119. QspiWpPinOutputHigh = 1u, ///< WP pin(QIO2) output high level
  120. } en_qspi_wp_pin_level_t;
  121. /**
  122. *******************************************************************************
  123. ** \brief QSPI QSSN setup delay time enumeration
  124. ******************************************************************************/
  125. typedef enum en_qspi_qssn_setup_delay
  126. {
  127. QspiQssnSetupDelayHalfQsck = 0u, ///< QSSN setup delay 0.5 QSCK output than QSCK first rising edge
  128. QspiQssnSetupDelay1Dot5Qsck = 1u, ///< QSSN setup delay 1.5 QSCK output than QSCK first rising edge
  129. } en_qspi_qssn_setup_delay_t;
  130. /**
  131. *******************************************************************************
  132. ** \brief QSPI QSSN hold delay time enumeration
  133. ******************************************************************************/
  134. typedef enum en_qspi_qssn_hold_delay
  135. {
  136. QspiQssnHoldDelayHalfQsck = 0u, ///< QSSN hold delay 0.5 QSCK release than QSCK last rising edge
  137. QspiQssnHoldDelay1Dot5Qsck = 1u, ///< QSSN hold delay 1.5 QSCK release than QSCK last rising edge
  138. } en_qspi_qssn_hold_delay_t;
  139. /**
  140. *******************************************************************************
  141. ** \brief QSPI address width enumeration
  142. ******************************************************************************/
  143. typedef enum en_qspi_addr_width
  144. {
  145. QspiAddressByteOne = 0u, ///< One byte address
  146. QspiAddressByteTwo = 1u, ///< Two byte address
  147. QspiAddressByteThree = 2u, ///< Three byte address
  148. QspiAddressByteFour = 3u, ///< Four byte address
  149. } en_qspi_addr_width_t;
  150. /**
  151. *******************************************************************************
  152. ** \brief QSPI flag type enumeration
  153. ******************************************************************************/
  154. typedef enum en_qspi_flag_type
  155. {
  156. QspiFlagBusBusy = 0u, ///< QSPI bus work status flag in direct communication mode
  157. QspiFlagXipMode = 1u, ///< XIP mode status signal
  158. QspiFlagRomAccessError = 2u, ///< Trigger rom access error flag in direct communication mode
  159. QspiFlagPrefetchBufferFull = 3u, ///< Prefetch buffer area status signal
  160. QspiFlagPrefetchStop = 4u, ///< Prefetch action status signal
  161. } en_qspi_flag_type_t;
  162. /**
  163. *******************************************************************************
  164. ** \brief QSPI clock division enumeration
  165. ******************************************************************************/
  166. typedef enum en_qspi_clk_div
  167. {
  168. QspiHclkDiv2 = 0u, ///< Clock source: HCLK/2
  169. QspiHclkDiv3 = 2u, ///< Clock source: HCLK/3
  170. QspiHclkDiv4 = 3u, ///< Clock source: HCLK/4
  171. QspiHclkDiv5 = 4u, ///< Clock source: HCLK/5
  172. QspiHclkDiv6 = 5u, ///< Clock source: HCLK/6
  173. QspiHclkDiv7 = 6u, ///< Clock source: HCLK/7
  174. QspiHclkDiv8 = 7u, ///< Clock source: HCLK/8
  175. QspiHclkDiv9 = 8u, ///< Clock source: HCLK/9
  176. QspiHclkDiv10 = 9u, ///< Clock source: HCLK/10
  177. QspiHclkDiv11 = 10u, ///< Clock source: HCLK/11
  178. QspiHclkDiv12 = 11u, ///< Clock source: HCLK/12
  179. QspiHclkDiv13 = 12u, ///< Clock source: HCLK/13
  180. QspiHclkDiv14 = 13u, ///< Clock source: HCLK/14
  181. QspiHclkDiv15 = 14u, ///< Clock source: HCLK/15
  182. QspiHclkDiv16 = 15u, ///< Clock source: HCLK/16
  183. QspiHclkDiv17 = 16u, ///< Clock source: HCLK/17
  184. QspiHclkDiv18 = 17u, ///< Clock source: HCLK/18
  185. QspiHclkDiv19 = 18u, ///< Clock source: HCLK/19
  186. QspiHclkDiv20 = 19u, ///< Clock source: HCLK/20
  187. QspiHclkDiv21 = 20u, ///< Clock source: HCLK/21
  188. QspiHclkDiv22 = 21u, ///< Clock source: HCLK/22
  189. QspiHclkDiv23 = 22u, ///< Clock source: HCLK/23
  190. QspiHclkDiv24 = 23u, ///< Clock source: HCLK/24
  191. QspiHclkDiv25 = 24u, ///< Clock source: HCLK/25
  192. QspiHclkDiv26 = 25u, ///< Clock source: HCLK/26
  193. QspiHclkDiv27 = 26u, ///< Clock source: HCLK/27
  194. QspiHclkDiv28 = 27u, ///< Clock source: HCLK/28
  195. QspiHclkDiv29 = 28u, ///< Clock source: HCLK/29
  196. QspiHclkDiv30 = 29u, ///< Clock source: HCLK/30
  197. QspiHclkDiv31 = 30u, ///< Clock source: HCLK/31
  198. QspiHclkDiv32 = 31u, ///< Clock source: HCLK/32
  199. QspiHclkDiv33 = 32u, ///< Clock source: HCLK/33
  200. QspiHclkDiv34 = 33u, ///< Clock source: HCLK/34
  201. QspiHclkDiv35 = 34u, ///< Clock source: HCLK/35
  202. QspiHclkDiv36 = 35u, ///< Clock source: HCLK/36
  203. QspiHclkDiv37 = 36u, ///< Clock source: HCLK/37
  204. QspiHclkDiv38 = 37u, ///< Clock source: HCLK/38
  205. QspiHclkDiv39 = 38u, ///< Clock source: HCLK/39
  206. QspiHclkDiv40 = 39u, ///< Clock source: HCLK/40
  207. QspiHclkDiv41 = 40u, ///< Clock source: HCLK/41
  208. QspiHclkDiv42 = 41u, ///< Clock source: HCLK/42
  209. QspiHclkDiv43 = 42u, ///< Clock source: HCLK/43
  210. QspiHclkDiv44 = 43u, ///< Clock source: HCLK/44
  211. QspiHclkDiv45 = 44u, ///< Clock source: HCLK/45
  212. QspiHclkDiv46 = 45u, ///< Clock source: HCLK/46
  213. QspiHclkDiv47 = 46u, ///< Clock source: HCLK/47
  214. QspiHclkDiv48 = 47u, ///< Clock source: HCLK/48
  215. QspiHclkDiv49 = 48u, ///< Clock source: HCLK/49
  216. QspiHclkDiv50 = 49u, ///< Clock source: HCLK/50
  217. QspiHclkDiv51 = 50u, ///< Clock source: HCLK/51
  218. QspiHclkDiv52 = 51u, ///< Clock source: HCLK/52
  219. QspiHclkDiv53 = 52u, ///< Clock source: HCLK/53
  220. QspiHclkDiv54 = 53u, ///< Clock source: HCLK/54
  221. QspiHclkDiv55 = 54u, ///< Clock source: HCLK/55
  222. QspiHclkDiv56 = 55u, ///< Clock source: HCLK/56
  223. QspiHclkDiv57 = 56u, ///< Clock source: HCLK/57
  224. QspiHclkDiv58 = 57u, ///< Clock source: HCLK/58
  225. QspiHclkDiv59 = 58u, ///< Clock source: HCLK/59
  226. QspiHclkDiv60 = 59u, ///< Clock source: HCLK/60
  227. QspiHclkDiv61 = 60u, ///< Clock source: HCLK/61
  228. QspiHclkDiv62 = 61u, ///< Clock source: HCLK/62
  229. QspiHclkDiv63 = 62u, ///< Clock source: HCLK/63
  230. QspiHclkDiv64 = 63u, ///< Clock source: HCLK/64
  231. } en_qspi_clk_div_t;
  232. /**
  233. *******************************************************************************
  234. ** \brief QSPI QSSN minimum interval time enumeration
  235. ******************************************************************************/
  236. typedef enum en_qspi_qssn_interval_time
  237. {
  238. QspiQssnIntervalQsck1 = 0u, ///< QSSN signal min interval time 1 QSCK
  239. QspiQssnIntervalQsck2 = 1u, ///< QSSN signal min interval time 2 QSCK
  240. QspiQssnIntervalQsck3 = 2u, ///< QSSN signal min interval time 3 QSCK
  241. QspiQssnIntervalQsck4 = 3u, ///< QSSN signal min interval time 4 QSCK
  242. QspiQssnIntervalQsck5 = 4u, ///< QSSN signal min interval time 5 QSCK
  243. QspiQssnIntervalQsck6 = 5u, ///< QSSN signal min interval time 6 QSCK
  244. QspiQssnIntervalQsck7 = 6u, ///< QSSN signal min interval time 7 QSCK
  245. QspiQssnIntervalQsck8 = 7u, ///< QSSN signal min interval time 8 QSCK
  246. QspiQssnIntervalQsck9 = 8u, ///< QSSN signal min interval time 9 QSCK
  247. QspiQssnIntervalQsck10 = 9u, ///< QSSN signal min interval time 10 QSCK
  248. QspiQssnIntervalQsck11 = 10u, ///< QSSN signal min interval time 11 QSCK
  249. QspiQssnIntervalQsck12 = 11u, ///< QSSN signal min interval time 12 QSCK
  250. QspiQssnIntervalQsck13 = 12u, ///< QSSN signal min interval time 13 QSCK
  251. QspiQssnIntervalQsck14 = 13u, ///< QSSN signal min interval time 14 QSCK
  252. QspiQssnIntervalQsck15 = 14u, ///< QSSN signal min interval time 15 QSCK
  253. QspiQssnIntervalQsck16 = 15u, ///< QSSN signal min interval time 16 QSCK
  254. } en_qspi_qssn_interval_time_t;
  255. /**
  256. *******************************************************************************
  257. ** \brief QSPI virtual period enumeration
  258. ******************************************************************************/
  259. typedef enum en_qspi_virtual_period
  260. {
  261. QspiVirtualPeriodQsck3 = 0u, ///< Virtual period select 3 QSCK
  262. QspiVirtualPeriodQsck4 = 1u, ///< Virtual period select 4 QSCK
  263. QspiVirtualPeriodQsck5 = 2u, ///< Virtual period select 5 QSCK
  264. QspiVirtualPeriodQsck6 = 3u, ///< Virtual period select 6 QSCK
  265. QspiVirtualPeriodQsck7 = 4u, ///< Virtual period select 7 QSCK
  266. QspiVirtualPeriodQsck8 = 5u, ///< Virtual period select 8 QSCK
  267. QspiVirtualPeriodQsck9 = 6u, ///< Virtual period select 9 QSCK
  268. QspiVirtualPeriodQsck10 = 7u, ///< Virtual period select 10 QSCK
  269. QspiVirtualPeriodQsck11 = 8u, ///< Virtual period select 11 QSCK
  270. QspiVirtualPeriodQsck12 = 9u, ///< Virtual period select 12 QSCK
  271. QspiVirtualPeriodQsck13 = 10u, ///< Virtual period select 13 QSCK
  272. QspiVirtualPeriodQsck14 = 11u, ///< Virtual period select 14 QSCK
  273. QspiVirtualPeriodQsck15 = 12u, ///< Virtual period select 15 QSCK
  274. QspiVirtualPeriodQsck16 = 13u, ///< Virtual period select 16 QSCK
  275. QspiVirtualPeriodQsck17 = 14u, ///< Virtual period select 17 QSCK
  276. QspiVirtualPeriodQsck18 = 15u, ///< Virtual period select 18 QSCK
  277. } en_qspi_virtual_period_t;
  278. /**
  279. *******************************************************************************
  280. ** \brief QSPI communication protocol structure definition
  281. ******************************************************************************/
  282. typedef struct stc_qspi_comm_protocol
  283. {
  284. en_qspi_spi_protocol_t enReceProtocol; ///< Receive data stage SPI protocol
  285. en_qspi_spi_protocol_t enTransAddrProtocol; ///< Transmit address stage SPI protocol
  286. en_qspi_spi_protocol_t enTransInstrProtocol; ///< Transmit instruction stage SPI protocol
  287. en_qspi_read_mode_t enReadMode; ///< Serial interface read mode
  288. } stc_qspi_comm_protocol_t;
  289. /**
  290. *******************************************************************************
  291. ** \brief QSPI init structure definition
  292. ******************************************************************************/
  293. typedef struct stc_qspi_init
  294. {
  295. en_qspi_clk_div_t enClkDiv; ///< Clock division
  296. en_qspi_spi_mode_t enSpiMode; ///< Specifies SPI mode
  297. en_qspi_bus_mode_t enBusCommMode; ///< Bus communication mode
  298. en_qspi_prefetch_config_t enPrefetchMode; ///< Config prefetch stop location
  299. en_functional_state_t enPrefetchFuncEn; ///< Disable: disable prefetch function, Enable: enable prefetch function
  300. stc_qspi_comm_protocol_t stcCommProtocol; ///< Qspi communication protocol config
  301. en_qspi_qssn_valid_extend_time_t enQssnValidExtendTime; ///< QSSN valid extend time function select after QSPI access bus
  302. en_qspi_qssn_interval_time_t enQssnIntervalTime; ///< QSSN minimum interval time
  303. en_qspi_qsck_duty_correction_t enQsckDutyCorr; ///< QSCK output duty cycles correction
  304. en_qspi_virtual_period_t enVirtualPeriod; ///< Virtual period config
  305. en_qspi_wp_pin_level_t enWpPinLevel; ///< WP pin(QIO2) level select
  306. en_qspi_qssn_setup_delay_t enQssnSetupDelayTime; ///< QSSN setup delay time choose
  307. en_qspi_qssn_hold_delay_t enQssnHoldDelayTime; ///< QSSN hold delay time choose
  308. en_functional_state_t enFourByteAddrReadEn; ///< Read instruction code select when set address width is four bytes
  309. en_qspi_addr_width_t enAddrWidth; ///< Serial interface address width choose
  310. uint8_t u8RomAccessInstr; ///< Rom access mode instruction
  311. } stc_qspi_init_t;
  312. /*******************************************************************************
  313. * Global pre-processor symbols/macros ('#define')
  314. ******************************************************************************/
  315. /*!< 4-byte instruction mode using instruction set */
  316. #define QSPI_4BINSTR_STANDARD_READ 0x13u
  317. #define QSPI_4BINSTR_FAST_READ 0x0Cu
  318. #define QSPI_4BINSTR_TWO_WIRES_OUTPUT_READ 0x3Cu
  319. #define QSPI_4BINSTR_TWO_WIRES_IO_READ 0xBCu
  320. #define QSPI_4BINSTR_FOUR_WIRES_OUTPUT_READ 0x6Cu
  321. #define QSPI_4BINSTR_FOUR_WIRES_IO_READ 0xECu
  322. #define QSPI_4BINSTR_EXIT_4BINSTR_MODE 0xB7u
  323. /*!< 3-byte instruction mode using instruction set */
  324. #define QSPI_3BINSTR_STANDARD_READ 0x03u
  325. #define QSPI_3BINSTR_FAST_READ 0x0Bu
  326. #define QSPI_3BINSTR_TWO_WIRES_OUTPUT_READ 0x3Bu
  327. #define QSPI_3BINSTR_TWO_WIRES_IO_READ 0xBBu
  328. #define QSPI_3BINSTR_FOUR_WIRES_OUTPUT_READ 0x6Bu
  329. #define QSPI_3BINSTR_FOUR_WIRES_IO_READ 0xEBu
  330. #define QSPI_3BINSTR_ENTER_4BINSTR_MODE 0xE9u
  331. /*!< General instruction set */
  332. #define QSPI_WRITE_MODE_ENABLE 0x06u
  333. /*******************************************************************************
  334. * Global variable definitions ('extern')
  335. ******************************************************************************/
  336. /*******************************************************************************
  337. Global function prototypes (definition in C source)
  338. ******************************************************************************/
  339. /* Base functions */
  340. en_result_t QSPI_DeInit(void);
  341. en_result_t QSPI_Init(const stc_qspi_init_t *pstcQspiInitCfg);
  342. en_result_t QSPI_SetAddrWidth(en_qspi_addr_width_t enAddrWidth);
  343. en_result_t QSPI_SetExtendAddress(uint8_t u8Addr);
  344. en_result_t QSPI_CommProtocolConfig(const stc_qspi_comm_protocol_t *pstcCommProtocol);
  345. en_result_t QSPI_PrefetchCmd(en_functional_state_t enNewSta);
  346. en_result_t QSPI_SetClockDiv(en_qspi_clk_div_t enClkDiv);
  347. en_result_t QSPI_SetWPPinLevel(en_qspi_wp_pin_level_t enWpLevel);
  348. /* Rom access mode functions */
  349. en_result_t QSPI_SetRomAccessInstruct(uint8_t u8Instr);
  350. en_result_t QSPI_XipModeCmd(uint8_t u8Instr, en_functional_state_t enNewSta);
  351. /* Direct communication mode functions */
  352. en_result_t QSPI_WriteDirectCommValue(uint8_t u8Val);
  353. uint8_t QSPI_ReadDirectCommValue(void);
  354. en_result_t QSPI_EnterDirectCommMode(void);
  355. en_result_t QSPI_ExitDirectCommMode(void);
  356. /* Flags and get buffer functions */
  357. uint8_t QSPI_GetPrefetchBufferNum(void);
  358. en_flag_status_t QSPI_GetFlag(en_qspi_flag_type_t enFlag);
  359. en_result_t QSPI_ClearFlag(en_qspi_flag_type_t enFlag);
  360. //@} // QspiGroup
  361. #ifdef __cplusplus
  362. }
  363. #endif
  364. #endif /* DDL_QSPI_ENABLE */
  365. #endif /* __HC32F460_QSPI_H__ */
  366. /*******************************************************************************
  367. * EOF (not truncated)
  368. ******************************************************************************/