hc32f460_spi.h 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  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_spi.h
  11. **
  12. ** A detailed description is available at
  13. ** @link SpiGroup Serial Peripheral Interface description @endlink
  14. **
  15. ** - 2018-10-29 CDT First version for Device Driver Library of Spi.
  16. **
  17. ******************************************************************************/
  18. #ifndef __HC32F460_SPI_H__
  19. #define __HC32F460_SPI_H__
  20. /*******************************************************************************
  21. * Include files
  22. ******************************************************************************/
  23. #include "hc32_common.h"
  24. #include "ddl_config.h"
  25. #if (DDL_SPI_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 SpiGroup Serial Peripheral Interface(SPI)
  34. **
  35. ******************************************************************************/
  36. //@{
  37. /*******************************************************************************
  38. * Global type definitions ('typedef')
  39. ******************************************************************************/
  40. /**
  41. *******************************************************************************
  42. ** \brief SPI parity enumeration
  43. ******************************************************************************/
  44. typedef enum en_spi_parity
  45. {
  46. SpiParityEven = 0u, ///< Select even parity send and receive
  47. SpiParityOdd = 1u, ///< Select odd parity send and receive
  48. } en_spi_parity_t;
  49. /**
  50. *******************************************************************************
  51. ** \brief SPI master/slave mode enumeration
  52. ******************************************************************************/
  53. typedef enum en_spi_master_slave_mode
  54. {
  55. SpiModeSlave = 0u, ///< Spi slave mode
  56. SpiModeMaster = 1u, ///< Spi master mode
  57. } en_spi_master_slave_mode_t;
  58. /**
  59. *******************************************************************************
  60. ** \brief SPI transmission mode enumeration
  61. ******************************************************************************/
  62. typedef enum en_spi_trans_mode
  63. {
  64. SpiTransFullDuplex = 0u, ///< Full duplex sync serial communication
  65. SpiTransOnlySend = 1u, ///< Only send serial communication
  66. } en_spi_trans_mode_t;
  67. /**
  68. *******************************************************************************
  69. ** \brief SPI work mode enumeration
  70. ******************************************************************************/
  71. typedef enum en_spi_work_mode
  72. {
  73. SpiWorkMode4Line = 0u, ///< 4 lines spi work mode
  74. SpiWorkMode3Line = 1u, ///< 3 lines spi work mode(clock sync running)
  75. } en_spi_work_mode_t;
  76. /**
  77. *******************************************************************************
  78. ** \brief SPI SS interval time enumeration
  79. ******************************************************************************/
  80. typedef enum en_spi_ss_interval_time
  81. {
  82. SpiSsIntervalSck1PlusPck2 = 0u, ///< Spi SS interval time 1 SCK plus 2 PCLK1
  83. SpiSsIntervalSck2PlusPck2 = 1u, ///< Spi SS interval time 2 SCK plus 2 PCLK1
  84. SpiSsIntervalSck3PlusPck2 = 2u, ///< Spi SS interval time 3 SCK plus 2 PCLK1
  85. SpiSsIntervalSck4PlusPck2 = 3u, ///< Spi SS interval time 4 SCK plus 2 PCLK1
  86. SpiSsIntervalSck5PlusPck2 = 4u, ///< Spi SS interval time 5 SCK plus 2 PCLK1
  87. SpiSsIntervalSck6PlusPck2 = 5u, ///< Spi SS interval time 6 SCK plus 2 PCLK1
  88. SpiSsIntervalSck7PlusPck2 = 6u, ///< Spi SS interval time 7 SCK plus 2 PCLK1
  89. SpiSsIntervalSck8PlusPck2 = 7u, ///< Spi SS interval time 8 SCK plus 2 PCLK1
  90. } en_spi_ss_interval_time_t;
  91. /**
  92. *******************************************************************************
  93. ** \brief SPI SS setup delay SCK enumeration
  94. ******************************************************************************/
  95. typedef enum en_spi_ss_setup_delay
  96. {
  97. SpiSsSetupDelaySck1 = 0u, ///< Spi SS setup delay 1 SCK
  98. SpiSsSetupDelaySck2 = 1u, ///< Spi SS setup delay 2 SCK
  99. SpiSsSetupDelaySck3 = 2u, ///< Spi SS setup delay 3 SCK
  100. SpiSsSetupDelaySck4 = 3u, ///< Spi SS setup delay 4 SCK
  101. SpiSsSetupDelaySck5 = 4u, ///< Spi SS setup delay 5 SCK
  102. SpiSsSetupDelaySck6 = 5u, ///< Spi SS setup delay 6 SCK
  103. SpiSsSetupDelaySck7 = 6u, ///< Spi SS setup delay 7 SCK
  104. SpiSsSetupDelaySck8 = 7u, ///< Spi SS setup delay 8 SCK
  105. } en_spi_ss_setup_delay_t;
  106. /**
  107. *******************************************************************************
  108. ** \brief SPI SS hold delay SCK enumeration
  109. ******************************************************************************/
  110. typedef enum en_spi_ss_hold_delay
  111. {
  112. SpiSsHoldDelaySck1 = 0u, ///< Spi SS hold delay 1 SCK
  113. SpiSsHoldDelaySck2 = 1u, ///< Spi SS hold delay 2 SCK
  114. SpiSsHoldDelaySck3 = 2u, ///< Spi SS hold delay 3 SCK
  115. SpiSsHoldDelaySck4 = 3u, ///< Spi SS hold delay 4 SCK
  116. SpiSsHoldDelaySck5 = 4u, ///< Spi SS hold delay 5 SCK
  117. SpiSsHoldDelaySck6 = 5u, ///< Spi SS hold delay 6 SCK
  118. SpiSsHoldDelaySck7 = 6u, ///< Spi SS hold delay 7 SCK
  119. SpiSsHoldDelaySck8 = 7u, ///< Spi SS hold delay 8 SCK
  120. } en_spi_ss_hold_delay_t;
  121. /**
  122. *******************************************************************************
  123. ** \brief SPI slave select polarity enumeration
  124. ******************************************************************************/
  125. typedef enum en_spi_ss_polarity
  126. {
  127. SpiSsLowValid = 0u, ///< SS0~3 signal low level valid
  128. SpiSsHighValid = 1u, ///< SS0~3 signal high level valid
  129. } en_spi_ss_polarity_t;
  130. /**
  131. *******************************************************************************
  132. ** \brief SPI data register read object enumeration
  133. ******************************************************************************/
  134. typedef enum en_spi_read_object
  135. {
  136. SpiReadReceiverBuffer = 0u, ///< Read receive buffer
  137. SpiReadSendBuffer = 1u, ///< Read send buffer(must be read when TDEF=1)
  138. } en_spi_read_object_t;
  139. /**
  140. *******************************************************************************
  141. ** \brief SPI frame number enumeration
  142. ******************************************************************************/
  143. typedef enum en_spi_frame_number
  144. {
  145. SpiFrameNumber1 = 0u, ///< 1 frame data
  146. SpiFrameNumber2 = 1u, ///< 2 frame data
  147. SpiFrameNumber3 = 2u, ///< 3 frame data
  148. SpiFrameNumber4 = 3u, ///< 4 frame data
  149. } en_spi_frame_number_t;
  150. /**
  151. *******************************************************************************
  152. ** \brief SPI SS setup delay SCK option enumeration
  153. ******************************************************************************/
  154. typedef enum en_spi_ss_setup_delay_option
  155. {
  156. SpiSsSetupDelayTypicalSck1 = 0u, ///< SS setup delay 1 SCK
  157. SpiSsSetupDelayCustomValue = 1u, ///< SS setup delay SCKDL register set value
  158. } en_spi_ss_setup_delay_option_t;
  159. /**
  160. *******************************************************************************
  161. ** \brief SPI SS hold delay SCK option enumeration
  162. ******************************************************************************/
  163. typedef enum en_spi_ss_hold_delay_option
  164. {
  165. SpiSsHoldDelayTypicalSck1 = 0u, ///< SS hold delay 1 SCK
  166. SpiSsHoldDelayCustomValue = 1u, ///< SS hold delay SSDL register set value
  167. } en_spi_ss_hold_delay_option_t;
  168. /**
  169. *******************************************************************************
  170. ** \brief SPI SS interval time option enumeration
  171. ******************************************************************************/
  172. typedef enum en_spi_ss_interval_time_option
  173. {
  174. SpiSsIntervalTypicalSck1PlusPck2 = 0u, ///< Spi SS interval time 1 SCK plus 2 PCLK1
  175. SpiSsIntervalCustomValue = 1u, ///< Spi SS interval time NXTDL register set value
  176. } en_spi_ss_interval_time_option_t;
  177. /**
  178. *******************************************************************************
  179. ** \brief SPI first bit position enumeration
  180. ******************************************************************************/
  181. typedef enum en_spi_first_bit_position
  182. {
  183. SpiFirstBitPositionMSB = 0u, ///< Spi first bit to MSB
  184. SpiFirstBitPositionLSB = 1u, ///< Spi first bit to LSB
  185. } en_spi_first_bit_position_t;
  186. /**
  187. *******************************************************************************
  188. ** \brief SPI data length enumeration
  189. ******************************************************************************/
  190. typedef enum en_spi_data_length
  191. {
  192. SpiDataLengthBit4 = 0u, ///< 4 bits
  193. SpiDataLengthBit5 = 1u, ///< 5 bits
  194. SpiDataLengthBit6 = 2u, ///< 6 bits
  195. SpiDataLengthBit7 = 3u, ///< 7 bits
  196. SpiDataLengthBit8 = 4u, ///< 8 bits
  197. SpiDataLengthBit9 = 5u, ///< 9 bits
  198. SpiDataLengthBit10 = 6u, ///< 10 bits
  199. SpiDataLengthBit11 = 7u, ///< 11 bits
  200. SpiDataLengthBit12 = 8u, ///< 12 bits
  201. SpiDataLengthBit13 = 9u, ///< 13 bits
  202. SpiDataLengthBit14 = 10u, ///< 14 bits
  203. SpiDataLengthBit15 = 11u, ///< 15 bits
  204. SpiDataLengthBit16 = 12u, ///< 16 bits
  205. SpiDataLengthBit20 = 13u, ///< 20 bits
  206. SpiDataLengthBit24 = 14u, ///< 24 bits
  207. SpiDataLengthBit32 = 15u, ///< 32 bits
  208. } en_spi_data_length_t;
  209. /**
  210. *******************************************************************************
  211. ** \brief SPI SS valid channel select enumeration
  212. ******************************************************************************/
  213. typedef enum en_spi_ss_valid_channel
  214. {
  215. SpiSsValidChannel0 = 0u, ///< Select SS0 valid
  216. SpiSsValidChannel1 = 1u, ///< Select SS1 valid
  217. SpiSsValidChannel2 = 2u, ///< Select SS2 valid
  218. SpiSsValidChannel3 = 3u, ///< Select SS3 valid
  219. } en_spi_ss_valid_channel_t;
  220. /**
  221. *******************************************************************************
  222. ** \brief SPI clock division enumeration
  223. ******************************************************************************/
  224. typedef enum en_spi_clk_div
  225. {
  226. SpiClkDiv2 = 0u, ///< Spi pclk1 division 2
  227. SpiClkDiv4 = 1u, ///< Spi pclk1 division 4
  228. SpiClkDiv8 = 2u, ///< Spi pclk1 division 8
  229. SpiClkDiv16 = 3u, ///< Spi pclk1 division 16
  230. SpiClkDiv32 = 4u, ///< Spi pclk1 division 32
  231. SpiClkDiv64 = 5u, ///< Spi pclk1 division 64
  232. SpiClkDiv128 = 6u, ///< Spi pclk1 division 128
  233. SpiClkDiv256 = 7u, ///< Spi pclk1 division 256
  234. } en_spi_clk_div_t;
  235. /**
  236. *******************************************************************************
  237. ** \brief SPI SCK polarity enumeration
  238. ******************************************************************************/
  239. typedef enum en_spi_sck_polarity
  240. {
  241. SpiSckIdleLevelLow = 0u, ///< SCK is low level when SCK idle
  242. SpiSckIdleLevelHigh = 1u, ///< SCK is high level when SCK idle
  243. } en_spi_sck_polarity_t;
  244. /**
  245. *******************************************************************************
  246. ** \brief SPI SCK phase enumeration
  247. ******************************************************************************/
  248. typedef enum en_spi_sck_phase
  249. {
  250. SpiSckOddSampleEvenChange = 0u, ///< SCK Odd edge data sample,even edge data change
  251. SpiSckOddChangeEvenSample = 1u, ///< SCK Odd edge data change,even edge data sample
  252. } en_spi_sck_phase_t;
  253. /**
  254. *******************************************************************************
  255. ** \brief SPI interrupt request type enumeration
  256. ******************************************************************************/
  257. typedef enum en_spi_irq_type
  258. {
  259. SpiIrqIdle = 0u, ///< Spi idle interrupt request
  260. SpiIrqReceive = 1u, ///< Spi receive interrupt request
  261. SpiIrqSend = 2u, ///< Spi send interrupt request
  262. SpiIrqError = 3u, ///< Spi error interrupt request
  263. } en_spi_irq_type_t;
  264. /**
  265. *******************************************************************************
  266. ** \brief SPI flag type enumeration
  267. ******************************************************************************/
  268. typedef enum en_spi_flag_type
  269. {
  270. SpiFlagReceiveBufferFull = 0u, ///< Receive buffer full flag
  271. SpiFlagSendBufferEmpty = 1u, ///< Send buffer empty flag
  272. SpiFlagUnderloadError = 2u, ///< Underload error flag
  273. SpiFlagParityError = 3u, ///< Parity error flag
  274. SpiFlagModeFaultError = 4u, ///< Mode fault error flag
  275. SpiFlagSpiIdle = 5u, ///< SPI idle flag
  276. SpiFlagOverloadError = 6u, ///< Overload error flag
  277. } en_spi_flag_type_t;
  278. /**
  279. *******************************************************************************
  280. ** \brief SPI SS channel enumeration
  281. ******************************************************************************/
  282. typedef enum en_spi_ss_channel
  283. {
  284. SpiSsChannel0 = 0u, ///< SS0 channel
  285. SpiSsChannel1 = 1u, ///< SS1 channel
  286. SpiSsChannel2 = 2u, ///< SS2 channel
  287. SpiSsChannel3 = 3u, ///< SS3 channel
  288. } en_spi_ss_channel_t;
  289. /**
  290. *******************************************************************************
  291. ** \brief SPI bus delay structure definition
  292. **
  293. ** \note Slave mode stc_spi_delay_config_t is invalid
  294. ******************************************************************************/
  295. typedef struct stc_spi_delay_config
  296. {
  297. en_spi_ss_setup_delay_option_t enSsSetupDelayOption; ///< SS setup delay time option
  298. en_spi_ss_setup_delay_t enSsSetupDelayTime; ///< SS setup delay time(the value valid when enSsSetupDelayOption is custom)
  299. en_spi_ss_hold_delay_option_t enSsHoldDelayOption; ///< SS hold delay time option
  300. en_spi_ss_hold_delay_t enSsHoldDelayTime; ///< SS hold delay time(the value valid when enSsHoldDelayOption is custom)
  301. en_spi_ss_interval_time_option_t enSsIntervalTimeOption; ///< SS interval time option
  302. en_spi_ss_interval_time_t enSsIntervalTime; ///< SS interval time(the value valid when enSsIntervalTimeOption is custom)
  303. } stc_spi_delay_config_t;
  304. /**
  305. *******************************************************************************
  306. ** \brief SPI SS config structure definition
  307. **
  308. ** \note 3 lines mode stc_spi_ss_config_t is invalid
  309. ******************************************************************************/
  310. typedef struct stc_spi_ss_config
  311. {
  312. en_spi_ss_valid_channel_t enSsValidBit; ///< SS valid channel select
  313. en_spi_ss_polarity_t enSs0Polarity; ///< SS0 signal polarity
  314. en_spi_ss_polarity_t enSs1Polarity; ///< SS1 signal polarity
  315. en_spi_ss_polarity_t enSs2Polarity; ///< SS2 signal polarity
  316. en_spi_ss_polarity_t enSs3Polarity; ///< SS3 signal polarity
  317. } stc_spi_ss_config_t;
  318. /**
  319. *******************************************************************************
  320. ** \brief SPI init structure definition
  321. ******************************************************************************/
  322. typedef struct stc_spi_init_t
  323. {
  324. stc_spi_delay_config_t stcDelayConfig; ///< SPI delay structure(Slave mode is invalid)
  325. stc_spi_ss_config_t stcSsConfig; ///< SS polarity and channel structure(3 lines mode invalid)
  326. en_spi_read_object_t enReadBufferObject; ///< Data register read object select(must be read when TDEF=1)
  327. en_spi_sck_polarity_t enSckPolarity; ///< Sck polarity
  328. en_spi_sck_phase_t enSckPhase; ///< Sck phase(This value must be SpiSckOddChangeEvenSample in 3-line mode)
  329. en_spi_clk_div_t enClkDiv; ///< SPI clock division
  330. en_spi_data_length_t enDataLength; ///< Data length
  331. en_spi_first_bit_position_t enFirstBitPosition; ///< Data first bit position
  332. en_spi_frame_number_t enFrameNumber; ///< Data frame number
  333. en_spi_work_mode_t enWorkMode; ///< Spi work mode
  334. en_spi_trans_mode_t enTransMode; ///< transmission mode
  335. en_spi_master_slave_mode_t enMasterSlaveMode; ///< Spi master/slave mode
  336. en_functional_state_t enCommAutoSuspendEn; ///< Enable/disable Communication auto suspend
  337. en_functional_state_t enModeFaultErrorDetectEn; ///< Enable/disable Mode fault error detect
  338. en_functional_state_t enParitySelfDetectEn; ///< Enable/disable Parity self detect
  339. en_functional_state_t enParityEn; ///< Enable/disable Parity(if enable parity and SPI_CR1.TXMDS=1, receive data don't parity)
  340. en_spi_parity_t enParity; ///< Parity mode select
  341. } stc_spi_init_t;
  342. /*******************************************************************************
  343. * Global pre-processor symbols/macros ('#define')
  344. ******************************************************************************/
  345. /*******************************************************************************
  346. * Global variable definitions ('extern')
  347. ******************************************************************************/
  348. /*******************************************************************************
  349. Global function prototypes (definition in C source)
  350. ******************************************************************************/
  351. /* Base functions */
  352. en_result_t SPI_DeInit(M4_SPI_TypeDef *SPIx);
  353. en_result_t SPI_Init(M4_SPI_TypeDef *SPIx, const stc_spi_init_t *pstcSpiInitCfg);
  354. en_result_t SPI_GeneralLoopbackCmd(M4_SPI_TypeDef *SPIx, en_functional_state_t enNewSta);
  355. en_result_t SPI_ReverseLoopbackCmd(M4_SPI_TypeDef *SPIx, en_functional_state_t enNewSta);
  356. en_result_t SPI_Cmd(M4_SPI_TypeDef *SPIx, en_functional_state_t enNewSta);
  357. /* Send and receive data functions */
  358. en_result_t SPI_SendData8(M4_SPI_TypeDef *SPIx, uint8_t u8Data);
  359. en_result_t SPI_SendData16(M4_SPI_TypeDef *SPIx, uint16_t u16Data);
  360. en_result_t SPI_SendData32(M4_SPI_TypeDef *SPIx, uint32_t u32Data);
  361. uint8_t SPI_ReceiveData8(const M4_SPI_TypeDef *SPIx);
  362. uint16_t SPI_ReceiveData16(const M4_SPI_TypeDef *SPIx);
  363. uint32_t SPI_ReceiveData32(const M4_SPI_TypeDef *SPIx);
  364. /* Communication configure functions */
  365. en_result_t SPI_SetSsPolarity(M4_SPI_TypeDef *SPIx, en_spi_ss_channel_t enChannel,
  366. en_spi_ss_polarity_t enPolarity);
  367. en_result_t SPI_SetSsValidChannel(M4_SPI_TypeDef *SPIx, en_spi_ss_channel_t enChannel);
  368. en_result_t SPI_SetReadDataRegObject(M4_SPI_TypeDef *SPIx, en_spi_read_object_t enObject);
  369. en_result_t SPI_SetFrameNumber(M4_SPI_TypeDef *SPIx, en_spi_frame_number_t enFrameNum);
  370. en_result_t SPI_SetDataLength(M4_SPI_TypeDef *SPIx, en_spi_data_length_t enDataLength);
  371. en_result_t SPI_SetFirstBitPosition(M4_SPI_TypeDef *SPIx, en_spi_first_bit_position_t enPosition);
  372. en_result_t SPI_SetClockDiv(M4_SPI_TypeDef *SPIx, en_spi_clk_div_t enClkDiv);
  373. /* Interrupt and flags functions */
  374. en_result_t SPI_IrqCmd(M4_SPI_TypeDef *SPIx, en_spi_irq_type_t enIrq,
  375. en_functional_state_t enNewSta);
  376. en_flag_status_t SPI_GetFlag(M4_SPI_TypeDef *SPIx, en_spi_flag_type_t enFlag);
  377. en_result_t SPI_ClearFlag(M4_SPI_TypeDef *SPIx, en_spi_flag_type_t enFlag);
  378. //@} // SpiGroup
  379. #ifdef __cplusplus
  380. }
  381. #endif
  382. #endif /* DDL_SPI_ENABLE */
  383. #endif /* __HC32F460_SPI_H__ */
  384. /*******************************************************************************
  385. * EOF (not truncated)
  386. ******************************************************************************/