1
1
//! Inter-Integrated Circuit (I2C) bus
2
2
3
3
use crate :: afio:: MAPR ;
4
+ use crate :: time:: Hertz ;
4
5
use crate :: gpio:: gpiob:: { PB10 , PB11 , PB6 , PB7 , PB8 , PB9 } ;
5
6
use crate :: gpio:: { Alternate , OpenDrain } ;
6
7
use crate :: hal:: blocking:: i2c:: { Read , Write , WriteRead } ;
@@ -36,16 +37,24 @@ pub enum DutyCycle {
36
37
#[ derive( Debug , PartialEq ) ]
37
38
pub enum Mode {
38
39
Standard {
39
- frequency : u32 ,
40
+ frequency : Hertz ,
40
41
} ,
41
42
Fast {
42
- frequency : u32 ,
43
+ frequency : Hertz ,
43
44
duty_cycle : DutyCycle ,
44
45
} ,
45
46
}
46
47
47
48
impl Mode {
48
- pub fn get_frequency ( & self ) -> u32 {
49
+ pub fn standard < F : Into < Hertz > > ( frequency : F ) -> Self {
50
+ Mode :: Standard { frequency : frequency. into ( ) }
51
+ }
52
+
53
+ pub fn fast < F : Into < Hertz > > ( frequency : F , duty_cycle : DutyCycle ) -> Self {
54
+ Mode :: Fast { frequency : frequency. into ( ) , duty_cycle}
55
+ }
56
+
57
+ pub fn get_frequency ( & self ) -> Hertz {
49
58
match self {
50
59
& Mode :: Standard { frequency } => frequency,
51
60
& Mode :: Fast { frequency, .. } => frequency,
@@ -251,7 +260,7 @@ macro_rules! hal {
251
260
252
261
let pclk1 = clocks. pclk1( ) . 0 ;
253
262
254
- assert!( mode. get_frequency( ) <= 400_000 ) ;
263
+ assert!( mode. get_frequency( ) . 0 <= 400_000 ) ;
255
264
256
265
let mut i2c = I2c { i2c, pins, mode, pclk1 } ;
257
266
i2c. init( ) ;
@@ -273,7 +282,7 @@ macro_rules! hal {
273
282
w. trise( ) . bits( ( pclk1_mhz + 1 ) as u8 )
274
283
} ) ;
275
284
self . i2c. ccr. write( |w| unsafe {
276
- w. ccr( ) . bits( ( ( self . pclk1 / ( freq * 2 ) ) as u16 ) . max( 4 ) )
285
+ w. ccr( ) . bits( ( ( self . pclk1 / ( freq. 0 * 2 ) ) as u16 ) . max( 4 ) )
277
286
} ) ;
278
287
} ,
279
288
Mode :: Fast { ref duty_cycle, .. } => {
@@ -283,8 +292,8 @@ macro_rules! hal {
283
292
284
293
self . i2c. ccr. write( |w| {
285
294
let ( freq, duty) = match duty_cycle {
286
- & DutyCycle :: Ratio2to1 => ( ( ( self . pclk1 / ( freq * 3 ) ) as u16 ) . max( 1 ) , false ) ,
287
- & DutyCycle :: Ratio16to9 => ( ( ( self . pclk1 / ( freq * 25 ) ) as u16 ) . max( 1 ) , true )
295
+ & DutyCycle :: Ratio2to1 => ( ( ( self . pclk1 / ( freq. 0 * 3 ) ) as u16 ) . max( 1 ) , false ) ,
296
+ & DutyCycle :: Ratio16to9 => ( ( ( self . pclk1 / ( freq. 0 * 25 ) ) as u16 ) . max( 1 ) , true )
288
297
} ;
289
298
290
299
unsafe {
0 commit comments