@@ -7,7 +7,13 @@ use crate::hal::blocking::i2c::{Read, Write, WriteRead};
7
7
use crate :: gpio:: gpioa:: { PA10 , PA9 } ;
8
8
use crate :: gpio:: gpiob:: { PB6 , PB7 } ;
9
9
use crate :: gpio:: { AltMode , OpenDrain , Output } ;
10
- use crate :: pac:: { i2c1:: RegisterBlock , I2C1 } ;
10
+ use crate :: pac:: {
11
+ i2c1:: {
12
+ RegisterBlock ,
13
+ cr2:: RD_WRNW ,
14
+ } ,
15
+ I2C1 ,
16
+ } ;
11
17
use crate :: rcc:: Rcc ;
12
18
use crate :: time:: Hertz ;
13
19
use cast:: u8;
@@ -131,6 +137,22 @@ where
131
137
( self . i2c , self . sda , self . scl )
132
138
}
133
139
140
+ fn start_transfer ( & mut self , addr : u8 , len : usize , direction : RD_WRNW ) {
141
+ self . i2c . cr2 . write ( |w|
142
+ w
143
+ // Start transfer
144
+ . start ( ) . set_bit ( )
145
+ // Set number of bytes to transfer
146
+ . nbytes ( ) . bits ( len as u8 )
147
+ // Set address to transfer to/from
148
+ . sadd ( ) . bits ( ( addr << 1 ) as u16 )
149
+ // Set transfer direction
150
+ . rd_wrn ( ) . variant ( direction)
151
+ // End transfer once all bytes have been written
152
+ . autoend ( ) . set_bit ( )
153
+ ) ;
154
+ }
155
+
134
156
fn send_byte ( & self , byte : u8 ) -> Result < ( ) , Error > {
135
157
// Wait until we're ready for sending
136
158
while self . i2c . isr . read ( ) . txe ( ) . bit_is_clear ( ) { }
@@ -186,18 +208,7 @@ where
186
208
fn write ( & mut self , addr : u8 , bytes : & [ u8 ] ) -> Result < ( ) , Self :: Error > {
187
209
while self . i2c . isr . read ( ) . busy ( ) . is_busy ( ) { }
188
210
189
- self . i2c . cr2 . write ( |w| {
190
- w. start ( )
191
- . set_bit ( )
192
- . nbytes ( )
193
- . bits ( bytes. len ( ) as u8 )
194
- . sadd ( )
195
- . bits ( ( addr << 1 ) as u16 )
196
- . rd_wrn ( )
197
- . clear_bit ( )
198
- . autoend ( )
199
- . set_bit ( )
200
- } ) ;
211
+ self . start_transfer ( addr, bytes. len ( ) , RD_WRNW :: WRITE ) ;
201
212
202
213
// Send bytes
203
214
for c in bytes {
@@ -217,19 +228,7 @@ where
217
228
fn read ( & mut self , addr : u8 , buffer : & mut [ u8 ] ) -> Result < ( ) , Self :: Error > {
218
229
while self . i2c . isr . read ( ) . busy ( ) . is_busy ( ) { }
219
230
220
- self . i2c . cr2 . write ( |w| {
221
- w. start ( )
222
- . set_bit ( )
223
- . nbytes ( )
224
- . bits ( buffer. len ( ) as u8 )
225
- . sadd ( )
226
- . bits ( ( addr << 1 ) as u16 )
227
- // Request read transfer
228
- . rd_wrn ( )
229
- . read ( )
230
- . autoend ( )
231
- . set_bit ( )
232
- } ) ;
231
+ self . start_transfer ( addr, buffer. len ( ) , RD_WRNW :: READ ) ;
233
232
234
233
// Receive bytes into buffer
235
234
for c in buffer {
0 commit comments