hal_spi.h 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. ////////////////////////////////////////////////////////////////////////////////
  2. /// @file hal_spi.h
  3. /// @author AE TEAM
  4. /// @brief THIS FILE CONTAINS ALL THE FUNCTIONS PROTOTYPES FOR THE SPI
  5. /// FIRMWARE LIBRARY.
  6. ////////////////////////////////////////////////////////////////////////////////
  7. /// @attention
  8. ///
  9. /// THE EXISTING FIRMWARE IS ONLY FOR REFERENCE, WHICH IS DESIGNED TO PROVIDE
  10. /// CUSTOMERS WITH CODING INFORMATION ABOUT THEIR PRODUCTS SO THEY CAN SAVE
  11. /// TIME. THEREFORE, MINDMOTION SHALL NOT BE LIABLE FOR ANY DIRECT, INDIRECT OR
  12. /// CONSEQUENTIAL DAMAGES ABOUT ANY CLAIMS ARISING OUT OF THE CONTENT OF SUCH
  13. /// HARDWARE AND/OR THE USE OF THE CODING INFORMATION CONTAINED HEREIN IN
  14. /// CONNECTION WITH PRODUCTS MADE BY CUSTOMERS.
  15. ///
  16. /// <H2><CENTER>&COPY; COPYRIGHT MINDMOTION </CENTER></H2>
  17. ////////////////////////////////////////////////////////////////////////////////
  18. // Define to prevent recursive inclusion
  19. #ifndef __HAL_SPI_H
  20. #define __HAL_SPI_H
  21. // Files includes
  22. #include "types.h"
  23. #include "reg_spi.h"
  24. ////////////////////////////////////////////////////////////////////////////////
  25. /// @addtogroup MM32_Hardware_Abstract_Layer
  26. /// @{
  27. ////////////////////////////////////////////////////////////////////////////////
  28. /// @defgroup SPI_HAL
  29. /// @brief SPI HAL modules
  30. /// @{
  31. ////////////////////////////////////////////////////////////////////////////////
  32. /// @defgroup SPI_Exported_Types
  33. /// @{
  34. ////////////////////////////////////////////////////////////////////////////////
  35. /// @brief SPI mode enum definition
  36. ////////////////////////////////////////////////////////////////////////////////
  37. typedef enum {
  38. SPI_Mode_Slave = 0x0000, ///< SPI slave mode
  39. SPI_Mode_Master = SPI_GCR_MODE ///< SPI master mode
  40. } SPI_Mode_TypeDef;
  41. ////////////////////////////////////////////////////////////////////////////////
  42. /// @brief SPI data size enum definition
  43. ////////////////////////////////////////////////////////////////////////////////
  44. typedef enum {
  45. SPI_DataSize_8b = 0x0000, ///< 8 bits valid data
  46. SPI_DataSize_32b = SPI_GCR_DWSEL ///< 32 bits valid data
  47. } SPI_DataSize_TypeDef;
  48. ////////////////////////////////////////////////////////////////////////////////
  49. /// @brief SPI clock polarity enum definition
  50. ////////////////////////////////////////////////////////////////////////////////
  51. typedef enum {
  52. SPI_CPOL_Low = 0x0000, ///< The clock is low in idle state.
  53. SPI_CPOL_High = SPI_CCR_CPOL ///< The clock is high in idle state.
  54. } SPI_CPOL_TypeDef;
  55. ////////////////////////////////////////////////////////////////////////////////
  56. /// @brief SPI clock phase enum definition
  57. ////////////////////////////////////////////////////////////////////////////////
  58. typedef enum {
  59. SPI_CPHA_2Edge = 0x0000, ///< Data sampling starts from the second clock edge.
  60. SPI_CPHA_1Edge = SPI_CCR_CPHA ///< Data sampling starts from the first clock edge.
  61. } SPI_CPHA_TypeDef;
  62. ////////////////////////////////////////////////////////////////////////////////
  63. /// @brief SPI nss control mode enum definition
  64. ////////////////////////////////////////////////////////////////////////////////
  65. typedef enum {
  66. SPI_NSS_Soft = 0x0000,
  67. SPI_NSS_Hard = SPI_GCR_NSS
  68. } SPI_NSS_TypeDef;
  69. ////////////////////////////////////////////////////////////////////////////////
  70. /// @brief SPI baud rate prescaler enum definition
  71. ////////////////////////////////////////////////////////////////////////////////
  72. typedef enum {
  73. SPI_BaudRatePrescaler_2 = 0x0002, ///< SCK clock devide by 2
  74. SPI_BaudRatePrescaler_4 = 0x0004, ///< SCK clock devide by 4
  75. SPI_BaudRatePrescaler_8 = 0x0008, ///< SCK clock devide by 7
  76. SPI_BaudRatePrescaler_16 = 0x0010, ///< SCK clock devide by 16
  77. SPI_BaudRatePrescaler_32 = 0x0020, ///< SCK clock devide by 32
  78. SPI_BaudRatePrescaler_64 = 0x0040, ///< SCK clock devide by 64
  79. SPI_BaudRatePrescaler_128 = 0x0080, ///< SCK clock devide by 128
  80. SPI_BaudRatePrescaler_256 = 0x0100 ///< SCK clock devide by 256
  81. } SPI_BaudRatePrescaler_TypeDef;
  82. ////////////////////////////////////////////////////////////////////////////////
  83. /// @brief SPI first bit enum definition
  84. ////////////////////////////////////////////////////////////////////////////////
  85. typedef enum {
  86. SPI_FirstBit_MSB = 0x0000, ///< Data transfers start from MSB
  87. SPI_FirstBit_LSB = SPI_CCR_LSBFE ///< Data transfers start from LSB
  88. } SPI_FirstBit_TypeDef;
  89. ////////////////////////////////////////////////////////////////////////////////
  90. /// @brief SPI FIFO trigger level enum definition
  91. ////////////////////////////////////////////////////////////////////////////////
  92. typedef enum {
  93. SPI_RXTLF = SPI_GCR_RXTLF_Half, ///< RX FIFO trigger level
  94. SPI_TXTLF = SPI_GCR_TXTLF_Half ///< TX FIFO trigger level
  95. } SPI_TLF_TypeDef;
  96. ////////////////////////////////////////////////////////////////////////////////
  97. /// @brief SPI bit derection enum definition
  98. ////////////////////////////////////////////////////////////////////////////////
  99. typedef enum {
  100. SPI_Direction_Rx, ///< Receive enable
  101. SPI_Direction_Tx, ///< Transmit enable
  102. SPI_Disable_Rx, ///< Receive disable
  103. SPI_Disable_Tx ///< Transmit disable
  104. } SPI_Direction_TypeDef;
  105. ////////////////////////////////////////////////////////////////////////////////
  106. /// @brief SPI flag enum definition
  107. ////////////////////////////////////////////////////////////////////////////////
  108. typedef enum {
  109. SPI_FLAG_RXAVL = SPI_SR_RXAVL, ///< Receive 1 byte available data flag
  110. SPI_FLAG_TXEPT = SPI_SR_TXEPT, ///< Transmitter empty flag
  111. SPI_FLAG_TXFULL = SPI_SR_TXFULL, ///< Transmitter FIFO full status flag
  112. SPI_FLAG_RXAVL_4BYTE = SPI_SR_RXAVL_4BYTE ///< Receive 4 bytes available data flag
  113. } SPI_FLAG_TypeDef;
  114. ////////////////////////////////////////////////////////////////////////////////
  115. /// @brief SPI slave mode data edge adjust enum definition
  116. ////////////////////////////////////////////////////////////////////////////////
  117. typedef enum {
  118. SPI_SlaveAdjust_LOW, ///< SPI slave mode data edge adjust in low speed mode
  119. SPI_SlaveAdjust_FAST ///< SPI slave mode data edge adjust in fast speed mode
  120. } SPI_SlaveAdjust_TypeDef;
  121. ////////////////////////////////////////////////////////////////////////////////
  122. /// @brief SPI data edge adjust enum definition
  123. ////////////////////////////////////////////////////////////////////////////////
  124. typedef enum {
  125. SPI_DataEdgeAdjust_LOW, ///< SPI data edge adjust in low speed mode
  126. SPI_DataEdgeAdjust_FAST ///< SPI data edge adjust in fast speed mode
  127. } SPI_DataEdgeAdjust_TypeDef;
  128. ////////////////////////////////////////////////////////////////////////////////
  129. /// @brief SPI interruput enum definition
  130. ////////////////////////////////////////////////////////////////////////////////
  131. typedef enum {
  132. SPI_IT_TXEPT = 0x40, ///< Transmitter empty interrupt
  133. SPI_IT_RXFULL = 0x20, ///< RX FIFO full interrupt
  134. SPI_IT_RXMATCH = 0x10, ///< Receive data match the RXDNR number interrut
  135. SPI_IT_RXOERR = 0x08, ///< Receive overrun error interrupt
  136. SPI_IT_UNDERRUN = 0x04, ///< Underrun interrupt
  137. SPI_IT_RX = 0x02, ///< Receive available data interrupt
  138. SPI_IT_TX = 0x01 ///< Transmit FIFO available interrupt
  139. } SPI_IT_TypeDef;
  140. typedef enum {
  141. I2S_Standard_Phillips = 0x0000,
  142. I2S_Standard_MSB = 0x0010,
  143. I2S_Standard_LSB = 0x0020,
  144. I2S_Standard_PCMShort = 0x0030,
  145. I2S_Standard_PCMLong = 0x00B0,
  146. } SPI_I2S_STANDARD_TypeDef;
  147. typedef enum {
  148. I2S_DataFormat_16b = 0x0000,
  149. I2S_DataFormat_16bextended = 0x0001,
  150. I2S_DataFormat_24b = 0x0003,
  151. I2S_DataFormat_32b = 0x0005,
  152. } SPI_I2S_DATAFORMAT_TypeDef;
  153. typedef enum {
  154. I2S_AudioFreq_192k = (192000),
  155. I2S_AudioFreq_96k = (96000),
  156. I2S_AudioFreq_48k = (48000),
  157. I2S_AudioFreq_44k = (44100),
  158. I2S_AudioFreq_32k = (32000),
  159. I2S_AudioFreq_24k = (24000),
  160. I2S_AudioFreq_22k = (22050),
  161. I2S_AudioFreq_16k = (16000),
  162. I2S_AudioFreq_11k = (11025),
  163. I2S_AudioFreq_12k = (12000),
  164. I2S_AudioFreq_8k = (8000),
  165. I2S_AudioFreq_4k = (4000),
  166. I2S_AudioFreq_Default = (2),
  167. } SPI_I2S_AUDIO_FREQ_TypeDef;
  168. typedef enum {
  169. I2S_Mode_SlaveTx = 0x0000,
  170. I2S_Mode_SlaveRx = 0x0100,
  171. I2S_Mode_MasterTx = 0x0200,
  172. I2S_Mode_MasterRx = 0x0300,
  173. } SPI_I2S_TRANS_MODE_TypeDef;
  174. typedef enum {
  175. I2S_MCLKOutput_Enable = 0x0800,
  176. I2S_MCLKOutput_Disable = 0x0000,
  177. } SPI_I2S_MCLK_OUTPUT_TypeDef;
  178. typedef enum {
  179. I2S_CPOL_Low = 0x0000, ///< The clock is low in idle state.
  180. I2S_CPOL_High = SPI_CCR_CPOL ///< The clock is high in idle state.
  181. } SPI_I2S_CPOL_TypeDef;
  182. ////////////////////////////////////////////////////////////////////////////////
  183. /// @brief SPI Init structure definition
  184. ////////////////////////////////////////////////////////////////////////////////
  185. typedef struct {
  186. SPI_Mode_TypeDef SPI_Mode; ///< Specifies the SPI operating mode
  187. SPI_DataSize_TypeDef SPI_DataSize; ///< Specifies the SPI available data size
  188. u8 SPI_DataWidth; ///< SPI data length
  189. SPI_CPOL_TypeDef SPI_CPOL; ///< Specifies the serial clock steady state
  190. SPI_CPHA_TypeDef SPI_CPHA; ///< Specifies the clock active edge for the bit capture
  191. SPI_NSS_TypeDef SPI_NSS; ///< Specifies whether the NSS signal is managed by hardware or by software
  192. SPI_BaudRatePrescaler_TypeDef SPI_BaudRatePrescaler; ///< Specifies the Baud Rate prescaler value which will be
  193. ///< used to configure the transmit and receive SCK clock
  194. SPI_FirstBit_TypeDef SPI_FirstBit; ///< Specifies whether data transfers start from MSB or LSB bit
  195. // u16 SPI_length;
  196. } SPI_InitTypeDef;
  197. ////////////////////////////////////////////////////////////////////////////////
  198. /// @brief I2S Init structure definition
  199. ////////////////////////////////////////////////////////////////////////////////
  200. typedef struct {
  201. SPI_I2S_TRANS_MODE_TypeDef I2S_Mode; ///< Specifies the I2S operating mode.
  202. SPI_I2S_STANDARD_TypeDef I2S_Standard; ///< Specifies the standard used for the I2S communication.
  203. SPI_I2S_DATAFORMAT_TypeDef I2S_DataFormat; ///< Specifies the data format for the I2S communication.
  204. SPI_I2S_MCLK_OUTPUT_TypeDef I2S_MCLKOutput; ///< Specifies whether the I2S MCLK output is enabled or not.
  205. SPI_I2S_AUDIO_FREQ_TypeDef I2S_AudioFreq; ///< Specifies the frequency selected for the I2S communication.
  206. SPI_I2S_CPOL_TypeDef I2S_CPOL; ///< Specifies the idle state of the I2S clock.
  207. } I2S_InitTypeDef;
  208. /// @}
  209. ////////////////////////////////////////////////////////////////////////////////
  210. /// @defgroup SPI_Exported_Constants
  211. /// @{
  212. ////////////////////////////////////////////////////////////////////////////////
  213. /// @defgroup SPI_Register_Mask
  214. /// @{
  215. #define GCR_Mask ((u32)0x0FFF)
  216. #define CCR_Mask ((u32)0x003F)
  217. #define BRR_Mask ((u32)0xFFFF)
  218. #define ECR_Mask ((u32)0x001F)
  219. /// @}
  220. // SPI_7bit_8bit data width
  221. #define SPI_DataWidth_1b ((u16)0x0001)
  222. #define SPI_DataWidth_2b ((u16)0x0002)
  223. #define SPI_DataWidth_3b ((u16)0x0003)
  224. #define SPI_DataWidth_4b ((u16)0x0004)
  225. #define SPI_DataWidth_5b ((u16)0x0005)
  226. #define SPI_DataWidth_6b ((u16)0x0006)
  227. #define SPI_DataWidth_7b ((u16)0x0007)
  228. #define SPI_DataWidth_8b ((u16)0x0008)
  229. #define SPI_DataWidth_9b ((u16)0x0009)
  230. #define SPI_DataWidth_10b ((u16)0x000a)
  231. #define SPI_DataWidth_11b ((u16)0x000b)
  232. #define SPI_DataWidth_12b ((u16)0x000c)
  233. #define SPI_DataWidth_13b ((u16)0x000d)
  234. #define SPI_DataWidth_14b ((u16)0x000e)
  235. #define SPI_DataWidth_15b ((u16)0x000f)
  236. #define SPI_DataWidth_16b ((u16)0x0010)
  237. #define SPI_DataWidth_17b ((u16)0x0011)
  238. #define SPI_DataWidth_18b ((u16)0x0012)
  239. #define SPI_DataWidth_19b ((u16)0x0013)
  240. #define SPI_DataWidth_20b ((u16)0x0014)
  241. #define SPI_DataWidth_21b ((u16)0x0015)
  242. #define SPI_DataWidth_22b ((u16)0x0016)
  243. #define SPI_DataWidth_23b ((u16)0x0017)
  244. #define SPI_DataWidth_24b ((u16)0x0018)
  245. #define SPI_DataWidth_25b ((u16)0x0019)
  246. #define SPI_DataWidth_26b ((u16)0x001a)
  247. #define SPI_DataWidth_27b ((u16)0x001b)
  248. #define SPI_DataWidth_28b ((u16)0x001c)
  249. #define SPI_DataWidth_29b ((u16)0x001d)
  250. #define SPI_DataWidth_30b ((u16)0x001e)
  251. #define SPI_DataWidth_31b ((u16)0x001f)
  252. #define SPI_DataWidth_32b ((u16)0x0000)
  253. /// @}
  254. ////////////////////////////////////////////////////////////////////////////////
  255. /// @defgroup SPI_Exported_Variables
  256. /// @{
  257. #ifdef _HAL_SPI_C_
  258. #define GLOBAL
  259. #else
  260. #define GLOBAL extern
  261. #endif
  262. #undef GLOBAL
  263. /// @}
  264. ////////////////////////////////////////////////////////////////////////////////
  265. /// @defgroup SPI_Exported_Functions
  266. /// @{
  267. void SPI_DeInit(SPI_TypeDef* spi);
  268. void SPI_Init(SPI_TypeDef* spi, SPI_InitTypeDef* init_struct);
  269. void SPI_StructInit(SPI_InitTypeDef* init_struct);
  270. void SPI_Cmd(SPI_TypeDef* spi, FunctionalState state);
  271. void SPI_ITConfig(SPI_TypeDef* spi, u8 interrupt, FunctionalState state);
  272. void SPI_DMACmd(SPI_TypeDef* spi, FunctionalState state);
  273. void SPI_FifoTrigger(SPI_TypeDef* spi, SPI_TLF_TypeDef fifo_trigger_value, FunctionalState state);
  274. void SPI_SendData(SPI_TypeDef* spi, u32 data);
  275. void SPI_CSInternalSelected(SPI_TypeDef* spi, FunctionalState state);
  276. void SPI_NSSInternalSoftwareConfig(SPI_TypeDef* spi, SPI_NSS_TypeDef nss);
  277. void SPI_BiDirectionalLineConfig(SPI_TypeDef* spi, SPI_Direction_TypeDef direction);
  278. void SPI_ClearITPendingBit(SPI_TypeDef* spi, SPI_IT_TypeDef interrupt);
  279. void SPI_RxBytes(SPI_TypeDef* spi, u16 number);
  280. void SPI_SlaveAdjust(SPI_TypeDef* spi, SPI_SlaveAdjust_TypeDef adjust_value);
  281. bool SPI_DataSizeConfig(SPI_TypeDef* spi, u8 data_size);
  282. void SPI_DataSizeTypeConfig(SPI_TypeDef* spi, SPI_DataSize_TypeDef SPI_DataSize);
  283. u32 SPI_ReceiveData(SPI_TypeDef* spi);
  284. FlagStatus SPI_GetFlagStatus(SPI_TypeDef* spi, SPI_FLAG_TypeDef flag);
  285. ITStatus SPI_GetITStatus(SPI_TypeDef* spi, SPI_IT_TypeDef interrupt);
  286. ////////////////////////////////////////////////////////////////////////////////
  287. // Extended function interface
  288. ////////////////////////////////////////////////////////////////////////////////
  289. void exSPI_ITCmd(SPI_TypeDef* spi, FunctionalState state);
  290. void exSPI_ITConfig(SPI_TypeDef* spi, SPI_IT_TypeDef interrput, FunctionalState state);
  291. void exSPI_DMACmd(SPI_TypeDef* spi, FunctionalState state);
  292. void exSPI_CSInternalSelected(SPI_TypeDef* spi, FunctionalState state);
  293. void exSPI_DataEdgeAdjust(SPI_TypeDef* spi, SPI_DataEdgeAdjust_TypeDef adjust_value);
  294. void I2S_Cmd(SPI_TypeDef* spi, FunctionalState state);
  295. void I2S_Init(SPI_TypeDef* spi, I2S_InitTypeDef* I2S_InitStruct);
  296. /// @}
  297. /// @}
  298. /// @}
  299. ////////////////////////////////////////////////////////////////////////////////
  300. #endif //__HAL_SPI_H
  301. ////////////////////////////////////////////////////////////////////////////////