nu_spim.h 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634
  1. /**************************************************************************//**
  2. * @file nu_spim.h
  3. * @version V1.00
  4. * @brief M480 series SPIM driver header file
  5. *
  6. * SPDX-License-Identifier: Apache-2.0
  7. * @copyright (C) 2016-2020 Nuvoton Technology Corp. All rights reserved.
  8. *****************************************************************************/
  9. #ifndef __NU_SPIM_H__
  10. #define __NU_SPIM_H__
  11. /*---------------------------------------------------------------------------------------------------------*/
  12. /* Include related headers */
  13. /*---------------------------------------------------------------------------------------------------------*/
  14. #ifdef __cplusplus
  15. extern "C"
  16. {
  17. #endif
  18. /** @addtogroup Standard_Driver Standard Driver
  19. @{
  20. */
  21. /** @addtogroup SPIM_Driver SPIM Driver
  22. @{
  23. */
  24. /** @addtogroup SPIM_EXPORTED_CONSTANTS SPIM Exported Constants
  25. @{
  26. */
  27. #define SPIM_DMM_MAP_ADDR 0x100000UL /*!< DMM mode memory map base address \hideinitializer */
  28. #define SPIM_DMM_SIZE 0x100000UL /*!< DMM mode memory mapping size \hideinitializer */
  29. #define SPIM_CCM_ADDR 0x20020000UL /*!< CCM mode memory map base address \hideinitializer */
  30. #define SPIM_CCM_SIZE 0x8000UL /*!< CCM mode memory size \hideinitializer */
  31. /*---------------------------------------------------------------------------------------------------------*/
  32. /* SPIM_CTL0 constant definitions */
  33. /*---------------------------------------------------------------------------------------------------------*/
  34. #define SPIM_CTL0_RW_IN(x) ((x) ? 0UL : (0x1UL << SPIM_CTL0_QDIODIR_Pos)) /*!< SPIM_CTL0: SPI Interface Direction Select \hideinitializer */
  35. #define SPIM_CTL0_BITMODE_SING (0UL << SPIM_CTL0_BITMODE_Pos) /*!< SPIM_CTL0: One bit mode (SPI Interface including DO, DI, HOLD, WP) \hideinitializer */
  36. #define SPIM_CTL0_BITMODE_DUAL (1UL << SPIM_CTL0_BITMODE_Pos) /*!< SPIM_CTL0: Two bits mode (SPI Interface including D0, D1, HOLD, WP) \hideinitializer */
  37. #define SPIM_CTL0_BITMODE_QUAD (2UL << SPIM_CTL0_BITMODE_Pos) /*!< SPIM_CTL0: Four bits mode (SPI Interface including D0, D1, D2, D3) \hideinitializer */
  38. #define SPIM_CTL0_OPMODE_IO (0UL << SPIM_CTL0_OPMODE_Pos) /*!< SPIM_CTL0: I/O Mode \hideinitializer */
  39. #define SPIM_CTL0_OPMODE_PAGEWRITE (1UL << SPIM_CTL0_OPMODE_Pos) /*!< SPIM_CTL0: Page Write Mode \hideinitializer */
  40. #define SPIM_CTL0_OPMODE_PAGEREAD (2UL << SPIM_CTL0_OPMODE_Pos) /*!< SPIM_CTL0: Page Read Mode \hideinitializer */
  41. #define SPIM_CTL0_OPMODE_DIRECTMAP (3UL << SPIM_CTL0_OPMODE_Pos) /*!< SPIM_CTL0: Direct Map Mode \hideinitializer */
  42. #define CMD_NORMAL_PAGE_PROGRAM (0x02UL << SPIM_CTL0_CMDCODE_Pos) /*!< SPIM_CTL0: Page Program (Page Write Mode Use) \hideinitializer */
  43. #define CMD_NORMAL_PAGE_PROGRAM_4B (0x12UL << SPIM_CTL0_CMDCODE_Pos) /*!< SPIM_CTL0: Page Program (Page Write Mode Use) \hideinitializer */
  44. #define CMD_QUAD_PAGE_PROGRAM_WINBOND (0x32UL << SPIM_CTL0_CMDCODE_Pos) /*!< SPIM_CTL0: Quad Page program (for Winbond) (Page Write Mode Use) \hideinitializer */
  45. #define CMD_QUAD_PAGE_PROGRAM_MXIC (0x38UL << SPIM_CTL0_CMDCODE_Pos) /*!< SPIM_CTL0: Quad Page program (for MXIC) (Page Write Mode Use) \hideinitializer */
  46. #define CMD_QUAD_PAGE_PROGRAM_EON (0x40UL << SPIM_CTL0_CMDCODE_Pos) /*!< SPIM_CTL0: Quad Page Program (for EON) (Page Write Mode Use) \hideinitializer */
  47. #define CMD_DMA_NORMAL_READ (0x03UL << SPIM_CTL0_CMDCODE_Pos) /*!< SPIM_CTL0: Read Data (Page Read Mode Use) \hideinitializer */
  48. #define CMD_DMA_FAST_READ (0x0BUL << SPIM_CTL0_CMDCODE_Pos) /*!< SPIM_CTL0: Fast Read (Page Read Mode Use) \hideinitializer */
  49. #define CMD_DMA_NORMAL_DUAL_READ (0x3BUL << SPIM_CTL0_CMDCODE_Pos) /*!< SPIM_CTL0: Fast Read Dual Output (Page Read Mode Use) \hideinitializer */
  50. #define CMD_DMA_FAST_READ_DUAL_OUTPUT (0x3BUL << SPIM_CTL0_CMDCODE_Pos) /*!< SPIM_CTL0: Fast Read Dual Output (Page Read Mode Use) \hideinitializer */
  51. #define CMD_DMA_FAST_READ_QUAD_OUTPUT (0x6BUL << SPIM_CTL0_CMDCODE_Pos) /*!< SPIM_CTL0: Fast Read Dual Output (Page Read Mode Use) \hideinitializer */
  52. #define CMD_DMA_FAST_DUAL_READ (0xBBUL << SPIM_CTL0_CMDCODE_Pos) /*!< SPIM_CTL0: Fast Read Dual Output (Page Read Mode Use) \hideinitializer */
  53. #define CMD_DMA_NORMAL_QUAD_READ (0xE7UL << SPIM_CTL0_CMDCODE_Pos) /*!< SPIM_CTL0: Fast Read Quad I/O (Page Read Mode Use) \hideinitializer */
  54. #define CMD_DMA_FAST_QUAD_READ (0xEBUL << SPIM_CTL0_CMDCODE_Pos) /*!< SPIM_CTL0: Fast Read Quad I/O (Page Read Mode Use) \hideinitializer */
  55. /** @cond HIDDEN_SYMBOLS */
  56. typedef enum
  57. {
  58. MFGID_UNKNOW = 0x00U,
  59. MFGID_SPANSION = 0x01U,
  60. MFGID_EON = 0x1CU,
  61. MFGID_ISSI = 0x7FU,
  62. MFGID_MXIC = 0xC2U,
  63. MFGID_WINBOND = 0xEFU
  64. }
  65. E_MFGID;
  66. /* Flash opcodes. */
  67. #define OPCODE_WREN 0x06U /* Write enable */
  68. #define OPCODE_RDSR 0x05U /* Read status register #1*/
  69. #define OPCODE_WRSR 0x01U /* Write status register #1 */
  70. #define OPCODE_RDSR2 0x35U /* Read status register #2*/
  71. #define OPCODE_WRSR2 0x31U /* Write status register #2 */
  72. #define OPCODE_RDSR3 0x15U /* Read status register #3*/
  73. #define OPCODE_WRSR3 0x11U /* Write status register #3 */
  74. #define OPCODE_PP 0x02U /* Page program (up to 256 bytes) */
  75. #define OPCODE_SE_4K 0x20U /* Erase 4KB sector */
  76. #define OPCODE_BE_32K 0x52U /* Erase 32KB block */
  77. #define OPCODE_CHIP_ERASE 0xc7U /* Erase whole flash chip */
  78. #define OPCODE_BE_64K 0xd8U /* Erase 64KB block */
  79. #define OPCODE_READ_ID 0x90U /* Read ID */
  80. #define OPCODE_RDID 0x9fU /* Read JEDEC ID */
  81. #define OPCODE_BRRD 0x16U /* SPANSION flash - Bank Register Read command */
  82. #define OPCODE_BRWR 0x17U /* SPANSION flash - Bank Register write command */
  83. #define OPCODE_NORM_READ 0x03U /* Read data bytes */
  84. #define OPCODE_FAST_READ 0x0bU /* Read data bytes */
  85. #define OPCODE_FAST_DUAL_READ 0x3bU /* Read data bytes */
  86. #define OPCODE_FAST_QUAD_READ 0x6bU /* Read data bytes */
  87. /* Used for SST flashes only. */
  88. #define OPCODE_BP 0x02U /* Byte program */
  89. #define OPCODE_WRDI 0x04U /* Write disable */
  90. #define OPCODE_AAI_WP 0xadU /* Auto u32Address increment word program */
  91. /* Used for Macronix flashes only. */
  92. #define OPCODE_EN4B 0xb7U /* Enter 4-byte mode */
  93. #define OPCODE_EX4B 0xe9U /* Exit 4-byte mode */
  94. #define OPCODE_RDSCUR 0x2bU
  95. #define OPCODE_WRSCUR 0x2fU
  96. #define OPCODE_RSTEN 0x66U
  97. #define OPCODE_RST 0x99U
  98. #define OPCODE_ENQPI 0x38U
  99. #define OPCODE_EXQPI 0xFFU
  100. /* Status Register bits. */
  101. #define SR_WIP 0x1U /* Write in progress */
  102. #define SR_WEL 0x2U /* Write enable latch */
  103. #define SR_QE 0x40U /* Quad Enable for MXIC */
  104. /* Status Register #2 bits. */
  105. #define SR2_QE 0x2U /* Quad Enable for Winbond */
  106. /* meaning of other SR_* bits may differ between vendors */
  107. #define SR_BP0 0x4U /* Block protect 0 */
  108. #define SR_BP1 0x8U /* Block protect 1 */
  109. #define SR_BP2 0x10U /* Block protect 2 */
  110. #define SR_SRWD 0x80U /* SR write protect */
  111. #define SR3_ADR 0x01U /* 4-byte u32Address mode */
  112. #define SCUR_4BYTE 0x04U /* 4-byte u32Address mode */
  113. /** @endcond HIDDEN_SYMBOLS */
  114. #define SPIM_TIMEOUT_ERR (-1L) /*!< SPIM operation abort due to timeout error \hideinitializer */
  115. /*@}*/ /* end of group SPIM_EXPORTED_CONSTANTS */
  116. extern int32_t g_SPIM_i32ErrCode;
  117. /** @addtogroup SPIM_EXPORTED_FUNCTIONS SPIM Exported Functions
  118. @{
  119. */
  120. /*---------------------------------------------------------------------------------------------------------*/
  121. /* Define Macros and functions */
  122. /*---------------------------------------------------------------------------------------------------------*/
  123. /**
  124. * @details Enable cipher.
  125. * \hideinitializer
  126. */
  127. #define SPIM_ENABLE_CIPHER() (SPIM->CTL0 &= ~SPIM_CTL0_CIPHOFF_Msk)
  128. /**
  129. * @details Disable cipher.
  130. * \hideinitializer
  131. */
  132. #define SPIM_DISABLE_CIPHER() (SPIM->CTL0 |= SPIM_CTL0_CIPHOFF_Msk)
  133. /**
  134. * @details Enable cipher balance
  135. * \hideinitializer
  136. */
  137. #define SPIM_ENABLE_BALEN() (SPIM->CTL0 |= SPIM_CTL0_BALEN_Msk)
  138. /**
  139. * @details Disable cipher balance
  140. * \hideinitializer
  141. */
  142. #define SPIM_DISABLE_BALEN() (SPIM->CTL0 &= ~SPIM_CTL0_BALEN_Msk)
  143. /**
  144. * @details Set 4-byte address to be enabled/disabled.
  145. * \hideinitializer
  146. */
  147. #define SPIM_SET_4BYTE_ADDR_EN(x) \
  148. do { \
  149. SPIM->CTL0 = (SPIM->CTL0 & (~SPIM_CTL0_B4ADDREN_Msk)) | (((x) ? 1UL : 0UL) << SPIM_CTL0_B4ADDREN_Pos); \
  150. } while (0)
  151. /**
  152. * @details Enable SPIM interrupt
  153. * \hideinitializer
  154. */
  155. #define SPIM_ENABLE_INT() (SPIM->CTL0 |= SPIM_CTL0_IEN_Msk)
  156. /**
  157. * @details Disable SPIM interrupt
  158. * \hideinitializer
  159. */
  160. #define SPIM_DISABLE_INT() (SPIM->CTL0 &= ~SPIM_CTL0_IEN_Msk)
  161. /**
  162. * @details Is interrupt flag on.
  163. * \hideinitializer
  164. */
  165. #define SPIM_IS_IF_ON() ((SPIM->CTL0 & SPIM_CTL0_IF_Msk) != 0UL)
  166. /**
  167. * @details Clear interrupt flag.
  168. * \hideinitializer
  169. */
  170. #define SPIM_CLR_INT() \
  171. do { \
  172. SPIM->CTL0 = (SPIM->CTL0 & (~SPIM_CTL0_IF_Msk)) | (1UL << SPIM_CTL0_IF_Pos); \
  173. } while (0)
  174. /**
  175. * @details Set transmit/receive bit length
  176. * \hideinitializer
  177. */
  178. #define SPIM_SET_DATA_WIDTH(x) \
  179. do { \
  180. SPIM->CTL0 = (SPIM->CTL0 & (~SPIM_CTL0_DWIDTH_Msk)) | (((x) - 1U) << SPIM_CTL0_DWIDTH_Pos); \
  181. } while (0)
  182. /**
  183. * @details Get data transmit/receive bit length setting
  184. * \hideinitializer
  185. */
  186. #define SPIM_GET_DATA_WIDTH() \
  187. (((SPIM->CTL0 & SPIM_CTL0_DWIDTH_Msk) >> SPIM_CTL0_DWIDTH_Pos)+1U)
  188. /**
  189. * @details Set data transmit/receive burst number
  190. * \hideinitializer
  191. */
  192. #define SPIM_SET_DATA_NUM(x) \
  193. do { \
  194. SPIM->CTL0 = (SPIM->CTL0 & (~SPIM_CTL0_BURSTNUM_Msk)) | (((x) - 1U) << SPIM_CTL0_BURSTNUM_Pos); \
  195. } while (0)
  196. /**
  197. * @details Get data transmit/receive burst number
  198. * \hideinitializer
  199. */
  200. #define SPIM_GET_DATA_NUM() \
  201. (((SPIM->CTL0 & SPIM_CTL0_BURSTNUM_Msk) >> SPIM_CTL0_BURSTNUM_Pos)+1U)
  202. /**
  203. * @details Enable Single Input mode.
  204. * \hideinitializer
  205. */
  206. #define SPIM_ENABLE_SING_INPUT_MODE() \
  207. do { \
  208. SPIM->CTL0 = (SPIM->CTL0 & (~(SPIM_CTL0_BITMODE_Msk | SPIM_CTL0_QDIODIR_Msk))) | (SPIM_CTL0_BITMODE_SING | SPIM_CTL0_RW_IN(1)); \
  209. } while (0)
  210. /**
  211. * @details Enable Single Output mode.
  212. * \hideinitializer
  213. */
  214. #define SPIM_ENABLE_SING_OUTPUT_MODE() \
  215. do { \
  216. SPIM->CTL0 = (SPIM->CTL0 & (~(SPIM_CTL0_BITMODE_Msk | SPIM_CTL0_QDIODIR_Msk))) | (SPIM_CTL0_BITMODE_SING | SPIM_CTL0_RW_IN(0)); \
  217. } while (0)
  218. /**
  219. * @details Enable Dual Input mode.
  220. * \hideinitializer
  221. */
  222. #define SPIM_ENABLE_DUAL_INPUT_MODE() \
  223. do { \
  224. SPIM->CTL0 = (SPIM->CTL0 & (~(SPIM_CTL0_BITMODE_Msk | SPIM_CTL0_QDIODIR_Msk))) | (SPIM_CTL0_BITMODE_DUAL | SPIM_CTL0_RW_IN(1U)); \
  225. } while (0)
  226. /**
  227. * @details Enable Dual Output mode.
  228. * \hideinitializer
  229. */
  230. #define SPIM_ENABLE_DUAL_OUTPUT_MODE() \
  231. do { \
  232. SPIM->CTL0 = (SPIM->CTL0 & (~(SPIM_CTL0_BITMODE_Msk | SPIM_CTL0_QDIODIR_Msk))) | (SPIM_CTL0_BITMODE_DUAL | SPIM_CTL0_RW_IN(0U)); \
  233. } while (0)
  234. /**
  235. * @details Enable Quad Input mode.
  236. * \hideinitializer
  237. */
  238. #define SPIM_ENABLE_QUAD_INPUT_MODE() \
  239. do { \
  240. SPIM->CTL0 = (SPIM->CTL0 & (~(SPIM_CTL0_BITMODE_Msk | SPIM_CTL0_QDIODIR_Msk))) | (SPIM_CTL0_BITMODE_QUAD | SPIM_CTL0_RW_IN(1U)); \
  241. } while (0)
  242. /**
  243. * @details Enable Quad Output mode.
  244. * \hideinitializer
  245. */
  246. #define SPIM_ENABLE_QUAD_OUTPUT_MODE() \
  247. do { \
  248. SPIM->CTL0 = (SPIM->CTL0 & (~(SPIM_CTL0_BITMODE_Msk | SPIM_CTL0_QDIODIR_Msk))) | (SPIM_CTL0_BITMODE_QUAD | SPIM_CTL0_RW_IN(0U)); \
  249. } while (0)
  250. /**
  251. * @details Set suspend interval which ranges between 0 and 15.
  252. * \hideinitializer
  253. */
  254. #define SPIM_SET_SUSP_INTVL(x) \
  255. do { \
  256. SPIM->CTL0 = (SPIM->CTL0 & (~SPIM_CTL0_SUSPITV_Msk)) | ((x) << SPIM_CTL0_SUSPITV_Pos); \
  257. } while (0)
  258. /**
  259. * @details Get suspend interval setting
  260. * \hideinitializer
  261. */
  262. #define SPIM_GET_SUSP_INTVL() \
  263. ((SPIM->CTL0 & SPIM_CTL0_SUSPITV_Msk) >> SPIM_CTL0_SUSPITV_Pos)
  264. /**
  265. * @details Set operation mode.
  266. * \hideinitializer
  267. */
  268. #define SPIM_SET_OPMODE(x) \
  269. do { \
  270. SPIM->CTL0 = (SPIM->CTL0 & (~SPIM_CTL0_OPMODE_Msk)) | (x); \
  271. } while (0)
  272. /**
  273. * @details Get operation mode.
  274. * \hideinitializer
  275. */
  276. #define SPIM_GET_OP_MODE() (SPIM->CTL0 & SPIM_CTL0_OPMODE_Msk)
  277. /**
  278. * @details Set SPIM mode.
  279. * \hideinitializer
  280. */
  281. #define SPIM_SET_SPIM_MODE(x) \
  282. do { \
  283. SPIM->CTL0 = (SPIM->CTL0 & (~SPIM_CTL0_CMDCODE_Msk)) | (x); \
  284. } while (0)
  285. /**
  286. * @details Get SPIM mode.
  287. * \hideinitializer
  288. */
  289. #define SPIM_GET_SPIM_MODE() (SPIM->CTL0 & SPIM_CTL0_CMDCODE_Msk)
  290. /**
  291. * @details Start operation.
  292. * \hideinitializer
  293. */
  294. #define SPIM_SET_GO() (SPIM->CTL1 |= SPIM_CTL1_SPIMEN_Msk)
  295. /**
  296. * @details Is engine busy.
  297. * \hideinitializer
  298. */
  299. #define SPIM_IS_BUSY() (SPIM->CTL1 & SPIM_CTL1_SPIMEN_Msk)
  300. /**
  301. * @details Wait for free.
  302. * \hideinitializer
  303. */
  304. #define SPIM_WAIT_FREE() while (SPIM->CTL1 & SPIM_CTL1_SPIMEN_Msk)
  305. /**
  306. * @details Enable cache.
  307. * \hideinitializer
  308. */
  309. #define SPIM_ENABLE_CACHE() (SPIM->CTL1 &= ~SPIM_CTL1_CACHEOFF_Msk)
  310. /**
  311. * @details Disable cache.
  312. * \hideinitializer
  313. */
  314. #define SPIM_DISABLE_CACHE() (SPIM->CTL1 |= SPIM_CTL1_CACHEOFF_Msk)
  315. /**
  316. * @details Is cache enabled.
  317. * \hideinitializer
  318. */
  319. #define SPIM_IS_CACHE_EN() ((SPIM->CTL1 & SPIM_CTL1_CACHEOFF_Msk) ? 0 : 1)
  320. /**
  321. * @details Enable CCM
  322. * \hideinitializer
  323. */
  324. #define SPIM_ENABLE_CCM() (SPIM->CTL1 |= SPIM_CTL1_CCMEN_Msk)
  325. /**
  326. * @details Disable CCM.
  327. * \hideinitializer
  328. */
  329. #define SPIM_DISABLE_CCM() (SPIM->CTL1 &= ~SPIM_CTL1_CCMEN_Msk)
  330. /**
  331. * @details Is CCM enabled.
  332. * \hideinitializer
  333. */
  334. #define SPIM_IS_CCM_EN() ((SPIM->CTL1 & SPIM_CTL1_CCMEN_Msk) >> SPIM_CTL1_CCMEN_Pos)
  335. /**
  336. * @details Invalidate cache.
  337. * \hideinitializer
  338. */
  339. #define SPIM_INVALID_CACHE() (SPIM->CTL1 |= SPIM_CTL1_CDINVAL_Msk)
  340. /**
  341. * @details Set SS(Select Active) to active level.
  342. * \hideinitializer
  343. */
  344. #define SPIM_SET_SS_EN(x) \
  345. do { \
  346. (SPIM->CTL1 = (SPIM->CTL1 & (~SPIM_CTL1_SS_Msk)) | ((! (x) ? 1UL : 0UL) << SPIM_CTL1_SS_Pos)); \
  347. } while (0)
  348. /**
  349. * @details Is SS(Select Active) in active level.
  350. * \hideinitializer
  351. */
  352. #define SPIM_GET_SS_EN() \
  353. (!(SPIM->CTL1 & SPIM_CTL1_SS_Msk))
  354. /**
  355. * @details Set active level of slave select to be high/low.
  356. * \hideinitializer
  357. */
  358. #define SPIM_SET_SS_ACTLVL(x) \
  359. do { \
  360. (SPIM->CTL1 = (SPIM->CTL1 & (~SPIM_CTL1_SSACTPOL_Msk)) | ((!! (x) ? 1UL : 0UL) << SPIM_CTL1_SSACTPOL_Pos)); \
  361. } while (0)
  362. /**
  363. * @details Set idle time interval
  364. * \hideinitializer
  365. */
  366. #define SPIM_SET_IDL_INTVL(x) \
  367. do { \
  368. SPIM->CTL1 = (SPIM->CTL1 & (~SPIM_CTL1_IDLETIME_Msk)) | ((x) << SPIM_CTL1_IDLETIME_Pos); \
  369. } while (0)
  370. /**
  371. * @details Get idle time interval setting
  372. * \hideinitializer
  373. */
  374. #define SPIM_GET_IDL_INTVL() \
  375. ((SPIM->CTL1 & SPIM_CTL1_IDLETIME_Msk) >> SPIM_CTL1_IDLETIME_Pos)
  376. /**
  377. * @details Set SPIM clock divider
  378. * \hideinitializer
  379. */
  380. #define SPIM_SET_CLOCK_DIVIDER(x) \
  381. do { \
  382. SPIM->CTL1 = (SPIM->CTL1 & (~SPIM_CTL1_DIVIDER_Msk)) | ((x) << SPIM_CTL1_DIVIDER_Pos); \
  383. } while (0)
  384. /**
  385. * @details Get SPIM current clock divider setting
  386. * \hideinitializer
  387. */
  388. #define SPIM_GET_CLOCK_DIVIDER() \
  389. ((SPIM->CTL1 & SPIM_CTL1_DIVIDER_Msk) >> SPIM_CTL1_DIVIDER_Pos)
  390. /**
  391. * @details Set SPI flash deselect time interval of DMA write mode
  392. * \hideinitializer
  393. */
  394. #define SPIM_SET_RXCLKDLY_DWDELSEL(x) \
  395. do { \
  396. (SPIM->RXCLKDLY = (SPIM->RXCLKDLY & (~SPIM_RXCLKDLY_DWDELSEL_Msk)) | ((x) << SPIM_RXCLKDLY_DWDELSEL_Pos)); \
  397. } while (0)
  398. /**
  399. * @details Get SPI flash deselect time interval of DMA write mode
  400. * \hideinitializer
  401. */
  402. #define SPIM_GET_RXCLKDLY_DWDELSEL() \
  403. ((SPIM->RXCLKDLY & SPIM_RXCLKDLY_DWDELSEL_Msk) >> SPIM_RXCLKDLY_DWDELSEL_Pos)
  404. /**
  405. * @details Set sampling clock delay selection for received data
  406. * \hideinitializer
  407. */
  408. #define SPIM_SET_RXCLKDLY_RDDLYSEL(x) \
  409. do { \
  410. (SPIM->RXCLKDLY = (SPIM->RXCLKDLY & (~SPIM_RXCLKDLY_RDDLYSEL_Msk)) | ((x) << SPIM_RXCLKDLY_RDDLYSEL_Pos)); \
  411. } while (0)
  412. /**
  413. * @details Get sampling clock delay selection for received data
  414. * \hideinitializer
  415. */
  416. #define SPIM_GET_RXCLKDLY_RDDLYSEL() \
  417. ((SPIM->RXCLKDLY & SPIM_RXCLKDLY_RDDLYSEL_Msk) >> SPIM_RXCLKDLY_RDDLYSEL_Pos)
  418. /**
  419. * @details Set sampling clock edge selection for received data
  420. * \hideinitializer
  421. */
  422. #define SPIM_SET_RXCLKDLY_RDEDGE() \
  423. (SPIM->RXCLKDLY |= SPIM_RXCLKDLY_RDEDGE_Msk); \
  424. /**
  425. * @details Get sampling clock edge selection for received data
  426. * \hideinitializer
  427. */
  428. #define SPIM_CLR_RXCLKDLY_RDEDGE() \
  429. (SPIM->RXCLKDLY &= ~SPIM_RXCLKDLY_RDEDGE_Msk)
  430. /**
  431. * @details Set mode bits data for continuous read mode
  432. * \hideinitializer
  433. */
  434. #define SPIM_SET_DMMCTL_CRMDAT(x) \
  435. do { \
  436. (SPIM->DMMCTL = (SPIM->DMMCTL & (~SPIM_DMMCTL_CRMDAT_Msk)) | ((x) << SPIM_DMMCTL_CRMDAT_Pos)) | SPIM_DMMCTL_CREN_Msk; \
  437. } while (0)
  438. /**
  439. * @details Get mode bits data for continuous read mode
  440. * \hideinitializer
  441. */
  442. #define SPIM_GET_DMMCTL_CRMDAT() \
  443. ((SPIM->DMMCTL & SPIM_DMMCTL_CRMDAT_Msk) >> SPIM_DMMCTL_CRMDAT_Pos)
  444. /**
  445. * @details Set DMM mode SPI flash deselect time
  446. * \hideinitializer
  447. */
  448. #define SPIM_DMM_SET_DESELTIM(x) \
  449. do { \
  450. SPIM->DMMCTL = (SPIM->DMMCTL & ~SPIM_DMMCTL_DESELTIM_Msk) | (((x) & 0x1FUL) << SPIM_DMMCTL_DESELTIM_Pos); \
  451. } while (0)
  452. /**
  453. * @details Get current DMM mode SPI flash deselect time setting
  454. * \hideinitializer
  455. */
  456. #define SPIM_DMM_GET_DESELTIM() \
  457. ((SPIM->DMMCTL & SPIM_DMMCTL_DESELTIM_Msk) >> SPIM_DMMCTL_DESELTIM_Pos)
  458. /**
  459. * @details Enable DMM mode burst wrap mode
  460. * \hideinitializer
  461. */
  462. #define SPIM_DMM_ENABLE_BWEN() (SPIM->DMMCTL |= SPIM_DMMCTL_BWEN_Msk)
  463. /**
  464. * @details Disable DMM mode burst wrap mode
  465. * \hideinitializer
  466. */
  467. #define SPIM_DMM_DISABLE_BWEN() (SPIM->DMMCTL &= ~SPIM_DMMCTL_BWEN_Msk)
  468. /**
  469. * @details Enable DMM mode continuous read mode
  470. * \hideinitializer
  471. */
  472. #define SPIM_DMM_ENABLE_CREN() (SPIM->DMMCTL |= SPIM_DMMCTL_CREN_Msk)
  473. /**
  474. * @details Disable DMM mode continuous read mode
  475. * \hideinitializer
  476. */
  477. #define SPIM_DMM_DISABLE_CREN() (SPIM->DMMCTL &= ~SPIM_DMMCTL_CREN_Msk)
  478. /**
  479. * @details Set DMM mode SPI flash active SCLK time
  480. * \hideinitializer
  481. */
  482. #define SPIM_DMM_SET_ACTSCLKT(x) \
  483. do { \
  484. SPIM->DMMCTL = (SPIM->DMMCTL & ~SPIM_DMMCTL_ACTSCLKT_Msk) | (((x) & 0xFUL) << SPIM_DMMCTL_ACTSCLKT_Pos) | SPIM_DMMCTL_UACTSCLK_Msk; \
  485. } while (0)
  486. /**
  487. * @details Set SPI flash active SCLK time as SPIM default
  488. * \hideinitializer
  489. */
  490. #define SPIM_DMM_SET_DEFAULT_ACTSCLK() (SPIM->DMMCTL &= ~SPIM_DMMCTL_UACTSCLK_Msk)
  491. /**
  492. * @details Set dummy cycle number (Only for DMM mode and DMA mode)
  493. * \hideinitializer
  494. */
  495. #define SPIM_SET_DCNUM(x) \
  496. do { \
  497. SPIM->CTL2 = (SPIM->CTL2 & ~SPIM_CTL2_DCNUM_Msk) | (((x) & 0x1FUL) << SPIM_CTL2_DCNUM_Pos) | SPIM_CTL2_USETEN_Msk; \
  498. } while (0)
  499. /**
  500. * @details Set dummy cycle number (Only for DMM mode and DMA mode) as SPIM default
  501. * \hideinitializer
  502. */
  503. #define SPIM_SET_DEFAULT_DCNUM(x) (SPIM->CTL2 &= ~SPIM_CTL2_USETEN_Msk)
  504. /*---------------------------------------------------------------------------------------------------------*/
  505. /* Define Function Prototypes */
  506. /*---------------------------------------------------------------------------------------------------------*/
  507. int SPIM_InitFlash(int clrWP);
  508. uint32_t SPIM_GetSClkFreq(void);
  509. void SPIM_ReadJedecId(uint8_t idBuf[], uint32_t u32NRx, uint32_t u32NBit);
  510. int SPIM_Enable_4Bytes_Mode(int isEn, uint32_t u32NBit);
  511. int SPIM_Is4ByteModeEnable(uint32_t u32NBit);
  512. void SPIM_ChipErase(uint32_t u32NBit, int isSync);
  513. void SPIM_EraseBlock(uint32_t u32Addr, int is4ByteAddr, uint8_t u8ErsCmd, uint32_t u32NBit, int isSync);
  514. void SPIM_IO_Write(uint32_t u32Addr, int is4ByteAddr, uint32_t u32NTx, uint8_t pu8TxBuf[], uint8_t wrCmd, uint32_t u32NBitCmd, uint32_t u32NBitAddr, uint32_t u32NBitDat);
  515. void SPIM_IO_Read(uint32_t u32Addr, int is4ByteAddr, uint32_t u32NRx, uint8_t pu8RxBuf[], uint8_t rdCmd, uint32_t u32NBitCmd, uint32_t u32NBitAddr, uint32_t u32NBitDat, int u32NDummy);
  516. void SPIM_DMA_Write(uint32_t u32Addr, int is4ByteAddr, uint32_t u32NTx, uint8_t pu8TxBuf[], uint32_t wrCmd);
  517. void SPIM_DMA_Read(uint32_t u32Addr, int is4ByteAddr, uint32_t u32NRx, uint8_t pu8RxBuf[], uint32_t u32RdCmd, int isSync);
  518. void SPIM_EnterDirectMapMode(int is4ByteAddr, uint32_t u32RdCmd, uint32_t u32IdleIntvl);
  519. void SPIM_ExitDirectMapMode(void);
  520. void SPIM_SetQuadEnable(int isEn, uint32_t u32NBit);
  521. void SPIM_WinbondUnlock(uint32_t u32NBit);
  522. /*@}*/ /* end of group SPIM_EXPORTED_FUNCTIONS */
  523. /*@}*/ /* end of group SPIM_Driver */
  524. /*@}*/ /* end of group Standard_Driver */
  525. #ifdef __cplusplus
  526. }
  527. #endif
  528. #endif /* __NU_SPIM_H__ */
  529. /*** (C) COPYRIGHT 2017 Nuvoton Technology Corp. ***/