gd32f30x_spi.h 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. /*!
  2. \file gd32f30x_spi.h
  3. \brief definitions for the SPI
  4. */
  5. /*
  6. Copyright (C) 2017 GigaDevice
  7. 2017-02-10, V1.0.1, firmware for GD32F30x
  8. */
  9. #ifndef GD32F30X_SPI_H
  10. #define GD32F30X_SPI_H
  11. #include "gd32f30x.h"
  12. /* SPIx(x=0,1,2) definitions */
  13. #define SPI0 (SPI_BASE + 0x0000F800U)
  14. #define SPI1 SPI_BASE
  15. #define SPI2 (SPI_BASE + 0x00000400U)
  16. /* SPI registers definitions */
  17. #define SPI_CTL0(spix) REG32((spix) + 0x00U) /*!< SPI control register 0 */
  18. #define SPI_CTL1(spix) REG32((spix) + 0x04U) /*!< SPI control register 1*/
  19. #define SPI_STAT(spix) REG32((spix) + 0x08U) /*!< SPI status register */
  20. #define SPI_DATA(spix) REG32((spix) + 0x0CU) /*!< SPI data register */
  21. #define SPI_CRCPOLY(spix) REG32((spix) + 0x10U) /*!< SPI CRC polynomial register */
  22. #define SPI_RCRC(spix) REG32((spix) + 0x14U) /*!< SPI receive CRC register */
  23. #define SPI_TCRC(spix) REG32((spix) + 0x18U) /*!< SPI transmit CRC register */
  24. #define SPI_I2SCTL(spix) REG32((spix) + 0x1CU) /*!< SPI I2S control register */
  25. #define SPI_I2SPSC(spix) REG32((spix) + 0x20U) /*!< SPI I2S clock prescaler register */
  26. #define SPI_QCTL(spix) REG32((spix) + 0x80U) /*!< SPI quad mode control register(only SPI0) */
  27. /* bits definitions */
  28. /* SPI_CTL0 */
  29. #define SPI_CTL0_CKPH BIT(0) /*!< clock phase selection*/
  30. #define SPI_CTL0_CKPL BIT(1) /*!< clock polarity selection */
  31. #define SPI_CTL0_MSTMOD BIT(2) /*!< master mode enable */
  32. #define SPI_CTL0_PSC BITS(3,5) /*!< master clock prescaler selection */
  33. #define SPI_CTL0_SPIEN BIT(6) /*!< SPI enable*/
  34. #define SPI_CTL0_LF BIT(7) /*!< LSB first mode */
  35. #define SPI_CTL0_SWNSS BIT(8) /*!< NSS pin selection in NSS software mode */
  36. #define SPI_CTL0_SWNSSEN BIT(9) /*!< NSS software mode selection */
  37. #define SPI_CTL0_RO BIT(10) /*!< receive only */
  38. #define SPI_CTL0_FF16 BIT(11) /*!< data frame size */
  39. #define SPI_CTL0_CRCNT BIT(12) /*!< CRC next transfer */
  40. #define SPI_CTL0_CRCEN BIT(13) /*!< CRC calculation enable */
  41. #define SPI_CTL0_BDOEN BIT(14) /*!< bidirectional transmit output enable*/
  42. #define SPI_CTL0_BDEN BIT(15) /*!< bidirectional enable */
  43. /* SPI_CTL1 */
  44. #define SPI_CTL1_DMAREN BIT(0) /*!< receive buffer dma enable */
  45. #define SPI_CTL1_DMATEN BIT(1) /*!< transmit buffer dma enable */
  46. #define SPI_CTL1_NSSDRV BIT(2) /*!< drive NSS output */
  47. #define SPI_CTL1_NSSP BIT(3) /*!< SPI NSS pulse mode enable */
  48. #define SPI_CTL1_TMOD BIT(4) /*!< SPI TI mode enable */
  49. #define SPI_CTL1_ERRIE BIT(5) /*!< errors interrupt enable */
  50. #define SPI_CTL1_RBNEIE BIT(6) /*!< receive buffer not empty interrupt enable */
  51. #define SPI_CTL1_TBEIE BIT(7) /*!< transmit buffer empty interrupt enable */
  52. /* SPI_STAT */
  53. #define SPI_STAT_RBNE BIT(0) /*!< receive buffer not empty */
  54. #define SPI_STAT_TBE BIT(1) /*!< transmit buffer empty */
  55. #define SPI_STAT_I2SCH BIT(2) /*!< I2S channel side */
  56. #define SPI_STAT_TXURERR BIT(3) /*!< I2S transmission underrun error bit */
  57. #define SPI_STAT_CRCERR BIT(4) /*!< SPI CRC error bit */
  58. #define SPI_STAT_CONFERR BIT(5) /*!< SPI configuration error bit */
  59. #define SPI_STAT_RXORERR BIT(6) /*!< SPI reception overrun error bit */
  60. #define SPI_STAT_TRANS BIT(7) /*!< transmitting on-going bit */
  61. #define SPI_STAT_FERR BIT(8) /*!< format error bit */
  62. /* SPI_DATA */
  63. #define SPI_DATA_DATA BITS(0,15) /*!< data transfer register */
  64. /* SPI_CRCPOLY */
  65. #define SPI_CRCPOLY_CPR BITS(0,15) /*!< CRC polynomial register */
  66. /* SPI_RCRC */
  67. #define SPI_RCRC_RCR BITS(0,15) /*!< RX CRC register */
  68. /* SPI_TCRC */
  69. #define SPI_TCRC_TCR BITS(0,15) /*!< RX CRC register */
  70. /* SPI_I2SCTL */
  71. #define SPI_I2SCTL_CHLEN BIT(0) /*!< channel length */
  72. #define SPI_I2SCTL_DTLEN BITS(1,2) /*!< data length */
  73. #define SPI_I2SCTL_CKPL BIT(3) /*!< idle state clock polarity */
  74. #define SPI_I2SCTL_I2SSTD BITS(4,5) /*!< I2S standard selection */
  75. #define SPI_I2SCTL_PCMSMOD BIT(7) /*!< PCM frame synchronization mode */
  76. #define SPI_I2SCTL_I2SOPMOD BITS(8,9) /*!< I2S operation mode */
  77. #define SPI_I2SCTL_I2SEN BIT(10) /*!< I2S enable */
  78. #define SPI_I2SCTL_I2SSEL BIT(11) /*!< I2S mode selection */
  79. /* SPI_I2SPSC */
  80. #define SPI_I2SPSC_DIV BITS(0,7) /*!< dividing factor for the prescaler */
  81. #define SPI_I2SPSC_OF BIT(8) /*!< odd factor for the prescaler */
  82. #define SPI_I2SPSC_MCKOEN BIT(9) /*!< I2S MCK output enable */
  83. /* SPI_QCTL(only for SPI0) */
  84. #define SPI_QCTL_QMOD BIT(0) /*!< quad-SPI mode enable */
  85. #define SPI_QCTL_QRD BIT(1) /*!< quad-SPI mode read select */
  86. #define SPI_QCTL_IO23_DRV BIT(2) /*!< drive SPI_IO2 and SPI_IO3 enable */
  87. /* constants definitions */
  88. /* SPI and I2S parameter struct definitions */
  89. typedef struct
  90. {
  91. uint32_t device_mode; /*!< SPI master or slave */
  92. uint32_t trans_mode; /*!< SPI transtype */
  93. uint32_t frame_size; /*!< SPI frame size */
  94. uint32_t nss; /*!< SPI NSS control by handware or software */
  95. uint32_t endian; /*!< SPI big endian or little endian */
  96. uint32_t clock_polarity_phase; /*!< SPI clock phase and polarity */
  97. uint32_t prescale; /*!< SPI prescale factor */
  98. }spi_parameter_struct;
  99. /* SPI mode definitions */
  100. #define SPI_MASTER (SPI_CTL0_MSTMOD | SPI_CTL0_SWNSS) /*!< SPI as master */
  101. #define SPI_SLAVE ((uint32_t)0x00000000U) /*!< SPI as slave */
  102. /* SPI bidirectional transfer direction */
  103. #define SPI_BIDIRECTIONAL_TRANSMIT SPI_CTL0_BDOEN /*!< SPI work in transmit-only mode */
  104. #define SPI_BIDIRECTIONAL_RECEIVE ~SPI_CTL0_BDOEN /*!< SPI work in receive-only mode */
  105. /* SPI transmit type */
  106. #define SPI_TRANSMODE_FULLDUPLEX ((uint32_t)0x00000000U) /*!< SPI receive and send data at fullduplex communication */
  107. #define SPI_TRANSMODE_RECEIVEONLY SPI_CTL0_RO /*!< SPI only receive data */
  108. #define SPI_TRANSMODE_BDRECEIVE SPI_CTL0_BDEN /*!< bidirectional receive data */
  109. #define SPI_TRANSMODE_BDTRANSMIT (SPI_CTL0_BDEN | SPI_CTL0_BDOEN) /*!< bidirectional transmit data*/
  110. /* SPI frame size */
  111. #define SPI_FRAMESIZE_16BIT SPI_CTL0_FF16 /*!< SPI frame size is 16 bits */
  112. #define SPI_FRAMESIZE_8BIT ((uint32_t)0x00000000U) /*!< SPI frame size is 8 bits */
  113. /* SPI NSS control mode */
  114. #define SPI_NSS_SOFT SPI_CTL0_SWNSSEN /*!< SPI NSS control by sofrware */
  115. #define SPI_NSS_HARD ((uint32_t)0x00000000U) /*!< SPI NSS control by hardware */
  116. /* SPI transmit way */
  117. #define SPI_ENDIAN_MSB ((uint32_t)0x00000000U) /*!< SPI transmit way is big endian: transmit MSB first */
  118. #define SPI_ENDIAN_LSB SPI_CTL0_LF /*!< SPI transmit way is little endian: transmit LSB first */
  119. /* SPI clock phase and polarity */
  120. #define SPI_CK_PL_LOW_PH_1EDGE ((uint32_t)0x00000000U) /*!< SPI clock polarity is low level and phase is first edge */
  121. #define SPI_CK_PL_HIGH_PH_1EDGE SPI_CTL0_CKPL /*!< SPI clock polarity is high level and phase is first edge */
  122. #define SPI_CK_PL_LOW_PH_2EDGE SPI_CTL0_CKPH /*!< SPI clock polarity is low level and phase is second edge */
  123. #define SPI_CK_PL_HIGH_PH_2EDGE (SPI_CTL0_CKPL | SPI_CTL0_CKPH) /*!< SPI clock polarity is high level and phase is second edge */
  124. /* SPI clock prescale factor */
  125. #define CTL0_PSC(regval) (BITS(3,5) & ((uint32_t)(regval) << 3))
  126. #define SPI_PSC_2 CTL0_PSC(0) /*!< SPI clock prescale factor is 2 */
  127. #define SPI_PSC_4 CTL0_PSC(1) /*!< SPI clock prescale factor is 4 */
  128. #define SPI_PSC_8 CTL0_PSC(2) /*!< SPI clock prescale factor is 8 */
  129. #define SPI_PSC_16 CTL0_PSC(3) /*!< SPI clock prescale factor is 16 */
  130. #define SPI_PSC_32 CTL0_PSC(4) /*!< SPI clock prescale factor is 32 */
  131. #define SPI_PSC_64 CTL0_PSC(5) /*!< SPI clock prescale factor is 64 */
  132. #define SPI_PSC_128 CTL0_PSC(6) /*!< SPI clock prescale factor is 128 */
  133. #define SPI_PSC_256 CTL0_PSC(7) /*!< SPI clock prescale factor is 256 */
  134. /* I2S audio sample rate */
  135. #define I2S_AUDIOSAMPLE_8K ((uint32_t)8000U) /*!< I2S audio sample rate is 8KHz */
  136. #define I2S_AUDIOSAMPLE_11K ((uint32_t)11025U) /*!< I2S audio sample rate is 11KHz */
  137. #define I2S_AUDIOSAMPLE_16K ((uint32_t)16000U) /*!< I2S audio sample rate is 16KHz */
  138. #define I2S_AUDIOSAMPLE_22K ((uint32_t)22050U) /*!< I2S audio sample rate is 22KHz */
  139. #define I2S_AUDIOSAMPLE_32K ((uint32_t)32000U) /*!< I2S audio sample rate is 32KHz */
  140. #define I2S_AUDIOSAMPLE_44K ((uint32_t)44100U) /*!< I2S audio sample rate is 44KHz */
  141. #define I2S_AUDIOSAMPLE_48K ((uint32_t)48000U) /*!< I2S audio sample rate is 48KHz */
  142. #define I2S_AUDIOSAMPLE_96K ((uint32_t)96000U) /*!< I2S audio sample rate is 96KHz */
  143. #define I2S_AUDIOSAMPLE_192K ((uint32_t)192000U) /*!< I2S audio sample rate is 192KHz */
  144. /* I2S frame format */
  145. #define I2SCTL_DTLEN(regval) (BITS(1,2) & ((uint32_t)(regval) << 1))
  146. #define I2S_FRAMEFORMAT_DT16B_CH16B I2SCTL_DTLEN(0) /*!< I2S data length is 16 bit and channel length is 16 bit */
  147. #define I2S_FRAMEFORMAT_DT16B_CH32B (I2SCTL_DTLEN(0) | SPI_I2SCTL_CHLEN) /*!< I2S data length is 16 bit and channel length is 32 bit */
  148. #define I2S_FRAMEFORMAT_DT24B_CH32B (I2SCTL_DTLEN(1) | SPI_I2SCTL_CHLEN) /*!< I2S data length is 24 bit and channel length is 32 bit */
  149. #define I2S_FRAMEFORMAT_DT32B_CH32B (I2SCTL_DTLEN(2) | SPI_I2SCTL_CHLEN) /*!< I2S data length is 32 bit and channel length is 32 bit */
  150. /* I2S master clock output */
  151. #define I2S_MCKOUT_DISABLE ((uint32_t)0x00000000U) /*!< I2S master clock output disable */
  152. #define I2S_MCKOUT_ENABLE SPI_I2SPSC_MCKOEN /*!< I2S master clock output enable */
  153. /* I2S operation mode */
  154. #define I2SCTL_I2SOPMOD(regval) (BITS(8,9) & ((uint32_t)(regval) << 8))
  155. #define I2S_MODE_SLAVETX I2SCTL_I2SOPMOD(0) /*!< I2S slave transmit mode */
  156. #define I2S_MODE_SLAVERX I2SCTL_I2SOPMOD(1) /*!< I2S slave receive mode */
  157. #define I2S_MODE_MASTERTX I2SCTL_I2SOPMOD(2) /*!< I2S master transmit mode */
  158. #define I2S_MODE_MASTERRX I2SCTL_I2SOPMOD(3) /*!< I2S master receive mode */
  159. /* I2S standard */
  160. #define I2SCTL_I2SSTD(regval) (BITS(4,5) & ((uint32_t)(regval) << 4))
  161. #define I2S_STD_PHILLIPS I2SCTL_I2SSTD(0) /*!< I2S phillips standard */
  162. #define I2S_STD_MSB I2SCTL_I2SSTD(1) /*!< I2S MSB standard */
  163. #define I2S_STD_LSB I2SCTL_I2SSTD(2) /*!< I2S LSB standard */
  164. #define I2S_STD_PCMSHORT I2SCTL_I2SSTD(3) /*!< I2S PCM short standard */
  165. #define I2S_STD_PCMLONG (I2SCTL_I2SSTD(3) | SPI_I2SCTL_PCMSMOD) /*!< I2S PCM long standard */
  166. /* I2S clock polarity */
  167. #define I2S_CKPL_LOW ((uint32_t)0x00000000U) /*!< I2S clock polarity low level */
  168. #define I2S_CKPL_HIGH SPI_I2SCTL_CKPL /*!< I2S clock polarity high level */
  169. /* SPI DMA constants definitions */
  170. #define SPI_DMA_TRANSMIT ((uint8_t)0x00U) /*!< SPI transmit data use DMA */
  171. #define SPI_DMA_RECEIVE ((uint8_t)0x01U) /*!< SPI receive data use DMA */
  172. /* SPI CRC constants definitions */
  173. #define SPI_CRC_TX ((uint8_t)0x00U) /*!< SPI transmit CRC value */
  174. #define SPI_CRC_RX ((uint8_t)0x01U) /*!< SPI receive CRC value */
  175. /* SPI/I2S interrupt enable/disable constants definitions */
  176. #define SPI_I2S_INT_TBE ((uint8_t)0x00U) /*!< transmit buffer empty interrupt */
  177. #define SPI_I2S_INT_RBNE ((uint8_t)0x01U) /*!< receive buffer not empty interrupt */
  178. #define SPI_I2S_INT_ERR ((uint8_t)0x02U) /*!< error interrupt */
  179. /* SPI/I2S interrupt flag constants definitions */
  180. #define SPI_I2S_INT_FLAG_TBE ((uint8_t)0x00U) /*!< transmit buffer empty interrupt flag */
  181. #define SPI_I2S_INT_FLAG_RBNE ((uint8_t)0x01U) /*!< receive buffer not empty interrupt flag */
  182. #define SPI_I2S_INT_FLAG_RXORERR ((uint8_t)0x02U) /*!< overrun interrupt flag */
  183. #define SPI_INT_FLAG_CONFERR ((uint8_t)0x03U) /*!< config error interrupt flag */
  184. #define SPI_INT_FLAG_CRCERR ((uint8_t)0x04U) /*!< CRC error interrupt flag */
  185. #define I2S_INT_FLAG_TXURERR ((uint8_t)0x05U) /*!< underrun error interrupt flag */
  186. #define SPI_I2S_INT_FLAG_FERR ((uint8_t)0x06U) /*!< format error interrupt flag */
  187. /* SPI/I2S flag definitions */
  188. #define SPI_FLAG_RBNE SPI_STAT_RBNE /*!< receive buffer not empty flag */
  189. #define SPI_FLAG_TBE SPI_STAT_TBE /*!< transmit buffer empty flag */
  190. #define SPI_FLAG_CRCERR SPI_STAT_CRCERR /*!< CRC error flag */
  191. #define SPI_FLAG_CONFERR SPI_STAT_CONFERR /*!< mode config error flag */
  192. #define SPI_FLAG_RXORERR SPI_STAT_RXORERR /*!< receive overrun error flag */
  193. #define SPI_FLAG_TRANS SPI_STAT_TRANS /*!< transmit on-going flag */
  194. #define SPI_FLAG_FERR SPI_STAT_FERR /*!< format error interrupt flag */
  195. #define I2S_FLAG_RBNE SPI_STAT_RBNE /*!< receive buffer not empty flag */
  196. #define I2S_FLAG_TBE SPI_STAT_TBE /*!< transmit buffer empty flag */
  197. #define I2S_FLAG_CH SPI_STAT_I2SCH /*!< channel side flag */
  198. #define I2S_FLAG_TXURERR SPI_STAT_TXURERR /*!< underrun error flag */
  199. #define I2S_FLAG_RXORERR SPI_STAT_RXORERR /*!< overrun error flag */
  200. #define I2S_FLAG_TRANS SPI_STAT_TRANS /*!< transmit on-going flag */
  201. #define I2S_FLAG_FERR SPI_STAT_FERR /*!< format error interrupt flag */
  202. /* function declarations */
  203. /* reset SPI and I2S */
  204. void spi_i2s_deinit(uint32_t spi_periph);
  205. /* initialize SPI parameter */
  206. void spi_init(uint32_t spi_periph, spi_parameter_struct* spi_struct);
  207. /* enable SPI */
  208. void spi_enable(uint32_t spi_periph);
  209. /* disable SPI */
  210. void spi_disable(uint32_t spi_periph);
  211. /* initialize I2S parameter */
  212. void i2s_init(uint32_t spi_periph, uint32_t mode, uint32_t standard, uint32_t ckpl);
  213. /* configure I2S prescaler */
  214. void i2s_psc_config(uint32_t spi_periph, uint32_t audiosample, uint32_t frameformat, uint32_t mckout);
  215. /* enable I2S */
  216. void i2s_enable(uint32_t spi_periph);
  217. /* disable I2S */
  218. void i2s_disable(uint32_t spi_periph);
  219. /* enable SPI NSS output */
  220. void spi_nss_output_enable(uint32_t spi_periph);
  221. /* disable SPI NSS output */
  222. void spi_nss_output_disable(uint32_t spi_periph);
  223. /* SPI NSS pin high level in software mode */
  224. void spi_nss_internal_high(uint32_t spi_periph);
  225. /* SPI NSS pin low level in software mode */
  226. void spi_nss_internal_low(uint32_t spi_periph);
  227. /* enable SPI DMA */
  228. void spi_dma_enable(uint32_t spi_periph, uint8_t dma);
  229. /* disable SPI DMA */
  230. void spi_dma_disable(uint32_t spi_periph, uint8_t dma);
  231. /* configure SPI/I2S data frame format */
  232. void spi_i2s_data_frame_format_config(uint32_t spi_periph, uint16_t frame_format);
  233. /* SPI transmit data */
  234. void spi_i2s_data_transmit(uint32_t spi_periph, uint16_t data);
  235. /* SPI receive data */
  236. uint16_t spi_i2s_data_receive(uint32_t spi_periph);
  237. /* configure SPI bidirectional transfer direction */
  238. void spi_bidirectional_transfer_config(uint32_t spi_periph, uint32_t transfer_direction);
  239. /* enable SPI and I2S interrupt */
  240. void spi_i2s_interrupt_enable(uint32_t spi_periph, uint8_t interrupt);
  241. /* disable SPI and I2S interrupt */
  242. void spi_i2s_interrupt_disable(uint32_t spi_periph, uint8_t interrupt);
  243. /* get SPI and I2S interrupt status */
  244. FlagStatus spi_i2s_interrupt_flag_get(uint32_t spi_periph, uint8_t interrupt);
  245. /* get SPI and I2S flag status */
  246. FlagStatus spi_i2s_flag_get(uint32_t spi_periph, uint32_t flag);
  247. /* clear SPI CRC error flag status */
  248. void spi_crc_error_clear(uint32_t spi_periph);
  249. /* set SPI CRC polynomial */
  250. void spi_crc_polynomial_set(uint32_t spi_periph, uint16_t crc_poly);
  251. /* get SPI CRC polynomial */
  252. uint16_t spi_crc_polynomial_get(uint32_t spi_periph);
  253. /* turn on SPI CRC function */
  254. void spi_crc_on(uint32_t spi_periph);
  255. /* turn off SPI CRC function */
  256. void spi_crc_off(uint32_t spi_periph);
  257. /* SPI next data is CRC value */
  258. void spi_crc_next(uint32_t spi_periph);
  259. /* get SPI CRC send value or receive value */
  260. uint16_t spi_crc_get(uint32_t spi_periph, uint8_t crc);
  261. /* enable SPI TI mode */
  262. void spi_ti_mode_enable(uint32_t spi_periph);
  263. /* disable SPI TI mode */
  264. void spi_ti_mode_disable(uint32_t spi_periph);
  265. /* enable SPI NSS pulse mode */
  266. void spi_nssp_mode_enable(uint32_t spi_periph);
  267. /* disable SPI NSS pulse mode */
  268. void spi_nssp_mode_disable(uint32_t spi_periph);
  269. /* enable quad wire SPI */
  270. void qspi_enable(uint32_t spi_periph);
  271. /* disable quad wire SPI */
  272. void qspi_disable(uint32_t spi_periph);
  273. /* enable quad wire SPI write */
  274. void qspi_write_enable(uint32_t spi_periph);
  275. /* enable quad wire SPI read */
  276. void qspi_read_enable(uint32_t spi_periph);
  277. /* enable quad wire SPI_IO2 and SPI_IO3 pin output */
  278. void qspi_io23_output_enable(uint32_t spi_periph);
  279. /* disable quad wire SPI_IO2 and SPI_IO3 pin output */
  280. void qspi_io23_output_disable(uint32_t spi_periph);
  281. #endif /* GD32F30X_SPI_H */