| 95ce2328  李外
 
完成USB移植,测试正常, | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 |   /*!
      \file    gd32f30x_i2c.h
      \brief   definitions for the I2C
  
      \version 2017-02-10, V1.0.0, firmware for GD32F30x
      \version 2018-10-10, V1.1.0, firmware for GD32F30x
      \version 2018-12-25, V2.0.0, firmware for GD32F30x
      \version 2019-04-16, V2.0.1, firmware for GD32F30x
      \version 2020-09-30, V2.1.0, firmware for GD32F30x
  */
  
  /*
      Copyright (c) 2020, GigaDevice Semiconductor Inc.
  
      Redistribution and use in source and binary forms, with or without modification, 
  are permitted provided that the following conditions are met:
  
      1. Redistributions of source code must retain the above copyright notice, this 
         list of conditions and the following disclaimer.
      2. Redistributions in binary form must reproduce the above copyright notice, 
         this list of conditions and the following disclaimer in the documentation 
         and/or other materials provided with the distribution.
      3. Neither the name of the copyright holder nor the names of its contributors 
         may be used to endorse or promote products derived from this software without 
         specific prior written permission.
  
      THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 
  OF SUCH DAMAGE.
  */
  
  #ifndef GD32F30X_I2C_H
  #define GD32F30X_I2C_H
  
  #include "gd32f30x.h"
  
  /* I2Cx(x=0,1) definitions */
 | 
| 95ce2328  李外
 
完成USB移植,测试正常, | 59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220 |   
  /* bits definitions */
  /* I2Cx_CTL0 */
  #define I2C_CTL0_I2CEN                BIT(0)        /*!< peripheral enable */
  #define I2C_CTL0_SMBEN                BIT(1)        /*!< SMBus mode */
  #define I2C_CTL0_SMBSEL               BIT(3)        /*!< SMBus type */
  #define I2C_CTL0_ARPEN                BIT(4)        /*!< ARP enable */
  #define I2C_CTL0_PECEN                BIT(5)        /*!< PEC enable */
  #define I2C_CTL0_GCEN                 BIT(6)        /*!< general call enable */
  #define I2C_CTL0_SS                   BIT(7)        /*!< clock stretching disable (slave mode) */
  #define I2C_CTL0_START                BIT(8)        /*!< start generation */
  #define I2C_CTL0_STOP                 BIT(9)        /*!< stop generation */
  #define I2C_CTL0_ACKEN                BIT(10)       /*!< acknowledge enable */
  #define I2C_CTL0_POAP                 BIT(11)       /*!< acknowledge/PEC position (for data reception) */
  #define I2C_CTL0_PECTRANS             BIT(12)       /*!< packet error checking */
  #define I2C_CTL0_SALT                 BIT(13)       /*!< SMBus alert */
  #define I2C_CTL0_SRESET               BIT(15)       /*!< software reset */
  
  /* I2Cx_CTL1 */
  #define I2C_CTL1_I2CCLK               BITS(0,6)     /*!< I2CCLK[6:0] bits (peripheral clock frequency) */
  #define I2C_CTL1_ERRIE                BIT(8)        /*!< error interrupt inable */
  #define I2C_CTL1_EVIE                 BIT(9)        /*!< event interrupt enable */
  #define I2C_CTL1_BUFIE                BIT(10)       /*!< buffer interrupt enable */
  #define I2C_CTL1_DMAON                BIT(11)       /*!< DMA requests enable */
  #define I2C_CTL1_DMALST               BIT(12)       /*!< DMA last transfer */
  
  /* I2Cx_SADDR0 */
  #define I2C_SADDR0_ADDRESS0           BIT(0)        /*!< bit 0 of a 10-bit address */
  #define I2C_SADDR0_ADDRESS            BITS(1,7)     /*!< 7-bit address or bits 7:1 of a 10-bit address */
  #define I2C_SADDR0_ADDRESS_H          BITS(8,9)     /*!< highest two bits of a 10-bit address */
  #define I2C_SADDR0_ADDFORMAT          BIT(15)       /*!< address mode for the I2C slave */
  
  /* I2Cx_SADDR1 */
  #define I2C_SADDR1_DUADEN             BIT(0)        /*!< aual-address mode switch */
  #define I2C_SADDR1_ADDRESS2           BITS(1,7)     /*!< second I2C address for the slave in dual-address mode */
  
  /* I2Cx_DATA */
  #define I2C_DATA_TRB                  BITS(0,7)     /*!< 8-bit data register */
  
  /* I2Cx_STAT0 */
  #define I2C_STAT0_SBSEND              BIT(0)        /*!< start bit (master mode) */
  #define I2C_STAT0_ADDSEND             BIT(1)        /*!< address sent (master mode)/matched (slave mode) */
  #define I2C_STAT0_BTC                 BIT(2)        /*!< byte transfer finished */
  #define I2C_STAT0_ADD10SEND           BIT(3)        /*!< 10-bit header sent (master mode) */
  #define I2C_STAT0_STPDET              BIT(4)        /*!< stop detection (slave mode) */
  #define I2C_STAT0_RBNE                BIT(6)        /*!< data register not empty (receivers) */
  #define I2C_STAT0_TBE                 BIT(7)        /*!< data register empty (transmitters) */
  #define I2C_STAT0_BERR                BIT(8)        /*!< bus error */
  #define I2C_STAT0_LOSTARB             BIT(9)        /*!< arbitration lost (master mode) */
  #define I2C_STAT0_AERR                BIT(10)       /*!< acknowledge failure */
  #define I2C_STAT0_OUERR               BIT(11)       /*!< overrun/underrun */
  #define I2C_STAT0_PECERR              BIT(12)       /*!< PEC error in reception */
  #define I2C_STAT0_SMBTO               BIT(14)       /*!< timeout signal in SMBus mode */
  #define I2C_STAT0_SMBALT              BIT(15)       /*!< SMBus alert status */
  
  /* I2Cx_STAT1 */
  #define I2C_STAT1_MASTER              BIT(0)        /*!< master/slave */
  #define I2C_STAT1_I2CBSY              BIT(1)        /*!< bus busy */
  #define I2C_STAT1_TR                  BIT(2)        /*!< transmitter/receiver */
  #define I2C_STAT1_RXGC                BIT(4)        /*!< general call address (slave mode) */
  #define I2C_STAT1_DEFSMB              BIT(5)        /*!< SMBus device default address (slave mode) */
  #define I2C_STAT1_HSTSMB              BIT(6)        /*!< SMBus host header (slave mode) */
  #define I2C_STAT1_DUMODF              BIT(7)        /*!< dual flag (slave mode) */
  #define I2C_STAT1_PECV                BITS(8,15)    /*!< packet error checking value */
  
  /* I2Cx_CKCFG */
  #define I2C_CKCFG_CLKC                BITS(0,11)    /*!< clock control register in fast/standard mode or fast mode plus(master mode) */
  #define I2C_CKCFG_DTCY                BIT(14)       /*!< duty cycle of fast mode or fast mode plus */
  #define I2C_CKCFG_FAST                BIT(15)       /*!< I2C speed selection in master mode */
  
  /* I2Cx_RT */
  #define I2C_RT_RISETIME               BITS(0,6)     /*!< maximum rise time in fast/standard mode or fast mode plus(master mode) */
  
  /* I2Cx_FMPCFG */
  #define I2C_FMPCFG_FMPEN              BIT(0)        /*!< fast mode plus enable bit */
  
  /* constants definitions */
  /* define the I2C bit position and its register index offset */
  #define I2C_REGIDX_BIT(regidx, bitpos)  (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos))
  #define I2C_REG_VAL(i2cx, offset)       (REG32((i2cx) + (((uint32_t)(offset) & 0xFFFFU) >> 6)))
  #define I2C_BIT_POS(val)                ((uint32_t)(val) & 0x1FU)
  #define I2C_REGIDX_BIT2(regidx, bitpos, regidx2, bitpos2)   (((uint32_t)(regidx2) << 22) | (uint32_t)((bitpos2) << 16)\
                                                                | (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos)))
  #define I2C_REG_VAL2(i2cx, offset)      (REG32((i2cx) + ((uint32_t)(offset) >> 22)))
  #define I2C_BIT_POS2(val)               (((uint32_t)(val) & 0x1F0000U) >> 16)
  
  /* register offset */
  #define I2C_CTL1_REG_OFFSET           0x04U         /*!< CTL1 register offset */
  #define I2C_STAT0_REG_OFFSET          0x14U         /*!< STAT0 register offset */
  #define I2C_STAT1_REG_OFFSET          0x18U         /*!< STAT1 register offset */
  
  /* I2C flags */
  typedef enum
  {
      /* flags in STAT0 register */
      I2C_FLAG_SBSEND = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 0U),                /*!< start condition sent out in master mode */
      I2C_FLAG_ADDSEND = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 1U),               /*!< address is sent in master mode or received and matches in slave mode */
      I2C_FLAG_BTC = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 2U),                   /*!< byte transmission finishes */
      I2C_FLAG_ADD10SEND = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 3U),             /*!< header of 10-bit address is sent in master mode */
      I2C_FLAG_STPDET = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 4U),                /*!< stop condition detected in slave mode */
      I2C_FLAG_RBNE = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 6U),                  /*!< I2C_DATA is not Empty during receiving */
      I2C_FLAG_TBE = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 7U),                   /*!< I2C_DATA is empty during transmitting */
      I2C_FLAG_BERR = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 8U),                  /*!< a bus error occurs indication a unexpected start or stop condition on I2C bus */
      I2C_FLAG_LOSTARB = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 9U),               /*!< arbitration lost in master mode */
      I2C_FLAG_AERR = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 10U),                 /*!< acknowledge error */
      I2C_FLAG_OUERR = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 11U),                /*!< over-run or under-run situation occurs in slave mode */
      I2C_FLAG_PECERR = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 12U),               /*!< PEC error when receiving data */
      I2C_FLAG_SMBTO = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 14U),                /*!< timeout signal in SMBus mode */
      I2C_FLAG_SMBALT = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 15U),               /*!< SMBus alert status */
      /* flags in STAT1 register */
      I2C_FLAG_MASTER = I2C_REGIDX_BIT(I2C_STAT1_REG_OFFSET, 0U),                /*!< a flag indicating whether I2C block is in master or slave mode */
      I2C_FLAG_I2CBSY = I2C_REGIDX_BIT(I2C_STAT1_REG_OFFSET, 1U),                /*!< busy flag */
      I2C_FLAG_TRS = I2C_REGIDX_BIT(I2C_STAT1_REG_OFFSET, 2U),                   /*!< whether the I2C is a transmitter or a receiver */
      I2C_FLAG_RXGC = I2C_REGIDX_BIT(I2C_STAT1_REG_OFFSET, 4U),                  /*!< general call address (00h) received */
      I2C_FLAG_DEFSMB = I2C_REGIDX_BIT(I2C_STAT1_REG_OFFSET, 5U),                /*!< default address of SMBus device */
      I2C_FLAG_HSTSMB = I2C_REGIDX_BIT(I2C_STAT1_REG_OFFSET, 6U),                /*!< SMBus host header detected in slave mode */
      I2C_FLAG_DUMOD = I2C_REGIDX_BIT(I2C_STAT1_REG_OFFSET, 7U)                  /*!< dual flag in slave mode indicating which address is matched in dual-address mode */
  }i2c_flag_enum;
  
  /* I2C interrupt flags */
  typedef enum
  {
      /* interrupt flags in CTL1 register */
      I2C_INT_FLAG_SBSEND = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 9U, I2C_STAT0_REG_OFFSET, 0U),        /*!< start condition sent out in master mode interrupt flag */
      I2C_INT_FLAG_ADDSEND = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 9U, I2C_STAT0_REG_OFFSET, 1U),       /*!< address is sent in master mode or received and matches in slave mode interrupt flag */
      I2C_INT_FLAG_BTC =  I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 9U, I2C_STAT0_REG_OFFSET, 2U),          /*!< byte transmission finishes */
      I2C_INT_FLAG_ADD10SEND =  I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 9U, I2C_STAT0_REG_OFFSET, 3U),    /*!< header of 10-bit address is sent in master mode interrupt flag */
      I2C_INT_FLAG_STPDET = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 9U, I2C_STAT0_REG_OFFSET, 4U),        /*!< stop condition detected in slave mode interrupt flag */
      I2C_INT_FLAG_RBNE = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 9U, I2C_STAT0_REG_OFFSET, 6U),          /*!< I2C_DATA is not Empty during receiving interrupt flag */
      I2C_INT_FLAG_TBE = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 9U, I2C_STAT0_REG_OFFSET, 7U),           /*!< I2C_DATA is empty during transmitting interrupt flag */    
      I2C_INT_FLAG_BERR = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 8U, I2C_STAT0_REG_OFFSET, 8U),          /*!< a bus error occurs indication a unexpected start or stop condition on I2C bus interrupt flag */
      I2C_INT_FLAG_LOSTARB = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 8U, I2C_STAT0_REG_OFFSET, 9U),       /*!< arbitration lost in master mode interrupt flag */
      I2C_INT_FLAG_AERR = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 8U, I2C_STAT0_REG_OFFSET, 10U),         /*!< acknowledge error interrupt flag */
      I2C_INT_FLAG_OUERR = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 8U, I2C_STAT0_REG_OFFSET, 11U),        /*!< over-run or under-run situation occurs in slave mode interrupt flag */
      I2C_INT_FLAG_PECERR = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 8U, I2C_STAT0_REG_OFFSET, 12U),       /*!< PEC error when receiving data interrupt flag */
      I2C_INT_FLAG_SMBTO = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 8U, I2C_STAT0_REG_OFFSET, 14U),        /*!< timeout signal in SMBus mode interrupt flag */
      I2C_INT_FLAG_SMBALT = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 8U, I2C_STAT0_REG_OFFSET, 15U),       /*!< SMBus Alert status interrupt flag */
  }i2c_interrupt_flag_enum;
  
  /* I2C interrupt enable or disable */
  typedef enum
  {
      /* interrupt in CTL1 register */
      I2C_INT_ERR = I2C_REGIDX_BIT(I2C_CTL1_REG_OFFSET, 8U),                     /*!< error interrupt enable */
      I2C_INT_EV = I2C_REGIDX_BIT(I2C_CTL1_REG_OFFSET, 9U),                      /*!< event interrupt enable */
      I2C_INT_BUF = I2C_REGIDX_BIT(I2C_CTL1_REG_OFFSET, 10U),                    /*!< buffer interrupt enable */
  }i2c_interrupt_enum;
  
  /* SMBus/I2C mode switch and SMBus type selection */
  #define I2C_I2CMODE_ENABLE            ((uint32_t)0x00000000U)                  /*!< I2C mode */
  #define I2C_SMBUSMODE_ENABLE          I2C_CTL0_SMBEN                           /*!< SMBus mode */
  
  /* SMBus/I2C mode switch and SMBus type selection */
  #define I2C_SMBUS_DEVICE              ((uint32_t)0x00000000U)                  /*!< SMBus mode device type */
  #define I2C_SMBUS_HOST                I2C_CTL0_SMBSEL                          /*!< SMBus mode host type */
  
  /* I2C transfer direction */
  #define I2C_RECEIVER                  ((uint32_t)0x00000001U)                  /*!< receiver */
  #define I2C_TRANSMITTER               ((uint32_t)0xFFFFFFFEU)                  /*!< transmitter */
  
  /* whether or not to send an ACK */
  #define I2C_ACK_DISABLE               ((uint32_t)0x00000000U)                  /*!< ACK will be not sent */
 |