ciu32f003_std_spi(3).h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. /************************************************************************************************/
  2. /**
  3. * @file ciu32f003_std_spi.h
  4. * @author MCU Ecosystem Development Team
  5. * @brief SPI STD库驱动头文件。
  6. * 提供SPI相关的STD库操作函数声明、数据类型以及常量的定义。
  7. *
  8. *
  9. **************************************************************************************************
  10. * @attention
  11. * Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
  12. *
  13. **************************************************************************************************
  14. */
  15. /* 避免头文件重复引用 */
  16. #ifndef CIU32F003_STD_SPI_H
  17. #define CIU32F003_STD_SPI_H
  18. /************************************************************************************************/
  19. /**
  20. * @addtogroup CIU32F003_STD_Driver
  21. * @{
  22. */
  23. /**
  24. * @defgroup SPI SPI
  25. * @brief 串行外设接口的STD库驱动
  26. * @{
  27. */
  28. /************************************************************************************************/
  29. #ifdef __cplusplus
  30. extern "C" {
  31. #endif
  32. /*------------------------------------------includes--------------------------------------------*/
  33. #include "ciu32f003_std_common.h"
  34. /*-----------------------------------------type define------------------------------------------*/
  35. /************************************************************************************************/
  36. /**
  37. * @defgroup SPI_Types SPI Types
  38. * @brief SPI数据类型定义
  39. * @{
  40. *
  41. */
  42. /************************************************************************************************/
  43. /**
  44. * @brief SPI初始化配置结构体定义
  45. */
  46. typedef struct
  47. {
  48. uint32_t mode; /**< SPI工作模式
  49. @arg SPI_MODE_SLAVE
  50. @arg SPI_MODE_MASTER */
  51. uint32_t baud_rate_prescaler; /**< SPI速率配置参数
  52. @arg SPI_BAUD_PCLKDIV_2
  53. @arg SPI_BAUD_PCLKDIV_4 ...
  54. @note 主机输出时钟设置,从机不需要设置 */
  55. uint32_t clk_polarity; /**< SPI时钟极性
  56. @arg SPI_POLARITY_LOW
  57. @arg SPI_POLARITY_HIGH */
  58. uint32_t clk_phase; /**< SPI时钟相位
  59. @arg SPI_PHASE_1EDGE
  60. @arg SPI_PHASE_2EDGE */
  61. uint32_t bitorder; /**< SPI数据大小端
  62. @arg SPI_FIRSTBIT_MSB
  63. @arg SPI_FIRSTBIT_LSB */
  64. }std_spi_init_t;
  65. /**
  66. * @}
  67. */
  68. /*--------------------------------------------define--------------------------------------------*/
  69. /************************************************************************************************/
  70. /**
  71. * @defgroup SPI_Constants SPI Constants
  72. * @brief SPI常量定义及宏定义
  73. * @{
  74. */
  75. /************************************************************************************************/
  76. /* SPI 工作模式 */
  77. #define SPI_MODE_SLAVE (0x00000000U) /**< SPI从机模式 */
  78. #define SPI_MODE_MASTER SPI_CR1_MSTR /**< SPI主机模式 */
  79. /* SPI 速率配置参数 */
  80. #define SPI_BAUD_PCLKDIV_2 SPI_CR1_BR_PCLK_DIV_2 /**< SPI速率为fPLCK/2 */
  81. #define SPI_BAUD_PCLKDIV_4 SPI_CR1_BR_PCLK_DIV_4 /**< SPI速率为fPLCK/4 */
  82. #define SPI_BAUD_PCLKDIV_8 SPI_CR1_BR_PCLK_DIV_8 /**< SPI速率为fPLCK/8 */
  83. #define SPI_BAUD_PCLKDIV_16 SPI_CR1_BR_PCLK_DIV_16 /**< SPI速率为fPLCK/16 */
  84. #define SPI_BAUD_PCLKDIV_32 SPI_CR1_BR_PCLK_DIV_32 /**< SPI速率为fPLCK/32 */
  85. #define SPI_BAUD_PCLKDIV_64 SPI_CR1_BR_PCLK_DIV_64 /**< SPI速率为fPLCK/64 */
  86. #define SPI_BAUD_PCLKDIV_128 SPI_CR1_BR_PCLK_DIV_128 /**< SPI速率为fPLCK/128 */
  87. /* SPI 时钟极性 */
  88. #define SPI_POLARITY_LOW (0x00000000U) /**< SPI时钟空闲为低 */
  89. #define SPI_POLARITY_HIGH SPI_CR1_CPOL /**< SPI时钟空闲为高 */
  90. /* SPI 时钟相位 */
  91. #define SPI_PHASE_1EDGE (0x00000000U) /**< SPI数据采样在第一个时钟沿 */
  92. #define SPI_PHASE_2EDGE SPI_CR1_CPHA /**< SPI数据采样在第二个时钟沿 */
  93. /* SPI 数据大小端 */
  94. #define SPI_FIRSTBIT_MSB (0x00000000U) /**< SPI数据收发为高位优先 */
  95. #define SPI_FIRSTBIT_LSB SPI_CR1_LSBFIRST /**< SPI数据收发为低位优先 */
  96. /* SPI NSS输出状态*/
  97. #define SPI_NSS_OUTPUT_LOW (0x00000000U) /**< SPI片选信号输出低电平 */
  98. #define SPI_NSS_OUTPUT_HIGH SPI_CR2_NSSO /**< SPI片选信号输出高电平 */
  99. /* SPI 中断事件 */
  100. #define SPI_INTERRUPT_TXFE SPI_CR1_TXFEIE /**< SPI发送数据寄存器为空中断使能 */
  101. #define SPI_INTERRUPT_RXFNE SPI_CR1_RXFNEIE /**< SPI接收数据寄存器非空中断使能 */
  102. #define SPI_INTERRUPT_ERR SPI_CR1_ERRIE /**< SPI错误中断使能 */
  103. /* SPI 硬件状态信息 */
  104. #define SPI_FLAG_TXFE SPI_ISR_TXFE /**< SPI发送数据寄存器空标志 */
  105. #define SPI_FLAG_RXFNE SPI_ISR_RXFNE /**< SPI接收数据寄存器非空标志 */
  106. #define SPI_FLAG_BUSY SPI_ISR_BUSY /**< SPI总线传输状态标志 */
  107. #define SPI_FLAG_OVR SPI_ISR_OVR /**< SPI接收上溢出标志 */
  108. #define SPI_FLAG_MMF SPI_ISR_MMF /**< SPI主机模式冲突标志 */
  109. /* SPI 状态清除信息 */
  110. #define SPI_CLEAR_FLAG_OVR SPI_ICR_OVRCF /**< SPI主机上溢标志清除 */
  111. #define SPI_CLEAR_FLAG_MMF SPI_ICR_MMFCF /**< SPI主机模式冲突标志清除 */
  112. /**
  113. * @}
  114. */
  115. /*-------------------------------------------functions------------------------------------------*/
  116. /************************************************************************************************/
  117. /**
  118. * @defgroup SPI_External_Functions SPI External Functions
  119. * @brief SPI对外函数
  120. * @{
  121. *
  122. */
  123. /************************************************************************************************/
  124. /**
  125. * @brief 使能SPI
  126. * @retval 无
  127. */
  128. __STATIC_INLINE void std_spi_enable(void)
  129. {
  130. SPI1->CR1 |= SPI_CR1_SPE;
  131. }
  132. /**
  133. * @brief 禁止SPI
  134. * @retval 无
  135. */
  136. __STATIC_INLINE void std_spi_disable(void)
  137. {
  138. SPI1->CR1 &= (~SPI_CR1_SPE);
  139. }
  140. /**
  141. * @brief 设置SPI主从模式
  142. * @param mode SPI主从模式
  143. * @arg SPI_MODE_SLAVE
  144. * @arg SPI_MODE_MASTER
  145. * @retval 无
  146. */
  147. __STATIC_INLINE void std_spi_set_mode(uint32_t mode)
  148. {
  149. MODIFY_REG(SPI1->CR1, SPI_CR1_MSTR, mode);
  150. }
  151. /**
  152. * @brief 获取SPI主从模式
  153. * @retval uint32_t SPI主从模式
  154. * @arg SPI_MODE_SLAVE
  155. * @arg SPI_MODE_MASTER
  156. */
  157. __STATIC_INLINE uint32_t std_spi_get_mode(void)
  158. {
  159. return (SPI1->CR1 & SPI_CR1_MSTR);
  160. }
  161. /**
  162. * @brief 设置SPI波特率
  163. * @param baud_rate SPI波特率
  164. * @arg SPI_BAUD_PCLKDIV_2
  165. * @arg SPI_BAUD_PCLKDIV_4
  166. * @arg ...
  167. * @arg SPI_BAUD_PCLKDIV_128
  168. * @note 主机输出时钟设置,从机不需要设置
  169. * @retval 无
  170. */
  171. __STATIC_INLINE void std_spi_set_baud_rate(uint32_t baud_rate)
  172. {
  173. MODIFY_REG(SPI1->CR1, SPI_CR1_BR, baud_rate);
  174. }
  175. /**
  176. * @brief 获取SPI波特率
  177. * @retval uint32_t SPI波特率
  178. * @arg SPI_BAUD_PCLKDIV_2
  179. * @arg SPI_BAUD_PCLKDIV_4
  180. * @arg ...
  181. * @arg SPI_BAUD_PCLKDIV_128
  182. */
  183. __STATIC_INLINE uint32_t std_spi_get_baud_rate(void)
  184. {
  185. return (SPI1->CR1 & SPI_CR1_BR);
  186. }
  187. /**
  188. * @brief 设置SPI时钟极性
  189. * @param polarity SPI时钟极性
  190. * @arg SPI_POLARITY_LOW
  191. * @arg SPI_POLARITY_HIGH
  192. * @retval 无
  193. */
  194. __STATIC_INLINE void std_spi_set_polarity(uint32_t polarity)
  195. {
  196. MODIFY_REG(SPI1->CR1, SPI_CR1_CPOL, polarity);
  197. }
  198. /**
  199. * @brief 设置SPI时钟相位
  200. * @param phase SPI时钟相位
  201. * @arg SPI_PHASE_1EDGE
  202. * @arg SPI_PHASE_2EDGE
  203. * @retval 无
  204. */
  205. __STATIC_INLINE void std_spi_set_phase(uint32_t phase)
  206. {
  207. MODIFY_REG(SPI1->CR1, SPI_CR1_CPHA, phase);
  208. }
  209. /**
  210. * @brief 设置SPI数据大小端
  211. * @param first_bit SPI数据大小端
  212. * @arg SPI_FIRSTBIT_MSB
  213. * @arg SPI_FIRSTBIT_LSB
  214. * @note 仅在禁止SPI(SPE为0)时才可对此位执行写操作
  215. * @retval 无
  216. */
  217. __STATIC_INLINE void std_spi_set_first_bit(uint32_t first_bit)
  218. {
  219. MODIFY_REG(SPI1->CR1, SPI_CR1_LSBFIRST, first_bit);
  220. }
  221. /**
  222. * @brief 使能NSS软片选
  223. * @note 仅在从机模式下设置有效
  224. * @retval 无
  225. */
  226. __STATIC_INLINE void std_spi_nss_soft_chip_select_enable(void)
  227. {
  228. SPI1->CR1 |= SPI_CR1_SSM;
  229. }
  230. /**
  231. * @brief 禁止NSS软片选
  232. * @note 仅在从机模式下设置有效
  233. * @retval 无
  234. */
  235. __STATIC_INLINE void std_spi_nss_soft_chip_select_disable(void)
  236. {
  237. SPI1->CR1 &= (~SPI_CR1_SSM);
  238. }
  239. /**
  240. * @brief 使能SPI NSS输出
  241. * @note 仅在主机模式下设置有效
  242. * @retval 无
  243. */
  244. __STATIC_INLINE void std_spi_nss_output_enable(void)
  245. {
  246. SPI1->CR1 |= SPI_CR1_NSSOE;
  247. }
  248. /**
  249. * @brief 禁止SPI NSS输出
  250. * @retval 无
  251. */
  252. __STATIC_INLINE void std_spi_nss_output_disable(void)
  253. {
  254. SPI1->CR1 &= (~SPI_CR1_NSSOE);
  255. }
  256. /**
  257. * @brief 使能SPI中断
  258. * @param spi_interrupt SPI中断信息
  259. * @arg SPI_INTERRUPT_TXFE
  260. * @arg SPI_INTERRUPT_RXFNE
  261. * @arg SPI_INTERRUPT_ERR
  262. * @retval 无
  263. */
  264. __STATIC_INLINE void std_spi_interrupt_enable(uint32_t spi_interrupt)
  265. {
  266. SPI1->CR1 |= spi_interrupt;
  267. }
  268. /**
  269. * @brief 禁止SPI中断
  270. * @param spi_interrupt SPI中断信息
  271. * @arg SPI_INTERRUPT_TXFE
  272. * @arg SPI_INTERRUPT_RXFNE
  273. * @arg SPI_INTERRUPT_ERR
  274. * @retval 无
  275. */
  276. __STATIC_INLINE void std_spi_interrupt_disable(uint32_t spi_interrupt)
  277. {
  278. SPI1->CR1 &= (~spi_interrupt);
  279. }
  280. /**
  281. * @brief 获取SPI中断使能状态
  282. * @param spi_interrupt SPI中断信息
  283. * @arg SPI_INTERRUPT_TXFE
  284. * @arg SPI_INTERRUPT_RXFNE
  285. * @arg SPI_INTERRUPT_ERR
  286. * @retval uint32_t 中断使能状态
  287. * @arg 非0: 使能
  288. * @arg 0: 禁止
  289. */
  290. __STATIC_INLINE uint32_t std_spi_get_interrupt_enable(uint32_t spi_interrupt)
  291. {
  292. return (SPI1->CR1 & (spi_interrupt));
  293. }
  294. /**
  295. * @brief 设置SPI NSS引脚电平
  296. * @param nss_output NSS输出电平
  297. * @arg SPI_NSS_OUTPUT_LOW
  298. * @arg SPI_NSS_OUTPUT_HIGH
  299. * @note 仅在主机模式下且SPE使能的情况下设置有效
  300. * @retval 无
  301. */
  302. __STATIC_INLINE void std_spi_set_nss_output(uint32_t nss_output)
  303. {
  304. SPI1->CR2 = nss_output;
  305. }
  306. /**
  307. * @brief 获取SPI状态标志位
  308. * @param flag SPI状态标志位
  309. * @arg SPI_FLAG_TXFE
  310. * @arg SPI_FLAG_RXFNE
  311. * @arg SPI_FLAG_BUSY
  312. * @arg SPI_FLAG_OVR
  313. * @arg SPI_FLAG_MMF
  314. * @retval uint32_t SPI标志位状态
  315. * @arg 非0: 标志位置位
  316. * @arg 0: 标志位清除
  317. */
  318. __STATIC_INLINE uint32_t std_spi_get_flag(uint32_t flag)
  319. {
  320. return (SPI1->ISR & (flag));
  321. }
  322. /**
  323. * @brief SPI标志清零
  324. * @param flag SPI标志
  325. * @arg SPI_CLEAR_FLAG_OVR
  326. * @arg SPI_CLEAR_FLAG_MMF
  327. * @retval 无
  328. */
  329. __STATIC_INLINE void std_spi_clear_flag(uint32_t flag)
  330. {
  331. SPI1->ICR = (flag);
  332. }
  333. /**
  334. * @brief SPI读数据
  335. * @retval uint8_t: 返回读取的SPI数据寄存器读取的数据
  336. */
  337. __STATIC_INLINE uint8_t std_spi_read_data(void)
  338. {
  339. return (SPI1->DR);
  340. }
  341. /**
  342. * @brief SPI写数据
  343. * @param send_data: 写入SPI数据寄存器的数据
  344. * @retval 无
  345. */
  346. __STATIC_INLINE void std_spi_write_data(uint8_t send_data)
  347. {
  348. SPI1->DR = send_data;
  349. }
  350. void std_spi_init(std_spi_init_t *spi_init_param);
  351. void std_spi_deinit(void);
  352. void std_spi_struct_init(std_spi_init_t *spi_init_struct);
  353. /**
  354. * @}
  355. */
  356. #ifdef __cplusplus
  357. }
  358. #endif
  359. /**
  360. * @}
  361. */
  362. /**
  363. * @}
  364. */
  365. #endif /* CIU32F003_STD_SPI_H */