apm32f0xx_spi.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  1. /*!
  2. * @file apm32f0xx_spi.h
  3. *
  4. * @brief This file contains all the functions prototypes for the SPI firmware library
  5. *
  6. * @version V1.0.3
  7. *
  8. * @date 2022-09-20
  9. *
  10. * @attention
  11. *
  12. * Copyright (C) 2020-2022 Geehy Semiconductor
  13. *
  14. * You may not use this file except in compliance with the
  15. * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE).
  16. *
  17. * The program is only for reference, which is distributed in the hope
  18. * that it will be useful and instructional for customers to develop
  19. * their software. Unless required by applicable law or agreed to in
  20. * writing, the program is distributed on an "AS IS" BASIS, WITHOUT
  21. * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied.
  22. * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions
  23. * and limitations under the License.
  24. */
  25. #ifndef __APM32F0XX_SPI_H
  26. #define __APM32F0XX_SPI_H
  27. #ifdef __cplusplus
  28. extern "C" {
  29. #endif
  30. #include "apm32f0xx.h"
  31. /** @addtogroup APM32F0xx_StdPeriphDriver
  32. @{
  33. */
  34. /** @addtogroup SPI_Driver SPI Driver
  35. @{
  36. */
  37. /** @defgroup SPI_Macros Macros
  38. @{
  39. */
  40. /**@} end of group SPI_Macros */
  41. /** @defgroup SPI_Enumerations Enumerations
  42. @{
  43. */
  44. /**
  45. * @brief SPI data direction mode
  46. */
  47. typedef enum
  48. {
  49. SPI_DIRECTION_2LINES_FULLDUPLEX = ((uint16_t)0x0000), /*!< Full duplex mode,in 2-line unidirectional data mode */
  50. SPI_DIRECTION_2LINES_RXONLY = ((uint16_t)0x0400), /*!< Receiver only, in 2-line unidirectional data mode */
  51. SPI_DIRECTION_1LINE_RX = ((uint16_t)0x8000), /*!< Receiver mode, in 1 line bidirectional data mode */
  52. SPI_DIRECTION_1LINE_TX = ((uint16_t)0xC000), /*!< Transmit mode, in 1 line bidirectional data mode */
  53. } SPI_DIRECTION_T;
  54. /**
  55. * @brief SPI mode
  56. */
  57. typedef enum
  58. {
  59. SPI_MODE_SLAVE = ((uint8_t)0), /*!< Slave mode */
  60. SPI_MODE_MASTER = ((uint8_t)1), /*!< Master mode */
  61. } SPI_MODE_T;
  62. /**
  63. * @brief SPI data length
  64. */
  65. typedef enum
  66. {
  67. SPI_DATA_LENGTH_4B = ((uint8_t)0x03), /*!< Set data length to 4 bits */
  68. SPI_DATA_LENGTH_5B = ((uint8_t)0x04), /*!< Set data length to 5 bits */
  69. SPI_DATA_LENGTH_6B = ((uint8_t)0x05), /*!< Set data length to 6 bits */
  70. SPI_DATA_LENGTH_7B = ((uint8_t)0x06), /*!< Set data length to 7 bits */
  71. SPI_DATA_LENGTH_8B = ((uint8_t)0x07), /*!< Set data length to 8 bits */
  72. SPI_DATA_LENGTH_9B = ((uint8_t)0x08), /*!< Set data length to 9 bits */
  73. SPI_DATA_LENGTH_10B = ((uint8_t)0x09), /*!< Set data length to 10 bits */
  74. SPI_DATA_LENGTH_11B = ((uint8_t)0x0A), /*!< Set data length to 11 bits */
  75. SPI_DATA_LENGTH_12B = ((uint8_t)0x0B), /*!< Set data length to 12 bits */
  76. SPI_DATA_LENGTH_13B = ((uint8_t)0x0C), /*!< Set data length to 13 bits */
  77. SPI_DATA_LENGTH_14B = ((uint8_t)0x0D), /*!< Set data length to 14 bits */
  78. SPI_DATA_LENGTH_15B = ((uint8_t)0x0E), /*!< Set data length to 15 bits */
  79. SPI_DATA_LENGTH_16B = ((uint8_t)0x0F), /*!< Set data length to 16 bits */
  80. } SPI_DATA_LENGTH_T;
  81. /**
  82. * @brief SPI CRC length
  83. */
  84. typedef enum
  85. {
  86. SPI_CRC_LENGTH_8B = ((uint8_t)0), /*!< 8-bit CRC length */
  87. SPI_CRC_LENGTH_16B = ((uint8_t)1), /*!< 16-bit CRC length */
  88. } SPI_CRC_LENGTH_T;
  89. /**
  90. * @brief SPI Clock Polarity
  91. */
  92. typedef enum
  93. {
  94. SPI_CLKPOL_LOW = ((uint8_t)0), /*!< Clock Polarity low */
  95. SPI_CLKPOL_HIGH = ((uint8_t)1), /*!< Clock Polarity high */
  96. } SPI_CLKPOL_T;
  97. /**
  98. * @brief SPI Clock Phase
  99. */
  100. typedef enum
  101. {
  102. SPI_CLKPHA_1EDGE = ((uint8_t)0), /*!< 1 edge clock phase */
  103. SPI_CLKPHA_2EDGE = ((uint8_t)1), /*!< 2 edge clock phase */
  104. } SPI_CLKPHA_T;
  105. /**
  106. * @brief Software slave control
  107. */
  108. typedef enum
  109. {
  110. SPI_SSC_DISABLE = ((uint8_t)0), //!< Disable software select slave */
  111. SPI_SSC_ENABLE = ((uint8_t)1), //!< Enable software select slave */
  112. } SPI_SSC_T;
  113. /**
  114. * @brief SPI BaudRate divider
  115. */
  116. typedef enum
  117. {
  118. SPI_BAUDRATE_DIV_2 = ((uint8_t)0), //!< Baud rate divider is 2 */
  119. SPI_BAUDRATE_DIV_4 = ((uint8_t)1), //!< Baud rate divider is 4 */
  120. SPI_BAUDRATE_DIV_8 = ((uint8_t)2), //!< Baud rate divider is 8 */
  121. SPI_BAUDRATE_DIV_16 = ((uint8_t)3), //!< Baud rate divider is 16 */
  122. SPI_BAUDRATE_DIV_32 = ((uint8_t)4), //!< Baud rate divider is 32 */
  123. SPI_BAUDRATE_DIV_64 = ((uint8_t)5), //!< Baud rate divider is 64 */
  124. SPI_BAUDRATE_DIV_128 = ((uint8_t)6), //!< Baud rate divider is 128 */
  125. SPI_BAUDRATE_DIV_256 = ((uint8_t)7), //!< Baud rate divider is 256 */
  126. } SPI_BAUDRATE_DIV_T;
  127. /**
  128. * @brief MSB or LSB is transmitted/received first
  129. */
  130. typedef enum
  131. {
  132. SPI_FIRST_BIT_MSB = ((uint8_t)0), //!< First bit is MSB */
  133. SPI_FIRST_BIT_LSB = ((uint8_t)1), //!< First bit is LSB */
  134. } SPI_FIRST_BIT_T;
  135. /**
  136. * @brief SPI FIFO reception threshold
  137. */
  138. typedef enum
  139. {
  140. SPI_RXFIFO_HALF = ((uint8_t)0), //!< FIFO level is greater than or equal to 1/2 (16-bit) */
  141. SPI_RXFIFO_QUARTER = ((uint8_t)1), //!< FIFO level is greater than or equal to 1/4 (8-bit) */
  142. } SPI_RXFIFO_T;
  143. /**
  144. * @brief SPI last DMA transfers and reception
  145. */
  146. typedef enum
  147. {
  148. SPI_LAST_DMA_TXRXEVEN = ((uint16_t)0x0000), //!< transmission Even reception Even */
  149. SPI_LAST_DMA_TXEVENRXODD = ((uint16_t)0x2000), //!< transmission Even reception Odd */
  150. SPI_LAST_DMA_TXODDRXEVEN = ((uint16_t)0x4000), //!< transmission Odd reception Even */
  151. SPI_LAST_DMA_TXRXODD = ((uint16_t)0x6000), //!< transmission Odd reception Odd */
  152. } SPI_LAST_DMA_T;
  153. /**
  154. * @brief SPI transmission fifo level
  155. */
  156. typedef enum
  157. {
  158. SPI_TXFIFO_LEVEL_EMPTY = ((uint8_t)0x00), //!< Transmission FIFO filled level is empty */
  159. SPI_TXFIFO_LEVEL_QUARTER = ((uint8_t)0x01), //!< Transmission FIFO filled level is more than quarter */
  160. SPI_TXFIFO_LEVEL_HALF = ((uint8_t)0x02), //!< Transmission FIFO filled level is more than half */
  161. SPI_TXFIFO_LEVEL_FULL = ((uint8_t)0x03), //!< Transmission FIFO filled level is full */
  162. } SPI_TXFIFO_LEVEL_T;
  163. /**
  164. * @brief SPI reception fifo level
  165. */
  166. typedef enum
  167. {
  168. SPI_RXFIFO_LEVEL_EMPTY = ((uint8_t)0x00), //!< Reception FIFO filled level is empty */
  169. SPI_RXFIFO_LEVEL_QUARTER = ((uint8_t)0x01), //!< Reception FIFO filled level is more than quarter */
  170. SPI_RXFIFO_LEVEL_HALF = ((uint8_t)0x02), //!< Reception FIFO filled level is more than half */
  171. SPI_RXFIFO_LEVEL_FULL = ((uint8_t)0x03), //!< Reception FIFO filled level is full */
  172. } SPI_RXFIFO_LEVEL_T;
  173. /**
  174. * @brief SPI flags definition
  175. */
  176. typedef enum
  177. {
  178. SPI_FLAG_RXBNE = ((uint16_t)0x0001), //!< Receive buffer not empty flag */
  179. SPI_FLAG_TXBE = ((uint16_t)0x0002), //!< Transmit buffer empty flag */
  180. I2S_FLAG_CHDIR = ((uint16_t)0x0004), //!< Channel direction flag */
  181. I2S_FLAG_UDR = ((uint16_t)0x0008), //!< Underrun flag */
  182. SPI_FLAG_CRCE = ((uint16_t)0x0010), //!< CRC error flag */
  183. SPI_FLAG_MME = ((uint16_t)0x0020), //!< Master mode error flag */
  184. SPI_FLAG_OVR = ((uint16_t)0x0040), //!< Receive Overrun flag */
  185. SPI_FLAG_BUSY = ((uint16_t)0x0080), //!< Busy flag */
  186. SPI_FLAG_FFE = ((uint16_t)0x0100), //!< Frame format error flag */
  187. } SPI_FLAG_T;
  188. /**
  189. * @brief SPI interrupt source
  190. */
  191. typedef enum
  192. {
  193. SPI_INT_ERRIE = ((uint8_t)0x20), //!< Error interrupt */
  194. SPI_INT_RXBNEIE = ((uint8_t)0x40), //!< Receive buffer not empty interrupt */
  195. SPI_INT_TXBEIE = ((uint8_t)0x80), //!< Transmit buffer empty interrupt */
  196. } SPI_INT_T;
  197. /**
  198. * @brief SPI interrupt flag
  199. */
  200. typedef enum
  201. {
  202. SPI_INT_FLAG_RXBNE = ((uint32_t)0x400001), //!< Receive buffer not empty interrupt flag */
  203. SPI_INT_FLAG_TXBE = ((uint32_t)0x800002), //!< Transmit buffer empty interrupt flag */
  204. SPI_INT_FLAG_UDR = ((uint32_t)0x200008), //!< Underrun flag interrupt flag */
  205. SPI_INT_FLAG_MME = ((uint32_t)0x200020), //!< Master mode error interrupt flag */
  206. SPI_INT_FLAG_OVR = ((uint32_t)0x200040), //!< Receive Overrun interrupt flag */
  207. SPI_INT_FLAG_FFE = ((uint32_t)0x200100), //!< Frame format error interrupt flag */
  208. } SPI_INT_FLAG_T;
  209. /**
  210. * @brief I2S mode
  211. */
  212. typedef enum
  213. {
  214. I2S_MODE_SLAVER_TX = ((uint8_t)0), //!< Slave TX mode */
  215. I2S_MODE_SLAVER_RX = ((uint8_t)1), //!< Slave RX mode */
  216. I2S_MODE_MASTER_TX = ((uint8_t)2), //!< Master TX mode */
  217. I2S_MODE_MASTER_RX = ((uint8_t)3), //!< Master RX mode */
  218. } I2S_MODE_T;
  219. /**
  220. * @brief I2S Standard
  221. */
  222. typedef enum
  223. {
  224. I2S_STANDARD_PHILIPS = ((uint16_t)0x0000), //!< I2S Philips standard. */
  225. I2S_STANDARD_MSB = ((uint16_t)0x0010), //!< MSB justified standard (left justified) */
  226. I2S_STANDARD_LSB = ((uint16_t)0x0020), //!< LSB justified standard (right justified) */
  227. I2S_STANDARD_PCM_SHORT = ((uint16_t)0x0030), //!< PCM short standard */
  228. I2S_STANDARD_PCM_LONG = ((uint16_t)0x00B0), //!< PCM long standard */
  229. } I2S_STANDARD_T;
  230. /**
  231. * @brief I2S data length
  232. */
  233. typedef enum
  234. {
  235. I2S_DATA_LENGTH_16B = ((uint8_t)0x00), //!< Set data length to 16 bits */
  236. I2S_DATA_LENGTH_16BEX = ((uint8_t)0x01), //!< Set data length to 16 bits */
  237. I2S_DATA_LENGTH_24B = ((uint8_t)0x03), //!< Set data length to 24 bits */
  238. I2S_DATA_LENGTH_32B = ((uint8_t)0x05), //!< Set data length to 32 bits */
  239. } I2S_DATA_LENGTH_T;
  240. /**
  241. * @brief I2S MCLK Output
  242. */
  243. typedef enum
  244. {
  245. I2S_MCLK_OUTPUT_DISABLE = ((uint8_t)0x00), //!< Set I2S MCLK Output disable */
  246. I2S_MCLK_OUTPUT_ENABLE = ((uint8_t)0x01), //!< Set I2S MCLK Output enable */
  247. } I2S_MCLK_OUTPUT_T;
  248. /**
  249. * @brief I2S Audio divider
  250. */
  251. typedef enum
  252. {
  253. I2S_AUDIO_DIV_192K = ((uint32_t)192000), /*!< specifie the AUDIO divider division factor as 192K */
  254. I2S_AUDIO_DIV_96K = ((uint32_t)96000), /*!< specifie the AUDIO divider division factor as 96K */
  255. I2S_AUDIO_DIV_48K = ((uint32_t)48000), /*!< specifie the AUDIO divider division factor as 48K */
  256. I2S_AUDIO_DIV_44K = ((uint32_t)44100), /*!< specifie the AUDIO divider division factor as 44K */
  257. I2S_AUDIO_DIV_32K = ((uint32_t)32000), /*!< specifie the AUDIO divider division factor as 32K */
  258. I2S_AUDIO_DIV_22K = ((uint32_t)22050), /*!< specifie the AUDIO divider division factor as 22K */
  259. I2S_AUDIO_DIV_16K = ((uint32_t)16000), /*!< specifie the AUDIO divider division factor as 16K */
  260. I2S_AUDIO_DIV_11K = ((uint32_t)11025), /*!< specifie the AUDIO divider division factor as 11K */
  261. I2S_AUDIO_DIV_8K = ((uint32_t)8000), /*!< specifie the AUDIO divider division factor as 8K */
  262. I2S_AUDIO_DIV_DEFAULT = ((uint32_t)2), /*!< specifie the AUDIO divider division factor as DEFAULT value */
  263. } I2S_AUDIO_DIV_T;
  264. /**
  265. * @brief I2S Clock Polarity
  266. */
  267. typedef enum
  268. {
  269. I2S_CLKPOL_LOW = ((uint8_t)0), //!< Clock Polarity low */
  270. I2S_CLKPOL_HIGH = ((uint8_t)1), //!< Clock Polarity high */
  271. } I2S_CLKPOL_T;
  272. /**@} end of group SPI_Enumerations*/
  273. /** @defgroup SPI_Structures Structures
  274. @{
  275. */
  276. /**
  277. * @brief SPI Config struct definition
  278. */
  279. typedef struct
  280. {
  281. SPI_MODE_T mode; /*!< Specifies the SPI mode */
  282. SPI_DATA_LENGTH_T length; /*!< Specifies the SPI data length */
  283. SPI_CLKPHA_T phase; /*!< Specifies the Clock phase */
  284. SPI_CLKPOL_T polarity; /*!< Specifies the Clock polarity */
  285. SPI_SSC_T slaveSelect; /*!< Specifies the slave select mode */
  286. SPI_FIRST_BIT_T firstBit; /*!< Specifies the Frame format */
  287. SPI_DIRECTION_T direction; /*!< Specifies the data direction mode */
  288. SPI_BAUDRATE_DIV_T baudrateDiv; /*!< Specifies the baud rate divider */
  289. uint8_t crcPolynomial; /*!< Specifies the CRC polynomial */
  290. } SPI_Config_T;
  291. /**
  292. * @brief I2S Config struct definition
  293. */
  294. typedef struct
  295. {
  296. I2S_MODE_T mode; /*!< Specifies the I2S mode */
  297. I2S_STANDARD_T standard; /*!< Specifies the I2S standard */
  298. I2S_DATA_LENGTH_T length; /*!< Specifies the I2S data length */
  299. I2S_MCLK_OUTPUT_T MCLKOutput; /*!< Specifies the I2S MCLK Output */
  300. I2S_AUDIO_DIV_T audioDiv; /*!< Specifies the I2S Audio Diver */
  301. I2S_CLKPOL_T polarity; /*!< Specifies the Clock polarity */
  302. } I2S_Config_T;
  303. /**@} end of group SPI_Structures*/
  304. /** @defgroup SPI_Variables Variables
  305. @{
  306. */
  307. /**@} end of group SPI_Variables */
  308. /** @defgroup SPI_Functions Functions
  309. @{
  310. */
  311. /** SPI reset and configuration */
  312. void SPI_Reset(SPI_T* spi);
  313. void SPI_Config(SPI_T* spi, SPI_Config_T* spiConfig);
  314. void I2S_Config(SPI_T* spi, I2S_Config_T* i2sConfig); /*!< Not for APM32F030 devices */
  315. void SPI_ConfigStructInit(SPI_Config_T* spiConfig);
  316. void I2S_ConfigStructInit(I2S_Config_T* i2sConfig); /*!< Not for APM32F030 devices */
  317. void SPI_Enable(SPI_T* spi);
  318. void SPI_Disable(SPI_T* spi);
  319. void I2S_Enable(SPI_T* spi); /*!< Not for APM32F030 devices */
  320. void I2S_Disable(SPI_T* spi); /*!< Not for APM32F030 devices */
  321. void SPI_EnableFrameFormatMode(SPI_T* spi);
  322. void SPI_DisableFrameFormatMode(SPI_T* spi);
  323. void SPI_ConfigDatalength(SPI_T* spi, uint8_t length);
  324. void SPI_EnableOutputDirection(SPI_T* spi);
  325. void SPI_DisableOutputDirection(SPI_T* spi);
  326. void SPI_EnableInternalSlave(SPI_T* spi);
  327. void SPI_DisableInternalSlave(SPI_T* spi);
  328. void SPI_EnableSSoutput(SPI_T* spi);
  329. void SPI_DisableSSoutput(SPI_T* spi);
  330. void SPI_EnableNSSPulse(SPI_T* spi);
  331. void SPI_DisableNSSPulse(SPI_T* spi);
  332. /** CRC */
  333. void SPI_CRCLength(SPI_T* spi, SPI_CRC_LENGTH_T crcLength);
  334. void SPI_EnableCRC(SPI_T* spi);
  335. void SPI_DisableCRC(SPI_T* spi);
  336. void SPI_TxCRC(SPI_T* spi);
  337. uint16_t SPI_ReadRxCRC(SPI_T* spi);
  338. uint16_t SPI_ReadTxCRC(SPI_T* spi);
  339. uint16_t SPI_ReadCRCPolynomial(SPI_T* spi);
  340. /** DMA */
  341. void SPI_EnableDMARxBuffer(SPI_T* spi);
  342. void SPI_DisableDMARxBuffer(SPI_T* spi);
  343. void SPI_EnableDMATxBuffer(SPI_T* spi);
  344. void SPI_DisableDMATxBuffer(SPI_T* spi);
  345. void SPI_LastDMATransfer(SPI_T* spi, SPI_LAST_DMA_T lastDMA);
  346. /** FIFO */
  347. void SPI_ConfigFIFOThreshold(SPI_T* spi, SPI_RXFIFO_T threshold);
  348. uint8_t SPI_ReadTransmissionFIFOLeve(SPI_T* spi);
  349. uint8_t SPI_ReadReceptionFIFOLeve(SPI_T* spi);
  350. /** Interrupt */
  351. void SPI_EnableInterrupt(SPI_T* spi, uint8_t interrupt);
  352. void SPI_DisableInterrupt(SPI_T* spi, uint8_t interrupt);
  353. /** Transmit and receive */
  354. void SPI_TxData8(SPI_T* spi, uint8_t data);
  355. void SPI_I2S_TxData16(SPI_T* spi, uint16_t data);
  356. uint8_t SPI_RxData8(SPI_T* spi);
  357. uint16_t SPI_I2S_RxData16(SPI_T* spi);
  358. /** flag */
  359. uint8_t SPI_ReadStatusFlag(SPI_T* spi, SPI_FLAG_T flag);
  360. void SPI_ClearStatusFlag(SPI_T* spi, uint8_t flag);
  361. uint8_t SPI_ReadIntFlag(SPI_T* spi, SPI_INT_FLAG_T flag);
  362. #ifdef __cplusplus
  363. }
  364. #endif
  365. #endif /* __APM32F0XX_SPI_H */
  366. /**@} end of group SPI_Functions */
  367. /**@} end of group SPI_Driver */
  368. /**@} end of group APM32F0xx_StdPeriphDriver */