1 /*!
2     \file    gd32e50x_spi.h
3     \brief   definitions for the SPI
4 
5     \version 2020-03-10, V1.0.0, firmware for GD32E50x
6     \version 2020-08-26, V1.1.0, firmware for GD32E50x
7     \version 2021-03-23, V1.2.0, firmware for GD32E50x
8 */
9 
10 /*
11     Copyright (c) 2021, GigaDevice Semiconductor Inc.
12 
13     Redistribution and use in source and binary forms, with or without modification,
14 are permitted provided that the following conditions are met:
15 
16     1. Redistributions of source code must retain the above copyright notice, this
17        list of conditions and the following disclaimer.
18     2. Redistributions in binary form must reproduce the above copyright notice,
19        this list of conditions and the following disclaimer in the documentation
20        and/or other materials provided with the distribution.
21     3. Neither the name of the copyright holder nor the names of its contributors
22        may be used to endorse or promote products derived from this software without
23        specific prior written permission.
24 
25     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
26 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
27 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
28 IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
29 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
30 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
31 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
32 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
34 OF SUCH DAMAGE.
35 */
36 
37 #ifndef GD32E50X_SPI_H
38 #define GD32E50X_SPI_H
39 
40 #include "gd32e50x.h"
41 
42 /* SPIx(x=0,1,2) definitions */
43 #define SPI0                            (SPI_BASE + 0x0000F800U)
44 #define SPI1                            SPI_BASE
45 #define SPI2                            (SPI_BASE + 0x00000400U)
46 
47 /* I2Sx_ADD(x=1,2) definitions */
48 #define I2S1_ADD                        I2S_ADD_BASE
49 #define I2S2_ADD                        (I2S_ADD_BASE + 0x00000C00U)
50 
51 /* SPI registers definitions */
52 #define SPI_CTL0(spix)                  REG32((spix) + 0x00000000U)             /*!< SPI control register 0 */
53 #define SPI_CTL1(spix)                  REG32((spix) + 0x00000004U)             /*!< SPI control register 1*/
54 #define SPI_STAT(spix)                  REG32((spix) + 0x00000008U)             /*!< SPI status register */
55 #define SPI_DATA(spix)                  REG32((spix) + 0x0000000CU)             /*!< SPI data register */
56 #define SPI_CRCPOLY(spix)               REG32((spix) + 0x00000010U)             /*!< SPI CRC polynomial register */
57 #define SPI_RCRC(spix)                  REG32((spix) + 0x00000014U)             /*!< SPI receive CRC register */
58 #define SPI_TCRC(spix)                  REG32((spix) + 0x00000018U)             /*!< SPI transmit CRC register */
59 #define SPI_I2SCTL(spix)                REG32((spix) + 0x0000001CU)             /*!< SPI I2S control register */
60 #define SPI_I2SPSC(spix)                REG32((spix) + 0x00000020U)             /*!< SPI I2S clock prescaler register */
61 #define SPI_QCTL(spix)                  REG32((spix) + 0x00000080U)             /*!< SPI quad mode control register(only SPI0) */
62 
63 /* I2S_ADD registers definitions */
64 #define I2S_ADD_CTL0(i2sx_add)          REG32((i2sx_add) + 0x00000000U)         /*!< I2S_ADD control register 0 */
65 #define I2S_ADD_CTL1(i2sx_add)          REG32((i2sx_add) + 0x00000004U)         /*!< I2S_ADD control register 1*/
66 #define I2S_ADD_STAT(i2sx_add)          REG32((i2sx_add) + 0x00000008U)         /*!< I2S_ADD status register */
67 #define I2S_ADD_DATA(i2sx_add)          REG32((i2sx_add) + 0x0000000CU)         /*!< I2S_ADD data register */
68 #define I2S_ADD_CRCPOLY(i2sx_add)       REG32((i2sx_add) + 0x00000010U)         /*!< I2S_ADD CRC polynomial register */
69 #define I2S_ADD_RCRC(i2sx_add)          REG32((i2sx_add) + 0x00000014U)         /*!< I2S_ADD receive CRC register */
70 #define I2S_ADD_TCRC(i2sx_add)          REG32((i2sx_add) + 0x00000018U)         /*!< I2S_ADD transmit CRC register */
71 #define I2S_ADD_I2SCTL(i2sx_add)        REG32((i2sx_add) + 0x0000001CU)         /*!< I2S_ADD I2S control register */
72 #define I2S_ADD_I2SPSC(i2sx_add)        REG32((i2sx_add) + 0x00000020U)         /*!< I2S_ADD I2S clock prescaler register */
73 
74 /* bits definitions */
75 /* SPI_CTL0 */
76 #define SPI_CTL0_CKPH                   BIT(0)                                  /*!< clock phase selection*/
77 #define SPI_CTL0_CKPL                   BIT(1)                                  /*!< clock polarity selection */
78 #define SPI_CTL0_MSTMOD                 BIT(2)                                  /*!< master mode enable */
79 #define SPI_CTL0_PSC                    BITS(3,5)                               /*!< master clock prescaler selection */
80 #define SPI_CTL0_SPIEN                  BIT(6)                                  /*!< SPI enable*/
81 #define SPI_CTL0_LF                     BIT(7)                                  /*!< LSB first mode */
82 #define SPI_CTL0_SWNSS                  BIT(8)                                  /*!< NSS pin selection in NSS software mode */
83 #define SPI_CTL0_SWNSSEN                BIT(9)                                  /*!< NSS software mode selection */
84 #define SPI_CTL0_RO                     BIT(10)                                 /*!< receive only */
85 #define SPI_CTL0_FF16                   BIT(11)                                 /*!< data frame size */
86 #define SPI_CTL0_CRCNT                  BIT(12)                                 /*!< CRC next transfer */
87 #define SPI_CTL0_CRCEN                  BIT(13)                                 /*!< CRC calculation enable */
88 #define SPI_CTL0_BDOEN                  BIT(14)                                 /*!< bidirectional transmit output enable*/
89 #define SPI_CTL0_BDEN                   BIT(15)                                 /*!< bidirectional enable */
90 
91 /* SPI_CTL1 */
92 #define SPI_CTL1_DMAREN                 BIT(0)                                  /*!< receive buffer dma enable */
93 #define SPI_CTL1_DMATEN                 BIT(1)                                  /*!< transmit buffer dma enable */
94 #define SPI_CTL1_NSSDRV                 BIT(2)                                  /*!< drive NSS output */
95 #define SPI_CTL1_NSSP                   BIT(3)                                  /*!< SPI NSS pulse mode enable */
96 #define SPI_CTL1_TMOD                   BIT(4)                                  /*!< SPI TI mode enable */
97 #define SPI_CTL1_ERRIE                  BIT(5)                                  /*!< errors interrupt enable */
98 #define SPI_CTL1_RBNEIE                 BIT(6)                                  /*!< receive buffer not empty interrupt enable */
99 #define SPI_CTL1_TBEIE                  BIT(7)                                  /*!< transmit buffer empty interrupt enable */
100 
101 /* SPI_STAT */
102 #define SPI_STAT_RBNE                   BIT(0)                                  /*!< receive buffer not empty */
103 #define SPI_STAT_TBE                    BIT(1)                                  /*!< transmit buffer empty */
104 #define SPI_STAT_I2SCH                  BIT(2)                                  /*!< I2S channel side */
105 #define SPI_STAT_TXURERR                BIT(3)                                  /*!< I2S transmission underrun error bit */
106 #define SPI_STAT_CRCERR                 BIT(4)                                  /*!< SPI CRC error bit */
107 #define SPI_STAT_CONFERR                BIT(5)                                  /*!< SPI configuration error bit */
108 #define SPI_STAT_RXORERR                BIT(6)                                  /*!< SPI reception overrun error bit */
109 #define SPI_STAT_TRANS                  BIT(7)                                  /*!< transmitting on-going bit */
110 #define SPI_STAT_FERR                   BIT(8)                                  /*!< format error bit */
111 
112 /* SPI_DATA */
113 #define SPI_DATA_DATA                   BITS(0,15)                              /*!< data transfer register */
114 
115 /* SPI_CRCPOLY */
116 #define SPI_CRCPOLY_CPR                 BITS(0,15)                              /*!< CRC polynomial register */
117 
118 /* SPI_RCRC */
119 #define SPI_RCRC_RCR                    BITS(0,15)                              /*!< RX CRC register */
120 
121 /* SPI_TCRC */
122 #define SPI_TCRC_TCR                    BITS(0,15)                              /*!< TX CRC register */
123 
124 /* SPI_I2SCTL */
125 #define SPI_I2SCTL_CHLEN                BIT(0)                                  /*!< channel length */
126 #define SPI_I2SCTL_DTLEN                BITS(1,2)                               /*!< data length */
127 #define SPI_I2SCTL_CKPL                 BIT(3)                                  /*!< idle state clock polarity */
128 #define SPI_I2SCTL_I2SSTD               BITS(4,5)                               /*!< I2S standard selection */
129 #define SPI_I2SCTL_PCMSMOD              BIT(7)                                  /*!< PCM frame synchronization mode */
130 #define SPI_I2SCTL_I2SOPMOD             BITS(8,9)                               /*!< I2S operation mode */
131 #define SPI_I2SCTL_I2SEN                BIT(10)                                 /*!< I2S enable */
132 #define SPI_I2SCTL_I2SSEL               BIT(11)                                 /*!< I2S mode selection */
133 
134 /* SPI_I2SPSC */
135 #define SPI_I2SPSC_DIV                  BITS(0,7)                               /*!< dividing factor for the prescaler */
136 #define SPI_I2SPSC_OF                   BIT(8)                                  /*!< odd factor for the prescaler */
137 #define SPI_I2SPSC_MCKOEN               BIT(9)                                  /*!< I2S MCK output enable */
138 
139 /* SPI_QCTL(only for SPI0) */
140 #define SPI_QCTL_QMOD                   BIT(0)                                  /*!< quad-SPI mode enable */
141 #define SPI_QCTL_QRD                    BIT(1)                                  /*!< quad-SPI mode read select */
142 #define SPI_QCTL_IO23_DRV               BIT(2)                                  /*!< drive SPI_IO2 and SPI_IO3 enable */
143 
144 /* constants definitions */
145 /* SPI and I2S parameter struct definitions */
146 typedef struct
147 {
148     uint32_t device_mode;                                                       /*!< SPI master or slave */
149     uint32_t trans_mode;                                                        /*!< SPI transtype */
150     uint32_t frame_size;                                                        /*!< SPI frame size */
151     uint32_t nss;                                                               /*!< SPI NSS control by handware or software */
152     uint32_t endian;                                                            /*!< SPI big endian or little endian */
153     uint32_t clock_polarity_phase;                                              /*!< SPI clock phase and polarity */
154     uint32_t prescale;                                                          /*!< SPI prescale factor */
155 }spi_parameter_struct;
156 
157 /* SPI mode definitions */
158 #define SPI_MASTER                      (SPI_CTL0_MSTMOD | SPI_CTL0_SWNSS)      /*!< SPI as master */
159 #define SPI_SLAVE                       ((uint32_t)0x00000000U)                 /*!< SPI as slave */
160 
161 /* SPI bidirectional transfer direction */
162 #define SPI_BIDIRECTIONAL_TRANSMIT      SPI_CTL0_BDOEN                          /*!< SPI work in transmit-only mode */
163 #define SPI_BIDIRECTIONAL_RECEIVE       (~SPI_CTL0_BDOEN)                       /*!< SPI work in receive-only mode */
164 
165 /* SPI transmit type */
166 #define SPI_TRANSMODE_FULLDUPLEX        ((uint32_t)0x00000000U)                 /*!< SPI receive and send data at fullduplex communication */
167 #define SPI_TRANSMODE_RECEIVEONLY       SPI_CTL0_RO                             /*!< SPI only receive data */
168 #define SPI_TRANSMODE_BDRECEIVE         SPI_CTL0_BDEN                           /*!< bidirectional receive data */
169 #define SPI_TRANSMODE_BDTRANSMIT        (SPI_CTL0_BDEN | SPI_CTL0_BDOEN)        /*!< bidirectional transmit data*/
170 
171 /* SPI frame size */
172 #define SPI_FRAMESIZE_16BIT             SPI_CTL0_FF16                           /*!< SPI frame size is 16 bits */
173 #define SPI_FRAMESIZE_8BIT              ((uint32_t)0x00000000U)                 /*!< SPI frame size is 8 bits */
174 
175 /* SPI NSS control mode */
176 #define SPI_NSS_SOFT                    SPI_CTL0_SWNSSEN                        /*!< SPI NSS control by sofrware */
177 #define SPI_NSS_HARD                    ((uint32_t)0x00000000U)                 /*!< SPI NSS control by hardware */
178 
179 /* SPI transmit way */
180 #define SPI_ENDIAN_MSB                  ((uint32_t)0x00000000U)                 /*!< SPI transmit way is big endian: transmit MSB first */
181 #define SPI_ENDIAN_LSB                  SPI_CTL0_LF                             /*!< SPI transmit way is little endian: transmit LSB first */
182 
183 /* SPI clock phase and polarity */
184 #define SPI_CK_PL_LOW_PH_1EDGE          ((uint32_t)0x00000000U)                 /*!< SPI clock polarity is low level and phase is first edge */
185 #define SPI_CK_PL_HIGH_PH_1EDGE         SPI_CTL0_CKPL                           /*!< SPI clock polarity is high level and phase is first edge */
186 #define SPI_CK_PL_LOW_PH_2EDGE          SPI_CTL0_CKPH                           /*!< SPI clock polarity is low level and phase is second edge */
187 #define SPI_CK_PL_HIGH_PH_2EDGE         (SPI_CTL0_CKPL | SPI_CTL0_CKPH)         /*!< SPI clock polarity is high level and phase is second edge */
188 
189 /* SPI clock prescale factor */
190 #define CTL0_PSC(regval)                (BITS(3,5) & ((uint32_t)(regval) << 3))
191 #define SPI_PSC_2                       CTL0_PSC(0)                             /*!< SPI clock prescale factor is 2 */
192 #define SPI_PSC_4                       CTL0_PSC(1)                             /*!< SPI clock prescale factor is 4 */
193 #define SPI_PSC_8                       CTL0_PSC(2)                             /*!< SPI clock prescale factor is 8 */
194 #define SPI_PSC_16                      CTL0_PSC(3)                             /*!< SPI clock prescale factor is 16 */
195 #define SPI_PSC_32                      CTL0_PSC(4)                             /*!< SPI clock prescale factor is 32 */
196 #define SPI_PSC_64                      CTL0_PSC(5)                             /*!< SPI clock prescale factor is 64 */
197 #define SPI_PSC_128                     CTL0_PSC(6)                             /*!< SPI clock prescale factor is 128 */
198 #define SPI_PSC_256                     CTL0_PSC(7)                             /*!< SPI clock prescale factor is 256 */
199 
200 /* I2S audio sample rate */
201 #define I2S_AUDIOSAMPLE_8K              ((uint32_t)8000U)                       /*!< I2S audio sample rate is 8KHz */
202 #define I2S_AUDIOSAMPLE_11K             ((uint32_t)11025U)                      /*!< I2S audio sample rate is 11KHz */
203 #define I2S_AUDIOSAMPLE_16K             ((uint32_t)16000U)                      /*!< I2S audio sample rate is 16KHz */
204 #define I2S_AUDIOSAMPLE_22K             ((uint32_t)22050U)                      /*!< I2S audio sample rate is 22KHz */
205 #define I2S_AUDIOSAMPLE_32K             ((uint32_t)32000U)                      /*!< I2S audio sample rate is 32KHz */
206 #define I2S_AUDIOSAMPLE_44K             ((uint32_t)44100U)                      /*!< I2S audio sample rate is 44KHz */
207 #define I2S_AUDIOSAMPLE_48K             ((uint32_t)48000U)                      /*!< I2S audio sample rate is 48KHz */
208 #define I2S_AUDIOSAMPLE_96K             ((uint32_t)96000U)                      /*!< I2S audio sample rate is 96KHz */
209 #define I2S_AUDIOSAMPLE_192K            ((uint32_t)192000U)                     /*!< I2S audio sample rate is 192KHz */
210 
211 /* I2S frame format */
212 #define I2SCTL_DTLEN(regval)            (BITS(1,2) & ((uint32_t)(regval) << 1))
213 #define I2S_FRAMEFORMAT_DT16B_CH16B     I2SCTL_DTLEN(0)                         /*!< I2S data length is 16 bit and channel length is 16 bit */
214 #define I2S_FRAMEFORMAT_DT16B_CH32B     (I2SCTL_DTLEN(0) | SPI_I2SCTL_CHLEN)    /*!< I2S data length is 16 bit and channel length is 32 bit */
215 #define I2S_FRAMEFORMAT_DT24B_CH32B     (I2SCTL_DTLEN(1) | SPI_I2SCTL_CHLEN)    /*!< I2S data length is 24 bit and channel length is 32 bit */
216 #define I2S_FRAMEFORMAT_DT32B_CH32B     (I2SCTL_DTLEN(2) | SPI_I2SCTL_CHLEN)    /*!< I2S data length is 32 bit and channel length is 32 bit */
217 
218 /* I2S master clock output */
219 #define I2S_MCKOUT_DISABLE              ((uint32_t)0x00000000U)                 /*!< I2S master clock output disable */
220 #define I2S_MCKOUT_ENABLE               SPI_I2SPSC_MCKOEN                       /*!< I2S master clock output enable */
221 
222 /* I2S operation mode */
223 #define I2SCTL_I2SOPMOD(regval)         (BITS(8,9) & ((uint32_t)(regval) << 8))
224 #define I2S_MODE_SLAVETX                I2SCTL_I2SOPMOD(0)                      /*!< I2S slave transmit mode */
225 #define I2S_MODE_SLAVERX                I2SCTL_I2SOPMOD(1)                      /*!< I2S slave receive mode */
226 #define I2S_MODE_MASTERTX               I2SCTL_I2SOPMOD(2)                      /*!< I2S master transmit mode */
227 #define I2S_MODE_MASTERRX               I2SCTL_I2SOPMOD(3)                      /*!< I2S master receive mode */
228 
229 /* I2S standard */
230 #define I2SCTL_I2SSTD(regval)           (BITS(4,5) & ((uint32_t)(regval) << 4))
231 #define I2S_STD_PHILLIPS                I2SCTL_I2SSTD(0)                        /*!< I2S phillips standard */
232 #define I2S_STD_MSB                     I2SCTL_I2SSTD(1)                        /*!< I2S MSB standard */
233 #define I2S_STD_LSB                     I2SCTL_I2SSTD(2)                        /*!< I2S LSB standard */
234 #define I2S_STD_PCMSHORT                I2SCTL_I2SSTD(3)                        /*!< I2S PCM short standard */
235 #define I2S_STD_PCMLONG                 (I2SCTL_I2SSTD(3) | SPI_I2SCTL_PCMSMOD) /*!< I2S PCM long standard */
236 
237 /* I2S clock polarity */
238 #define I2S_CKPL_LOW                    ((uint32_t)0x00000000U)                 /*!< I2S clock polarity low level */
239 #define I2S_CKPL_HIGH                   SPI_I2SCTL_CKPL                         /*!< I2S clock polarity high level */
240 
241 /* SPI DMA constants definitions */
242 #define SPI_DMA_TRANSMIT                ((uint8_t)0x00U)                        /*!< SPI transmit data use DMA */
243 #define SPI_DMA_RECEIVE                 ((uint8_t)0x01U)                        /*!< SPI receive data use DMA */
244 
245 /* SPI CRC constants definitions */
246 #define SPI_CRC_TX                      ((uint8_t)0x00U)                        /*!< SPI transmit CRC value */
247 #define SPI_CRC_RX                      ((uint8_t)0x01U)                        /*!< SPI receive CRC value */
248 
249 /* SPI/I2S interrupt enable/disable constants definitions */
250 #define SPI_I2S_INT_TBE                 SPI_CTL1_TBEIE                          /*!< transmit buffer empty interrupt */
251 #define SPI_I2S_INT_RBNE                SPI_CTL1_RBNEIE                         /*!< receive buffer not empty interrupt */
252 #define SPI_I2S_INT_ERR                 SPI_CTL1_ERRIE                          /*!< error interrupt */
253 
254 /* SPI/I2S interrupt flag constants definitions */
255 #define SPI_I2S_INT_FLAG_TBE            ((uint8_t)0x00U)                        /*!< transmit buffer empty interrupt flag */
256 #define SPI_I2S_INT_FLAG_RBNE           ((uint8_t)0x01U)                        /*!< receive buffer not empty interrupt flag */
257 #define SPI_I2S_INT_FLAG_RXORERR        ((uint8_t)0x02U)                        /*!< overrun interrupt flag */
258 #define SPI_INT_FLAG_CONFERR            ((uint8_t)0x03U)                        /*!< config error interrupt flag */
259 #define SPI_INT_FLAG_CRCERR             ((uint8_t)0x04U)                        /*!< CRC error interrupt flag */
260 #define I2S_INT_FLAG_TXURERR            ((uint8_t)0x05U)                        /*!< underrun error interrupt flag */
261 #define SPI_I2S_INT_FLAG_FERR           ((uint8_t)0x06U)                        /*!< format error interrupt flag */
262 
263 /* SPI/I2S flag definitions */
264 #define SPI_FLAG_RBNE                   SPI_STAT_RBNE                           /*!< receive buffer not empty flag */
265 #define SPI_FLAG_TBE                    SPI_STAT_TBE                            /*!< transmit buffer empty flag */
266 #define SPI_FLAG_CRCERR                 SPI_STAT_CRCERR                         /*!< CRC error flag */
267 #define SPI_FLAG_CONFERR                SPI_STAT_CONFERR                        /*!< mode config error flag */
268 #define SPI_FLAG_RXORERR                SPI_STAT_RXORERR                        /*!< receive overrun error flag */
269 #define SPI_FLAG_TRANS                  SPI_STAT_TRANS                          /*!< transmit on-going flag */
270 #define SPI_FLAG_FERR                   SPI_STAT_FERR                           /*!< format error flag */
271 #define I2S_FLAG_RBNE                   SPI_STAT_RBNE                           /*!< receive buffer not empty flag */
272 #define I2S_FLAG_TBE                    SPI_STAT_TBE                            /*!< transmit buffer empty flag */
273 #define I2S_FLAG_CH                     SPI_STAT_I2SCH                          /*!< channel side flag */
274 #define I2S_FLAG_TXURERR                SPI_STAT_TXURERR                        /*!< underrun error flag */
275 #define I2S_FLAG_RXORERR                SPI_STAT_RXORERR                        /*!< overrun error flag */
276 #define I2S_FLAG_TRANS                  SPI_STAT_TRANS                          /*!< transmit on-going flag */
277 #define I2S_FLAG_FERR                   SPI_STAT_FERR                           /*!< format error flag */
278 
279 /* function declarations */
280 /* SPI/I2S deinitialization and initialization functions */
281 /* reset SPI and I2S */
282 void spi_i2s_deinit(uint32_t spi_periph);
283 /* initialize the parameters of SPI struct with the default values */
284 void spi_struct_para_init(spi_parameter_struct* spi_struct);
285 /* initialize SPI parameter */
286 void spi_init(uint32_t spi_periph, spi_parameter_struct* spi_struct);
287 /* enable SPI */
288 void spi_enable(uint32_t spi_periph);
289 /* disable SPI */
290 void spi_disable(uint32_t spi_periph);
291 
292 /* initialize I2S parameter */
293 void i2s_init(uint32_t spi_periph, uint32_t i2s_mode, uint32_t i2s_standard, uint32_t i2s_ckpl);
294 /* configure I2S prescaler */
295 void i2s_psc_config(uint32_t spi_periph, uint32_t i2s_audiosample, uint32_t i2s_frameformat, uint32_t i2s_mckout);
296 /* enable I2S */
297 void i2s_enable(uint32_t spi_periph);
298 /* disable I2S */
299 void i2s_disable(uint32_t spi_periph);
300 
301 /* NSS functions */
302 /* enable SPI NSS output */
303 void spi_nss_output_enable(uint32_t spi_periph);
304 /* disable SPI NSS output */
305 void spi_nss_output_disable(uint32_t spi_periph);
306 /* SPI NSS pin high level in software mode */
307 void spi_nss_internal_high(uint32_t spi_periph);
308 /* SPI NSS pin low level in software mode */
309 void spi_nss_internal_low(uint32_t spi_periph);
310 
311 /* SPI DMA functions */
312 /* enable SPI DMA */
313 void spi_dma_enable(uint32_t spi_periph, uint8_t dma);
314 /* disable SPI DMA */
315 void spi_dma_disable(uint32_t spi_periph, uint8_t dma);
316 
317 /* SPI/I2S transfer configure functions */
318 /* configure SPI/I2S data frame format */
319 void spi_i2s_data_frame_format_config(uint32_t spi_periph, uint16_t frame_format);
320 /* SPI transmit data */
321 void spi_i2s_data_transmit(uint32_t spi_periph, uint16_t data);
322 /* SPI receive data */
323 uint16_t spi_i2s_data_receive(uint32_t spi_periph);
324 /* configure SPI bidirectional transfer direction */
325 void spi_bidirectional_transfer_config(uint32_t spi_periph, uint32_t transfer_direction);
326 
327 /* SPI CRC functions */
328 /* set SPI CRC polynomial */
329 void spi_crc_polynomial_set(uint32_t spi_periph, uint16_t crc_poly);
330 /* get SPI CRC polynomial */
331 uint16_t spi_crc_polynomial_get(uint32_t spi_periph);
332 /* turn on SPI CRC function */
333 void spi_crc_on(uint32_t spi_periph);
334 /* turn off SPI CRC function */
335 void spi_crc_off(uint32_t spi_periph);
336 /* SPI next data is CRC value */
337 void spi_crc_next(uint32_t spi_periph);
338 /* get SPI CRC send value or receive value */
339 uint16_t spi_crc_get(uint32_t spi_periph, uint8_t crc);
340 
341 /* SPI TI mode functions */
342 /* enable SPI TI mode */
343 void spi_ti_mode_enable(uint32_t spi_periph);
344 /* disable SPI TI mode */
345 void spi_ti_mode_disable(uint32_t spi_periph);
346 
347 /* SPI NSS pulse mode functions */
348 /* enable SPI NSS pulse mode */
349 void spi_nssp_mode_enable(uint32_t spi_periph);
350 /* disable SPI NSS pulse mode */
351 void spi_nssp_mode_disable(uint32_t spi_periph);
352 
353 /* configure i2s full duplex mode */
354 void i2s_full_duplex_mode_config(uint32_t i2s_add_periph,uint32_t i2s_mode,uint32_t i2s_standard,uint32_t i2s_ckpl,uint32_t i2s_frameformat);
355 
356 /* quad wire SPI functions */
357 /* enable quad wire SPI */
358 void qspi_enable(uint32_t spi_periph);
359 /* disable quad wire SPI */
360 void qspi_disable(uint32_t spi_periph);
361 /* enable quad wire SPI write */
362 void qspi_write_enable(uint32_t spi_periph);
363 /* enable quad wire SPI read */
364 void qspi_read_enable(uint32_t spi_periph);
365 /* enable quad wire SPI_IO2 and SPI_IO3 pin output */
366 void qspi_io23_output_enable(uint32_t spi_periph);
367 /* disable quad wire SPI_IO2 and SPI_IO3 pin output */
368 void qspi_io23_output_disable(uint32_t spi_periph);
369 
370 /* flag and interrupt functions */
371 /* enable SPI and I2S interrupt */
372 void spi_i2s_interrupt_enable(uint32_t spi_periph, uint8_t interrupt);
373 /* disable SPI and I2S interrupt */
374 void spi_i2s_interrupt_disable(uint32_t spi_periph, uint8_t interrupt);
375 /* get SPI and I2S interrupt status */
376 FlagStatus spi_i2s_interrupt_flag_get(uint32_t spi_periph, uint8_t interrupt);
377 /* get SPI and I2S flag status */
378 FlagStatus spi_i2s_flag_get(uint32_t spi_periph, uint32_t flag);
379 /* clear SPI CRC error flag status */
380 void spi_crc_error_clear(uint32_t spi_periph);
381 
382 #endif /* GD32E50X_SPI_H */
383