stm32_rust_template/mcu/stm32f407/
i2c.rs1use super::{I2C1_BASEADDR, I2C2_BASEADDR, I2C3_BASEADDR, PeripheralAccess};
5
6#[repr(C)]
8pub struct RegisterBlock {
9 pub cr1: u32, pub cr2: u32, pub oar1: u32, pub oar2: u32, pub dr: u32, pub sr1: u32, pub sr2: u32, pub ccr: u32, pub trise: u32, pub fltr: u32, }
20
21pub struct I2C1;
23pub struct I2C2;
24pub struct I2C3;
25
26impl PeripheralAccess for I2C1 {
27 const BASE_ADDRESS: u32 = I2C1_BASEADDR;
28 type RegisterBlock = RegisterBlock;
29}
30
31impl PeripheralAccess for I2C2 {
32 const BASE_ADDRESS: u32 = I2C2_BASEADDR;
33 type RegisterBlock = RegisterBlock;
34}
35
36impl PeripheralAccess for I2C3 {
37 const BASE_ADDRESS: u32 = I2C3_BASEADDR;
38 type RegisterBlock = RegisterBlock;
39}
40
41pub const CR1_SWRST_POS: u32 = 15;
45pub const CR1_SWRST_WIDTH: u32 = 1;
46pub const CR1_SWRST_MASK: u32 = 0x1 << 15;
47pub const CR1_SWRST_NOTRESET: u32 = 0 << 15;
49pub const CR1_SWRST_RESET: u32 = 1 << 15;
50
51pub const CR1_ALERT_POS: u32 = 13;
52pub const CR1_ALERT_WIDTH: u32 = 1;
53pub const CR1_ALERT_MASK: u32 = 0x1 << 13;
54pub const CR1_ALERT_RELEASE: u32 = 0 << 13;
56pub const CR1_ALERT_DRIVE: u32 = 1 << 13;
57
58pub const CR1_PEC_POS: u32 = 12;
59pub const CR1_PEC_WIDTH: u32 = 1;
60pub const CR1_PEC_MASK: u32 = 0x1 << 12;
61pub const CR1_PEC_DISABLED: u32 = 0 << 12;
63pub const CR1_PEC_ENABLED: u32 = 1 << 12;
64
65pub const CR1_POS_POS: u32 = 11;
66pub const CR1_POS_WIDTH: u32 = 1;
67pub const CR1_POS_MASK: u32 = 0x1 << 11;
68pub const CR1_POS_CURRENT: u32 = 0 << 11;
70pub const CR1_POS_NEXT: u32 = 1 << 11;
71
72pub const CR1_ACK_POS: u32 = 10;
73pub const CR1_ACK_WIDTH: u32 = 1;
74pub const CR1_ACK_MASK: u32 = 0x1 << 10;
75pub const CR1_ACK_NAK: u32 = 0 << 10;
77pub const CR1_ACK_ACK: u32 = 1 << 10;
78
79pub const CR1_STOP_POS: u32 = 9;
80pub const CR1_STOP_WIDTH: u32 = 1;
81pub const CR1_STOP_MASK: u32 = 0x1 << 9;
82pub const CR1_STOP_NOSTOP: u32 = 0 << 9;
84pub const CR1_STOP_STOP: u32 = 1 << 9;
85
86pub const CR1_START_POS: u32 = 8;
87pub const CR1_START_WIDTH: u32 = 1;
88pub const CR1_START_MASK: u32 = 0x1 << 8;
89pub const CR1_START_NOSTART: u32 = 0 << 8;
91pub const CR1_START_START: u32 = 1 << 8;
92
93pub const CR1_NOSTRETCH_POS: u32 = 7;
94pub const CR1_NOSTRETCH_WIDTH: u32 = 1;
95pub const CR1_NOSTRETCH_MASK: u32 = 0x1 << 7;
96pub const CR1_NOSTRETCH_ENABLED: u32 = 0 << 7;
98pub const CR1_NOSTRETCH_DISABLED: u32 = 1 << 7;
99
100pub const CR1_ENGC_POS: u32 = 6;
101pub const CR1_ENGC_WIDTH: u32 = 1;
102pub const CR1_ENGC_MASK: u32 = 0x1 << 6;
103pub const CR1_ENGC_DISABLED: u32 = 0 << 6;
105pub const CR1_ENGC_ENABLED: u32 = 1 << 6;
106
107pub const CR1_ENPEC_POS: u32 = 5;
108pub const CR1_ENPEC_WIDTH: u32 = 1;
109pub const CR1_ENPEC_MASK: u32 = 0x1 << 5;
110pub const CR1_ENPEC_DISABLED: u32 = 0 << 5;
112pub const CR1_ENPEC_ENABLED: u32 = 1 << 5;
113
114pub const CR1_ENARP_POS: u32 = 4;
115pub const CR1_ENARP_WIDTH: u32 = 1;
116pub const CR1_ENARP_MASK: u32 = 0x1 << 4;
117pub const CR1_ENARP_DISABLED: u32 = 0 << 4;
119pub const CR1_ENARP_ENABLED: u32 = 1 << 4;
120
121pub const CR1_SMBTYPE_POS: u32 = 3;
122pub const CR1_SMBTYPE_WIDTH: u32 = 1;
123pub const CR1_SMBTYPE_MASK: u32 = 0x1 << 3;
124pub const CR1_SMBTYPE_DEVICE: u32 = 0 << 3;
126pub const CR1_SMBTYPE_HOST: u32 = 1 << 3;
127
128pub const CR1_SMBUS_POS: u32 = 1;
129pub const CR1_SMBUS_WIDTH: u32 = 1;
130pub const CR1_SMBUS_MASK: u32 = 0x1 << 1;
131pub const CR1_SMBUS_I2C: u32 = 0 << 1;
133pub const CR1_SMBUS_SMBUS: u32 = 1 << 1;
134
135pub const CR1_PE_POS: u32 = 0;
136pub const CR1_PE_WIDTH: u32 = 1;
137pub const CR1_PE_MASK: u32 = 0x1 << 0;
138pub const CR1_PE_DISABLED: u32 = 0 << 0;
140pub const CR1_PE_ENABLED: u32 = 1 << 0;
141
142pub const CR2_LAST_POS: u32 = 12;
144pub const CR2_LAST_WIDTH: u32 = 1;
145pub const CR2_LAST_MASK: u32 = 0x1 << 12;
146pub const CR2_LAST_NOTLAST: u32 = 0 << 12;
148pub const CR2_LAST_LAST: u32 = 1 << 12;
149
150pub const CR2_DMAEN_POS: u32 = 11;
151pub const CR2_DMAEN_WIDTH: u32 = 1;
152pub const CR2_DMAEN_MASK: u32 = 0x1 << 11;
153pub const CR2_DMAEN_DISABLED: u32 = 0 << 11;
155pub const CR2_DMAEN_ENABLED: u32 = 1 << 11;
156
157pub const CR2_ITBUFEN_POS: u32 = 10;
158pub const CR2_ITBUFEN_WIDTH: u32 = 1;
159pub const CR2_ITBUFEN_MASK: u32 = 0x1 << 10;
160pub const CR2_ITBUFEN_DISABLED: u32 = 0 << 10;
162pub const CR2_ITBUFEN_ENABLED: u32 = 1 << 10;
163
164pub const CR2_ITEVTEN_POS: u32 = 9;
165pub const CR2_ITEVTEN_WIDTH: u32 = 1;
166pub const CR2_ITEVTEN_MASK: u32 = 0x1 << 9;
167pub const CR2_ITEVTEN_DISABLED: u32 = 0 << 9;
169pub const CR2_ITEVTEN_ENABLED: u32 = 1 << 9;
170
171pub const CR2_ITERREN_POS: u32 = 8;
172pub const CR2_ITERREN_WIDTH: u32 = 1;
173pub const CR2_ITERREN_MASK: u32 = 0x1 << 8;
174pub const CR2_ITERREN_DISABLED: u32 = 0 << 8;
176pub const CR2_ITERREN_ENABLED: u32 = 1 << 8;
177
178pub const CR2_FREQ_POS: u32 = 0;
179pub const CR2_FREQ_WIDTH: u32 = 6;
180pub const CR2_FREQ_MASK: u32 = 0x3F << 0;
181
182pub const OAR1_ADDMODE_POS: u32 = 15;
184pub const OAR1_ADDMODE_WIDTH: u32 = 1;
185pub const OAR1_ADDMODE_MASK: u32 = 0x1 << 15;
186pub const OAR1_ADDMODE_ADD7: u32 = 0 << 15;
188pub const OAR1_ADDMODE_ADD10: u32 = 1 << 15;
189
190pub const OAR1_ADD_POS: u32 = 0;
191pub const OAR1_ADD_WIDTH: u32 = 10;
192pub const OAR1_ADD_MASK: u32 = 0x3FF << 0;
193
194pub const OAR2_ADD2_POS: u32 = 1;
196pub const OAR2_ADD2_WIDTH: u32 = 7;
197pub const OAR2_ADD2_MASK: u32 = 0x7F << 1;
198
199pub const OAR2_ENDUAL_POS: u32 = 0;
200pub const OAR2_ENDUAL_WIDTH: u32 = 1;
201pub const OAR2_ENDUAL_MASK: u32 = 0x1 << 0;
202pub const OAR2_ENDUAL_SINGLE: u32 = 0 << 0;
204pub const OAR2_ENDUAL_DUAL: u32 = 1 << 0;
205
206pub const DR_DR_POS: u32 = 0;
208pub const DR_DR_WIDTH: u32 = 8;
209pub const DR_DR_MASK: u32 = 0xFF << 0;
210
211pub const SR1_SMBALERT_POS: u32 = 15;
213pub const SR1_SMBALERT_WIDTH: u32 = 1;
214pub const SR1_SMBALERT_MASK: u32 = 0x1 << 15;
215pub const SR1_SMBALERT_NOALERT: u32 = 0 << 15;
217pub const SR1_SMBALERT_ALERT: u32 = 1 << 15;
218
219pub const SR1_TIMEOUT_POS: u32 = 14;
220pub const SR1_TIMEOUT_WIDTH: u32 = 1;
221pub const SR1_TIMEOUT_MASK: u32 = 0x1 << 14;
222pub const SR1_TIMEOUT_NOTIMEOUT: u32 = 0 << 14;
224pub const SR1_TIMEOUT_TIMEOUT: u32 = 1 << 14;
225
226pub const SR1_PECERR_POS: u32 = 12;
227pub const SR1_PECERR_WIDTH: u32 = 1;
228pub const SR1_PECERR_MASK: u32 = 0x1 << 12;
229pub const SR1_PECERR_NOERROR: u32 = 0 << 12;
231pub const SR1_PECERR_ERROR: u32 = 1 << 12;
232
233pub const SR1_OVR_POS: u32 = 11;
234pub const SR1_OVR_WIDTH: u32 = 1;
235pub const SR1_OVR_MASK: u32 = 0x1 << 11;
236pub const SR1_OVR_NOOVERRUN: u32 = 0 << 11;
238pub const SR1_OVR_OVERRUN: u32 = 1 << 11;
239
240pub const SR1_AF_POS: u32 = 10;
241pub const SR1_AF_WIDTH: u32 = 1;
242pub const SR1_AF_MASK: u32 = 0x1 << 10;
243pub const SR1_AF_NOFAILURE: u32 = 0 << 10;
245pub const SR1_AF_FAILURE: u32 = 1 << 10;
246
247pub const SR1_ARLO_POS: u32 = 9;
248pub const SR1_ARLO_WIDTH: u32 = 1;
249pub const SR1_ARLO_MASK: u32 = 0x1 << 9;
250pub const SR1_ARLO_NOLOST: u32 = 0 << 9;
252pub const SR1_ARLO_LOST: u32 = 1 << 9;
253
254pub const SR1_BERR_POS: u32 = 8;
255pub const SR1_BERR_WIDTH: u32 = 1;
256pub const SR1_BERR_MASK: u32 = 0x1 << 8;
257pub const SR1_BERR_NOERROR: u32 = 0 << 8;
259pub const SR1_BERR_ERROR: u32 = 1 << 8;
260
261pub const SR1_TXE_POS: u32 = 7;
262pub const SR1_TXE_WIDTH: u32 = 1;
263pub const SR1_TXE_MASK: u32 = 0x1 << 7;
264pub const SR1_TXE_NOTEMPTY: u32 = 0 << 7;
266pub const SR1_TXE_EMPTY: u32 = 1 << 7;
267
268pub const SR1_RXNE_POS: u32 = 6;
269pub const SR1_RXNE_WIDTH: u32 = 1;
270pub const SR1_RXNE_MASK: u32 = 0x1 << 6;
271pub const SR1_RXNE_EMPTY: u32 = 0 << 6;
273pub const SR1_RXNE_NOTEMPTY: u32 = 1 << 6;
274
275pub const SR1_STOPF_POS: u32 = 4;
276pub const SR1_STOPF_WIDTH: u32 = 1;
277pub const SR1_STOPF_MASK: u32 = 0x1 << 4;
278pub const SR1_STOPF_NOSTOP: u32 = 0 << 4;
280pub const SR1_STOPF_STOP: u32 = 1 << 4;
281
282pub const SR1_ADD10_POS: u32 = 3;
283pub const SR1_ADD10_WIDTH: u32 = 1;
284pub const SR1_ADD10_MASK: u32 = 0x1 << 3;
285
286pub const SR1_BTF_POS: u32 = 2;
287pub const SR1_BTF_WIDTH: u32 = 1;
288pub const SR1_BTF_MASK: u32 = 0x1 << 2;
289pub const SR1_BTF_NOTFINISHED: u32 = 0 << 2;
291pub const SR1_BTF_FINISHED: u32 = 1 << 2;
292
293pub const SR1_ADDR_POS: u32 = 1;
294pub const SR1_ADDR_WIDTH: u32 = 1;
295pub const SR1_ADDR_MASK: u32 = 0x1 << 1;
296pub const SR1_ADDR_NOTMATCH: u32 = 0 << 1;
298pub const SR1_ADDR_MATCH: u32 = 1 << 1;
299
300pub const SR1_SB_POS: u32 = 0;
301pub const SR1_SB_WIDTH: u32 = 1;
302pub const SR1_SB_MASK: u32 = 0x1 << 0;
303pub const SR1_SB_NOSTART: u32 = 0 << 0;
305pub const SR1_SB_START: u32 = 1 << 0;
306
307pub const SR2_PEC_POS: u32 = 8;
309pub const SR2_PEC_WIDTH: u32 = 8;
310pub const SR2_PEC_MASK: u32 = 0xFF << 8;
311
312pub const SR2_DUALF_POS: u32 = 7;
313pub const SR2_DUALF_WIDTH: u32 = 1;
314pub const SR2_DUALF_MASK: u32 = 0x1 << 7;
315
316pub const SR2_SMBHOST_POS: u32 = 6;
317pub const SR2_SMBHOST_WIDTH: u32 = 1;
318pub const SR2_SMBHOST_MASK: u32 = 0x1 << 6;
319
320pub const SR2_SMBDEFAULT_POS: u32 = 5;
321pub const SR2_SMBDEFAULT_WIDTH: u32 = 1;
322pub const SR2_SMBDEFAULT_MASK: u32 = 0x1 << 5;
323
324pub const SR2_GENCALL_POS: u32 = 4;
325pub const SR2_GENCALL_WIDTH: u32 = 1;
326pub const SR2_GENCALL_MASK: u32 = 0x1 << 4;
327
328pub const SR2_TRA_POS: u32 = 2;
329pub const SR2_TRA_WIDTH: u32 = 1;
330pub const SR2_TRA_MASK: u32 = 0x1 << 2;
331
332pub const SR2_BUSY_POS: u32 = 1;
333pub const SR2_BUSY_WIDTH: u32 = 1;
334pub const SR2_BUSY_MASK: u32 = 0x1 << 1;
335
336pub const SR2_MSL_POS: u32 = 0;
337pub const SR2_MSL_WIDTH: u32 = 1;
338pub const SR2_MSL_MASK: u32 = 0x1 << 0;
339
340pub const CCR_F_S_POS: u32 = 15;
342pub const CCR_F_S_WIDTH: u32 = 1;
343pub const CCR_F_S_MASK: u32 = 0x1 << 15;
344pub const CCR_F_S_STANDARD: u32 = 0 << 15;
346pub const CCR_F_S_FAST: u32 = 1 << 15;
347
348pub const CCR_DUTY_POS: u32 = 14;
349pub const CCR_DUTY_WIDTH: u32 = 1;
350pub const CCR_DUTY_MASK: u32 = 0x1 << 14;
351pub const CCR_DUTY_DUTY2_1: u32 = 0 << 14;
353pub const CCR_DUTY_DUTY16_9: u32 = 1 << 14;
354
355pub const CCR_CCR_POS: u32 = 0;
356pub const CCR_CCR_WIDTH: u32 = 12;
357pub const CCR_CCR_MASK: u32 = 0xFFF << 0;
358
359pub const TRISE_TRISE_POS: u32 = 0;
361pub const TRISE_TRISE_WIDTH: u32 = 6;
362pub const TRISE_TRISE_MASK: u32 = 0x3F << 0;
363
364impl RegisterBlock {
366 pub fn enable(&mut self) {
368 self.cr1 |= CR1_PE_MASK;
369 }
370
371 pub fn disable(&mut self) {
373 self.cr1 &= !CR1_PE_MASK;
374 }
375
376 pub fn generate_start(&mut self) {
378 self.cr1 |= CR1_START_MASK;
379 }
380
381 pub fn generate_stop(&mut self) {
383 self.cr1 |= CR1_STOP_MASK;
384 }
385
386 pub fn set_ack(&mut self, enable: bool) {
388 if enable {
389 self.cr1 |= CR1_ACK_MASK;
390 } else {
391 self.cr1 &= !CR1_ACK_MASK;
392 }
393 }
394
395 pub fn is_start_sent(&self) -> bool {
397 (self.sr1 & SR1_SB_MASK) != 0
398 }
399
400 pub fn is_addr_sent(&self) -> bool {
402 (self.sr1 & SR1_ADDR_MASK) != 0
403 }
404
405 pub fn is_tx_empty(&self) -> bool {
407 (self.sr1 & SR1_TXE_MASK) != 0
408 }
409
410 pub fn is_rx_not_empty(&self) -> bool {
412 (self.sr1 & SR1_RXNE_MASK) != 0
413 }
414
415 pub fn is_btf(&self) -> bool {
417 (self.sr1 & SR1_BTF_MASK) != 0
418 }
419
420 pub fn is_busy(&self) -> bool {
422 (self.sr2 & SR2_BUSY_MASK) != 0
423 }
424
425 pub fn write_data(&mut self, data: u8) {
427 self.dr = data as u32;
428 }
429
430 pub fn read_data(&self) -> u8 {
432 self.dr as u8
433 }
434
435 pub fn clear_addr_flag(&self) {
437 let _ = self.sr1;
438 let _ = self.sr2;
439 }
440
441 pub fn set_clock_freq(&mut self, freq_mhz: u8) {
443 self.cr2 = (self.cr2 & !0x3F) | (freq_mhz as u32 & 0x3F);
444 }
445}