apm32f10x_spi.h 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. /*!
  2. * @file apm32f10x_spi.h
  3. *
  4. * @brief This file contains all the functions prototypes for the SPI firmware library
  5. *
  6. * @version V1.0.1
  7. *
  8. * @date 2021-03-23
  9. *
  10. */
  11. #ifndef __APM32F10X_SPI_H
  12. #define __APM32F10X_SPI_H
  13. #include "apm32f10x.h"
  14. #ifdef __cplusplus
  15. extern "C" {
  16. #endif
  17. /** @addtogroup Peripherals_Library Standard Peripheral Library
  18. @{
  19. */
  20. /** @addtogroup SPI_Driver SPI Driver
  21. @{
  22. */
  23. /** @addtogroup SPI_Enumerations Enumerations
  24. @{
  25. */
  26. /**
  27. * @brief SPI data direction mode
  28. */
  29. typedef enum
  30. {
  31. SPI_DIRECTION_2LINES_FULLDUPLEX = 0x0000,
  32. SPI_DIRECTION_2LINES_RXONLY = 0x0400,
  33. SPI_DIRECTION_1LINE_RX = 0x8000,
  34. SPI_DIRECTION_1LINE_TX = 0xC000
  35. }SPI_DIRECTION_T;
  36. /**
  37. * @brief SPI mode
  38. */
  39. typedef enum
  40. {
  41. SPI_MODE_MASTER = 0x0104,
  42. SPI_MODE_SLAVE = 0x0000
  43. }SPI_MODE_T;
  44. /**
  45. * @brief SPI Data length
  46. */
  47. typedef enum
  48. {
  49. SPI_DATA_LENGTH_16B = 0x0800,
  50. SPI_DATA_LENGTH_8B = 0x0000
  51. }SPI_DATA_LENGTH_T;
  52. /**
  53. * @brief SPI Clock Polarity
  54. */
  55. typedef enum
  56. {
  57. SPI_CLKPOL_LOW = 0x0000,
  58. SPI_CLKPOL_HIGH = 0x0002
  59. }SPI_CLKPOL_T;
  60. /**
  61. * @brief SPI Clock Phase
  62. */
  63. typedef enum
  64. {
  65. SPI_CLKPHA_1EDGE = 0x0000,
  66. SPI_CLKPHA_2EDGE = 0x0001
  67. }SPI_CLKPHA_T;
  68. /**
  69. * @brief SPI Slave Select management
  70. */
  71. typedef enum
  72. {
  73. SPI_NSS_SOFT = 0x0200,
  74. SPI_NSS_HARD = 0x0000
  75. }SPI_NSS_T;
  76. /**
  77. * @brief SPI BaudRate Prescaler
  78. */
  79. typedef enum
  80. {
  81. SPI_BAUDRATE_DIV_2 = 0x0000,
  82. SPI_BAUDRATE_DIV_4 = 0x0008,
  83. SPI_BAUDRATE_DIV_8 = 0x0010,
  84. SPI_BAUDRATE_DIV_16 = 0x0018,
  85. SPI_BAUDRATE_DIV_32 = 0x0020,
  86. SPI_BAUDRATE_DIV_64 = 0x0028,
  87. SPI_BAUDRATE_DIV_128 = 0x0030,
  88. SPI_BAUDRATE_DIV_256 = 0x0038,
  89. }SPI_BAUDRATE_DIV_T;
  90. /**
  91. * @brief SPI MSB LSB transmission
  92. */
  93. typedef enum
  94. {
  95. SPI_FIRSTBIT_MSB = 0x0000,
  96. SPI_FIRSTBIT_LSB = 0x0080
  97. }SPI_FIRSTBIT_T;
  98. /**
  99. * @brief I2S Mode
  100. */
  101. typedef enum
  102. {
  103. I2S_MODE_SLAVE_TX = 0x0000,
  104. I2S_MODE_SLAVE_RX = 0x0100,
  105. I2S_MODE_MASTER_TX = 0x0200,
  106. I2S_MODE_MASTER_RX = 0x0300
  107. }I2S_MODE_T;
  108. /**
  109. * @brief I2S Standard
  110. */
  111. typedef enum
  112. {
  113. I2S_STANDARD_PHILLIPS = 0x0000,
  114. I2S_STANDARD_MSB = 0x0010,
  115. I2S_STANDARD_LSB = 0x0020,
  116. I2S_STANDARD_PCMSHORT = 0x0030,
  117. I2S_STANDARD_PCMLONG = 0x00B0
  118. }I2S_STANDARD_T;
  119. /**
  120. * @brief I2S data length
  121. */
  122. typedef enum
  123. {
  124. I2S_DATA_LENGHT_16B = 0x0000,
  125. I2S_DATA_LENGHT_16BEX = 0x0001,
  126. I2S_DATA_LENGHT_24B = 0x0003,
  127. I2S_DATA_LENGHT_32B = 0x0005,
  128. } I2S_DATA_LENGTH_T;
  129. /**
  130. * @brief I2S_MCLK_Output
  131. */
  132. typedef enum
  133. {
  134. I2S_MCLK_OUTPUT_DISABLE = 0x0000,
  135. I2S_MCLK_OUTPUT_ENABLE = 0x0200,
  136. }I2S_MCLK_OUTPUT_T;
  137. /**
  138. * @brief I2S Audio divider
  139. */
  140. typedef enum
  141. {
  142. I2S_AUDIO_DIV_192K = 192000,
  143. I2S_AUDIO_DIV_96K = 96000,
  144. I2S_AUDIO_DIV_48K = 48000,
  145. I2S_AUDIO_DIV_44K = 44100,
  146. I2S_AUDIO_DIV_32K = 32000,
  147. I2S_AUDIO_DIV_22K = 22050,
  148. I2S_AUDIO_DIV_16K = 16000,
  149. I2S_AUDIO_DIV_11K = 11025,
  150. I2S_AUDIO_DIV_8K = 8000,
  151. I2S_AUDIO_DIV_DEFAULT = 2
  152. }I2S_AUDIO_DIV_T;
  153. /**
  154. * @brief I2S Clock Polarity
  155. */
  156. typedef enum
  157. {
  158. I2S_CLKPOL_LOW = 0x0000,
  159. I2S_CLKPOL_HIGH = 0x0008
  160. }I2S_CLKPOL_T;
  161. /**
  162. * @brief SPI Direction select
  163. */
  164. typedef enum
  165. {
  166. SPI_DIRECTION_RX = 0xBFFF,
  167. SPI_DIRECTION_TX = 0x4000
  168. }SPI_DIRECTION_SELECT_T;
  169. /**
  170. * @brief SPI interrupts definition
  171. */
  172. typedef enum
  173. {
  174. SPI_I2S_INT_TXBE = 0x8002,
  175. SPI_I2S_INT_RXBNE = 0x4001,
  176. SPI_I2S_INT_ERR = 0x2000,
  177. SPI_I2S_INT_OVR = 0x2040,
  178. SPI_INT_CRCE = 0x2010,
  179. SPI_INT_ME = 0x2020,
  180. I2S_INT_UDR = 0x2008
  181. }SPI_I2S_INT_T;
  182. /**
  183. * @brief SPI flags definition
  184. */
  185. typedef enum
  186. {
  187. SPI_FLAG_RXBNE = 0x0001,
  188. SPI_FLAG_TXBE = 0x0002,
  189. I2S_FLAG_SCHDIR = 0x0004,
  190. I2S_FLAG_UDR = 0x0008,
  191. SPI_FLAG_CRCE = 0x0010,
  192. SPI_FLAG_ME = 0x0020,
  193. SPI_FLAG_OVR = 0x0040,
  194. SPI_FLAG_BSY = 0x0080
  195. }SPI_FLAG_T;
  196. /**
  197. * @brief SPI I2S DMA requests
  198. */
  199. typedef enum
  200. {
  201. SPI_I2S_DMA_REQ_TX = 0x0002,
  202. SPI_I2S_DMA_REQ_RX = 0x0001
  203. }SPI_I2S_DMA_REQ_T;
  204. /**@} end of group SPI_Enumerations*/
  205. /** @addtogroup SPI_Structure Data Structure
  206. @{
  207. */
  208. /**
  209. * @brief SPI Config structure definition
  210. */
  211. typedef struct
  212. {
  213. SPI_MODE_T mode;
  214. SPI_DATA_LENGTH_T length;
  215. SPI_CLKPHA_T phase;
  216. SPI_CLKPOL_T polarity;
  217. SPI_NSS_T nss;
  218. SPI_FIRSTBIT_T firstBit;
  219. SPI_DIRECTION_T direction;
  220. SPI_BAUDRATE_DIV_T baudrateDiv;
  221. uint16_t crcPolynomial;
  222. }SPI_Config_T;
  223. /**
  224. * @brief I2S Config structure definition
  225. */
  226. typedef struct
  227. {
  228. I2S_MODE_T mode;
  229. I2S_STANDARD_T standard;
  230. I2S_DATA_LENGTH_T length;
  231. I2S_MCLK_OUTPUT_T MCLKOutput;
  232. I2S_AUDIO_DIV_T audioDiv;
  233. I2S_CLKPOL_T polarity;
  234. }I2S_Config_T;
  235. /**@} end of group SPI_Structure*/
  236. /** @addtogroup SPI_Fuctions Fuctions
  237. @{
  238. */
  239. /** Reset and Configuration */
  240. void SPI_I2S_Reset(SPI_T* spi);
  241. void SPI_Config(SPI_T* spi, SPI_Config_T* spiConfig);
  242. void I2S_Config(SPI_T* spi, I2S_Config_T* i2sConfig);
  243. void SPI_ConfigStructInit(SPI_Config_T* spiConfig);
  244. void I2S_ConfigStructInit(I2S_Config_T* i2sConfig);
  245. void SPI_Enable(SPI_T* spi);
  246. void SPI_Disable(SPI_T* spi);
  247. void I2S_Enable(SPI_T* spi);
  248. void I2S_Disable(SPI_T* spi);
  249. void SPI_I2S_TxData(SPI_T* spi, uint16_t data);
  250. uint16_t SPI_I2S_RxData(SPI_T* spi);
  251. void SPI_SetSoftwareNSS(SPI_T* spi);
  252. void SPI_ResetSoftwareNSS(SPI_T* spi);
  253. void SPI_EnableSSOutput(SPI_T* spi);
  254. void SPI_DisableSSOutput(SPI_T* spi);
  255. void SPI_ConfigDataSize(SPI_T* spi, uint16_t dataSize);
  256. /** DMA */
  257. void SPI_I2S_EnableDMA(SPI_T* spi, SPI_I2S_DMA_REQ_T dmaReq);
  258. void SPI_I2S_DisableDMA(SPI_T* spi, SPI_I2S_DMA_REQ_T dmaReq);
  259. /** CRC */
  260. void SPI_TxCRC(SPI_T* spi);
  261. void SPI_EnableCRC(SPI_T* spi);
  262. void SPI_DisableCRC(SPI_T* spi);
  263. uint16_t SPI_ReadTxCRC(SPI_T* spi);
  264. uint16_t SPI_ReadRxCRC(SPI_T* spi);
  265. uint16_t SPI_ReadCRCPolynomial(SPI_T* spi);
  266. void SPI_ConfigBiDirectionalLine(SPI_T* spi, SPI_DIRECTION_SELECT_T direction);
  267. /** Interrupts and flag */
  268. void SPI_I2S_EnableInterrupt(SPI_T* spi, SPI_I2S_INT_T interrupt);
  269. void SPI_I2S_DisableInterrupt(SPI_T* spi, SPI_I2S_INT_T interrupt);
  270. uint8_t SPI_I2S_ReadStatusFlag(SPI_T* spi, SPI_FLAG_T flag);
  271. void SPI_I2S_ClearStatusFlag(SPI_T* spi, SPI_FLAG_T flag);
  272. uint8_t SPI_I2S_ReadIntFlag(SPI_T* spi, SPI_I2S_INT_T flag);
  273. void SPI_I2S_ClearIntFlag(SPI_T* spi, SPI_I2S_INT_T flag);
  274. /**@} end of group SPI_Fuctions*/
  275. /**@} end of group SPI_Driver*/
  276. /**@} end of group Peripherals_Library*/
  277. #ifdef __cplusplus
  278. }
  279. #endif
  280. #endif /* __APM32F10X_SPI_H */