1 // Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 #ifndef _SOC_I2C_STRUCT_H_
15 #define _SOC_I2C_STRUCT_H_
16 
17 #include <stdint.h>
18 
19 #ifdef __cplusplus
20 extern "C" {
21 #endif
22 
23 typedef volatile struct i2c_dev_s {
24     union {
25         struct {
26             uint32_t period:14;             /*This register is used to configure the  low level width of SCL clock.*/
27             uint32_t reserved14:    18;
28         };
29         uint32_t val;
30     } scl_low_period;
31     union {
32         struct {
33             uint32_t sda_force_out:    1;           /*1:normally output sda data   0: exchange the function of sda_o and sda_oe (sda_o is the original internal output sda signal sda_oe is the enable bit for the internal output sda signal)*/
34             uint32_t scl_force_out:    1;           /*1:normally output scl clock  0: exchange the function of scl_o and scl_oe (scl_o is the original internal output scl signal  scl_oe is the enable bit for the internal output scl signal)*/
35             uint32_t sample_scl_level: 1;           /*Set this bit to sample data in SCL low level. clear this bit to sample data in SCL high level.*/
36             uint32_t reserved3:        1;
37             uint32_t ms_mode:          1;           /*Set this bit to configure the module as i2c master  clear this bit to configure the module as i2c slave.*/
38             uint32_t trans_start:      1;           /*Set this bit to start sending data in tx_fifo.*/
39             uint32_t tx_lsb_first:     1;           /*This bit is used to control the sending mode for  data need to be send. 1:receive data from most significant bit    0:receive data from least significant bit*/
40             uint32_t rx_lsb_first:     1;           /*This bit is used to control the storage mode for received data. 1:receive data from most significant bit    0:receive data from least significant bit*/
41             uint32_t clk_en:           1;           /*This is the clock gating control bit for reading or writing registers.*/
42             uint32_t reserved9:       23;
43         };
44         uint32_t val;
45     } ctr;
46     union {
47         struct {
48             uint32_t ack_rec:             1;        /*This register stores the value of ACK bit.*/
49             uint32_t slave_rw:            1;        /*when in slave mode  1:master read slave  0: master write slave.*/
50             uint32_t time_out:            1;        /*when I2C takes more than time_out_reg clocks to receive a data then this register changes to high level.*/
51             uint32_t arb_lost:            1;        /*when I2C lost control of SDA line  this register changes to high level.*/
52             uint32_t bus_busy:            1;        /*1:I2C bus is busy transferring data. 0:I2C bus is in idle state.*/
53             uint32_t slave_addressed:     1;        /*when configured as i2c slave  and the address send by master is equal to slave's address  then this bit will be high level.*/
54             uint32_t byte_trans:          1;        /*This register changes to high level when one byte is transferred.*/
55             uint32_t reserved7:           1;
56             uint32_t rx_fifo_cnt:         6;        /*This register represent the amount of data need to send.*/
57             uint32_t reserved14:          4;
58             uint32_t tx_fifo_cnt:         6;        /*This register stores the amount of received data  in ram.*/
59             uint32_t scl_main_state_last: 3;        /*This register stores the value of state machine for i2c module.  3'h0: SCL_MAIN_IDLE  3'h1: SCL_ADDRESS_SHIFT 3'h2: SCL_ACK_ADDRESS  3'h3: SCL_RX_DATA  3'h4 SCL_TX_DATA  3'h5:SCL_SEND_ACK 3'h6:SCL_WAIT_ACK*/
60             uint32_t reserved27:          1;
61             uint32_t scl_state_last:      3;        /*This register stores the value of state machine to produce SCL. 3'h0: SCL_IDLE  3'h1:SCL_START   3'h2:SCL_LOW_EDGE  3'h3: SCL_LOW   3'h4:SCL_HIGH_EDGE   3'h5:SCL_HIGH  3'h6:SCL_STOP*/
62             uint32_t reserved31:          1;
63         };
64         uint32_t val;
65     } status_reg;
66     union {
67         struct {
68             uint32_t tout:      20;                 /*This register is used to configure the max clock number of receiving a data, unit: APB clock cycle.*/
69             uint32_t reserved20:12;
70         };
71         uint32_t val;
72     } timeout;
73     union {
74         struct {
75             uint32_t addr:       15;                /*when configured as i2c slave  this register is used to configure slave's address.*/
76             uint32_t reserved15: 16;
77             uint32_t en_10bit:    1;                /*This register is used to enable slave 10bit address mode.*/
78         };
79         uint32_t val;
80     } slave_addr;
81     union {
82         struct {
83             uint32_t rx_fifo_start_addr: 5;         /*This is the offset address of the last receiving data as described in nonfifo_rx_thres_register.*/
84             uint32_t rx_fifo_end_addr:   5;         /*This is the offset address of the first receiving data as described in nonfifo_rx_thres_register.*/
85             uint32_t tx_fifo_start_addr: 5;         /*This is the offset address of the first  sending data as described in nonfifo_tx_thres register.*/
86             uint32_t tx_fifo_end_addr:   5;         /*This is the offset address of the last  sending data as described in nonfifo_tx_thres register.*/
87             uint32_t reserved20:        12;
88         };
89         uint32_t val;
90     } fifo_st;
91     union {
92         struct {
93             uint32_t rx_fifo_full_thrhd: 5;
94             uint32_t tx_fifo_empty_thrhd:5;         /*Config tx_fifo empty threhd value when using apb fifo access*/
95             uint32_t nonfifo_en:         1;         /*Set this bit to enble apb nonfifo access.*/
96             uint32_t fifo_addr_cfg_en:   1;         /*When this bit is set to 1 then the byte after address represent the offset address of I2C Slave's ram.*/
97             uint32_t rx_fifo_rst:        1;         /*Set this bit to reset rx fifo when using apb fifo access.*/
98             uint32_t tx_fifo_rst:        1;         /*Set this bit to reset tx fifo when using apb fifo access.*/
99             uint32_t nonfifo_rx_thres:   6;         /*when I2C receives more than nonfifo_rx_thres data  it will produce rx_send_full_int_raw interrupt and update the current offset address of the receiving data.*/
100             uint32_t nonfifo_tx_thres:   6;         /*when I2C sends more than nonfifo_tx_thres data  it will produce tx_send_empty_int_raw interrupt and update the current offset address of the sending data.*/
101             uint32_t reserved26:         6;
102         };
103         uint32_t val;
104     } fifo_conf;
105     union {
106         struct {
107             uint32_t data:              8;          /*The register represent the byte  data read from rx_fifo when use apb fifo access*/
108             uint32_t reserved:          24;
109         };
110         uint32_t val;
111     } fifo_data;
112     union {
113         struct {
114             uint32_t rx_fifo_full:     1;           /*The raw interrupt status bit for rx_fifo full when use apb fifo access.*/
115             uint32_t tx_fifo_empty:    1;           /*The raw interrupt status bit for tx_fifo empty when use apb fifo access.*/
116             uint32_t rx_fifo_ovf:      1;           /*The raw interrupt status bit for receiving data overflow when use apb fifo access.*/
117             uint32_t end_detect:       1;           /*The raw interrupt status bit for end_detect_int interrupt. when I2C deals with  the END command  it will produce end_detect_int interrupt.*/
118             uint32_t slave_tran_comp:  1;           /*The raw interrupt status bit for slave_tran_comp_int interrupt. when I2C Slave detects the STOP bit  it will produce slave_tran_comp_int interrupt.*/
119             uint32_t arbitration_lost: 1;           /*The raw interrupt status bit for arbitration_lost_int interrupt.when I2C lost the usage right of I2C BUS it will produce arbitration_lost_int interrupt.*/
120             uint32_t master_tran_comp: 1;           /*The raw interrupt status bit for master_tra_comp_int interrupt. when I2C Master sends or receives a byte it will produce master_tran_comp_int interrupt.*/
121             uint32_t trans_complete:   1;           /*The raw interrupt status bit for trans_complete_int interrupt. when I2C Master finished STOP command  it will produce trans_complete_int interrupt.*/
122             uint32_t time_out:         1;           /*The raw interrupt status bit for time_out_int interrupt. when I2C takes a lot of time to receive a data  it will produce  time_out_int interrupt.*/
123             uint32_t trans_start:      1;           /*The raw interrupt status bit for trans_start_int interrupt. when I2C sends the START bit it will produce trans_start_int interrupt.*/
124             uint32_t ack_err:          1;           /*The raw interrupt status bit for ack_err_int interrupt. when I2C receives a wrong ACK bit  it will produce ack_err_int interrupt..*/
125             uint32_t rx_rec_full:      1;           /*The raw interrupt status bit for rx_rec_full_int interrupt. when I2C receives more data  than nonfifo_rx_thres  it will produce rx_rec_full_int interrupt.*/
126             uint32_t tx_send_empty:    1;           /*The raw interrupt status bit for tx_send_empty_int interrupt.when I2C sends more data than nonfifo_tx_thres  it will produce tx_send_empty_int interrupt..*/
127             uint32_t reserved13:      19;
128         };
129         uint32_t val;
130     } int_raw;
131     union {
132         struct {
133             uint32_t rx_fifo_full:     1;           /*Set this bit to clear the rx_fifo_full_int interrupt.*/
134             uint32_t tx_fifo_empty:    1;           /*Set this bit to clear the tx_fifo_empty_int interrupt.*/
135             uint32_t rx_fifo_ovf:      1;           /*Set this bit to clear the rx_fifo_ovf_int interrupt.*/
136             uint32_t end_detect:       1;           /*Set this bit to clear the end_detect_int interrupt.*/
137             uint32_t slave_tran_comp:  1;           /*Set this bit to clear the slave_tran_comp_int interrupt.*/
138             uint32_t arbitration_lost: 1;           /*Set this bit to clear the arbitration_lost_int interrupt.*/
139             uint32_t master_tran_comp: 1;           /*Set this bit to clear the master_tran_comp interrupt.*/
140             uint32_t trans_complete:   1;           /*Set this bit to clear the trans_complete_int interrupt.*/
141             uint32_t time_out:         1;           /*Set this bit to clear the time_out_int interrupt.*/
142             uint32_t trans_start:      1;           /*Set this bit to clear the trans_start_int interrupt.*/
143             uint32_t ack_err:          1;           /*Set this bit to clear the ack_err_int interrupt.*/
144             uint32_t rx_rec_full:      1;           /*Set this bit to clear the rx_rec_full_int interrupt.*/
145             uint32_t tx_send_empty:    1;           /*Set this bit to clear the tx_send_empty_int interrupt.*/
146             uint32_t reserved13:      19;
147         };
148         uint32_t val;
149     } int_clr;
150     union {
151         struct {
152             uint32_t rx_fifo_full:     1;           /*The enable bit for rx_fifo_full_int interrupt.*/
153             uint32_t tx_fifo_empty:    1;           /*The enable bit for tx_fifo_empty_int interrupt.*/
154             uint32_t rx_fifo_ovf:      1;           /*The enable bit for rx_fifo_ovf_int interrupt.*/
155             uint32_t end_detect:       1;           /*The enable bit for end_detect_int interrupt.*/
156             uint32_t slave_tran_comp:  1;           /*The enable bit for slave_tran_comp_int interrupt.*/
157             uint32_t arbitration_lost: 1;           /*The enable bit for arbitration_lost_int interrupt.*/
158             uint32_t master_tran_comp: 1;           /*The enable bit for master_tran_comp_int interrupt.*/
159             uint32_t trans_complete:   1;           /*The enable bit for trans_complete_int interrupt.*/
160             uint32_t time_out:         1;           /*The enable bit for time_out_int interrupt.*/
161             uint32_t trans_start:      1;           /*The enable bit for trans_start_int interrupt.*/
162             uint32_t ack_err:          1;           /*The enable bit for ack_err_int interrupt.*/
163             uint32_t rx_rec_full:      1;           /*The enable bit for rx_rec_full_int interrupt.*/
164             uint32_t tx_send_empty:    1;           /*The enable bit for tx_send_empty_int interrupt.*/
165             uint32_t reserved13:      19;
166         };
167         uint32_t val;
168     } int_ena;
169     union {
170         struct {
171             uint32_t rx_fifo_full:     1;            /*The masked interrupt status for rx_fifo_full_int interrupt.*/
172             uint32_t tx_fifo_empty:    1;            /*The masked interrupt status for tx_fifo_empty_int interrupt.*/
173             uint32_t rx_fifo_ovf:      1;            /*The masked interrupt status for rx_fifo_ovf_int interrupt.*/
174             uint32_t end_detect:       1;            /*The masked interrupt status for end_detect_int interrupt.*/
175             uint32_t slave_tran_comp:  1;            /*The masked interrupt status for slave_tran_comp_int interrupt.*/
176             uint32_t arbitration_lost: 1;            /*The masked interrupt status for arbitration_lost_int interrupt.*/
177             uint32_t master_tran_comp: 1;            /*The masked interrupt status for master_tran_comp_int interrupt.*/
178             uint32_t trans_complete:   1;            /*The masked interrupt status for trans_complete_int interrupt.*/
179             uint32_t time_out:         1;            /*The masked interrupt status for time_out_int interrupt.*/
180             uint32_t trans_start:      1;            /*The masked interrupt status for trans_start_int interrupt.*/
181             uint32_t ack_err:          1;            /*The masked interrupt status for ack_err_int interrupt.*/
182             uint32_t rx_rec_full:      1;            /*The masked interrupt status for rx_rec_full_int interrupt.*/
183             uint32_t tx_send_empty:    1;            /*The masked interrupt status for tx_send_empty_int interrupt.*/
184             uint32_t reserved13:      19;
185         };
186         uint32_t val;
187     } int_status;
188     union {
189         struct {
190             uint32_t time:        10;                /*This register is used to configure the clock num I2C used to hold the data after the negedge of SCL.*/
191             uint32_t reserved10:  22;
192         };
193         uint32_t val;
194     } sda_hold;
195     union {
196         struct {
197             uint32_t time:       10;                 /*This register is used to configure the clock num I2C used to sample data on SDA after the posedge of SCL*/
198             uint32_t reserved10: 22;
199         };
200         uint32_t val;
201     } sda_sample;
202     union {
203         struct {
204             uint32_t period:     14;                 /*This register is used to configure the clock num during SCL is low level.*/
205             uint32_t reserved14: 18;
206         };
207         uint32_t val;
208     } scl_high_period;
209     uint32_t reserved_3c;
210     union {
211         struct {
212             uint32_t time:       10;                /*This register is used to configure the clock num between the negedge of SDA and negedge of SCL for start mark.*/
213             uint32_t reserved10: 22;
214         };
215         uint32_t val;
216     } scl_start_hold;
217     union {
218         struct {
219             uint32_t time:       10;                /*This register is used to configure the clock num between the posedge of SCL and the negedge of SDA for restart mark.*/
220             uint32_t reserved10: 22;
221         };
222         uint32_t val;
223     } scl_rstart_setup;
224     union {
225         struct {
226             uint32_t time:       14;                /*This register is used to configure the clock num after the STOP bit's posedge.*/
227             uint32_t reserved14: 18;
228         };
229         uint32_t val;
230     } scl_stop_hold;
231     union {
232         struct {
233             uint32_t time:       10;                /*This register is used to configure the clock num between the posedge of SCL and the posedge of SDA.*/
234             uint32_t reserved10: 22;
235         };
236         uint32_t val;
237     } scl_stop_setup;
238     union {
239         struct {
240             uint32_t thres:      3;                 /*When input SCL's pulse width is smaller than this register value  I2C ignores this pulse.*/
241             uint32_t en:         1;                 /*This is the filter enable bit for SCL.*/
242             uint32_t reserved4: 28;
243         };
244         uint32_t val;
245     } scl_filter_cfg;
246     union {
247         struct {
248             uint32_t thres:      3;                 /*When input SCL's pulse width is smaller than this register value  I2C ignores this pulse.*/
249             uint32_t en:         1;                 /*This is the filter enable bit for SDA.*/
250             uint32_t reserved4: 28;
251         };
252         uint32_t val;
253     } sda_filter_cfg;
254     union {
255         struct {
256             uint32_t byte_num:      8;              /*Byte_num represent the number of data need to be send or data need to be received.*/
257             uint32_t ack_en:        1;              /*ack_check_en  ack_exp and ack value are used to control  the ack bit.*/
258             uint32_t ack_exp:       1;              /*ack_check_en  ack_exp and ack value are used to control  the ack bit.*/
259             uint32_t ack_val:       1;              /*ack_check_en  ack_exp and ack value are used to control  the ack bit.*/
260             uint32_t op_code:       3;              /*op_code is the command  0:RSTART   1:WRITE  2:READ  3:STOP . 4:END.*/
261             uint32_t reserved14:   17;
262             uint32_t done:  1;                      /*When command0 is done in I2C Master mode  this bit changes to high level.*/
263         };
264         uint32_t val;
265     } command[16];
266     uint32_t reserved_98;
267     uint32_t reserved_9c;
268     uint32_t reserved_a0;
269     uint32_t reserved_a4;
270     uint32_t reserved_a8;
271     uint32_t reserved_ac;
272     uint32_t reserved_b0;
273     uint32_t reserved_b4;
274     uint32_t reserved_b8;
275     uint32_t reserved_bc;
276     uint32_t reserved_c0;
277     uint32_t reserved_c4;
278     uint32_t reserved_c8;
279     uint32_t reserved_cc;
280     uint32_t reserved_d0;
281     uint32_t reserved_d4;
282     uint32_t reserved_d8;
283     uint32_t reserved_dc;
284     uint32_t reserved_e0;
285     uint32_t reserved_e4;
286     uint32_t reserved_e8;
287     uint32_t reserved_ec;
288     uint32_t reserved_f0;
289     uint32_t reserved_f4;
290     uint32_t date;                                  /**/
291     uint32_t reserved_fc;
292     uint32_t ram_data[32];                          /*This the start address for ram when use apb nonfifo access.*/
293 } i2c_dev_t;
294 extern i2c_dev_t I2C0;
295 extern i2c_dev_t I2C1;
296 
297 #ifdef __cplusplus
298 }
299 #endif
300 
301 #endif  /* _SOC_I2C_STRUCT_H_ */
302