@@ -235,19 +235,14 @@ macro_rules! spi {
235
235
impl <PINS > Spi <$SPIX, PINS > {
236
236
pub fn read( & mut self ) -> nb:: Result <u8 , Error > {
237
237
let sr = self . spi. sr( ) . read( ) ;
238
-
239
238
Err ( if sr. ovr( ) . bit_is_set( ) {
240
239
nb:: Error :: Other ( Error :: Overrun )
241
240
} else if sr. modf( ) . bit_is_set( ) {
242
241
nb:: Error :: Other ( Error :: ModeFault )
243
242
} else if sr. crcerr( ) . bit_is_set( ) {
244
243
nb:: Error :: Other ( Error :: Crc )
245
244
} else if sr. rxne( ) . bit_is_set( ) {
246
- // NOTE(read_volatile) read only 1 byte (the svd2rust API only allows
247
- // reading a half-word)
248
- return Ok ( unsafe {
249
- ptr:: read_volatile( & self . spi. dr( ) as * const _ as * const u8 )
250
- } ) ;
245
+ return Ok ( self . spi. dr( ) . read( ) . bits( ) as u8 ) ;
251
246
} else {
252
247
nb:: Error :: WouldBlock
253
248
} )
@@ -262,7 +257,9 @@ macro_rules! spi {
262
257
} else if sr. crcerr( ) . bit_is_set( ) {
263
258
nb:: Error :: Other ( Error :: Crc )
264
259
} else if sr. txe( ) . bit_is_set( ) {
265
- self . spi. dr( ) . write( |w| w. dr( ) . set( byte. into( ) ) ) ;
260
+ unsafe {
261
+ ptr:: write_volatile( core:: cell:: UnsafeCell :: raw_get( self . spi. dr( ) as * const _ as _) , byte)
262
+ }
266
263
return Ok ( ( ) ) ;
267
264
} else {
268
265
nb:: Error :: WouldBlock
@@ -284,23 +281,23 @@ macro_rules! spi {
284
281
285
282
fn write( & mut self , words: & [ u8 ] ) -> Result <( ) , Self :: Error > {
286
283
for word in words. iter( ) {
287
- block!( self . send( word. clone ( ) ) ) ?;
284
+ block!( self . send( * word) ) ?;
288
285
block!( self . read( ) ) ?;
289
286
}
290
287
Ok ( ( ) )
291
288
}
292
289
293
290
fn transfer( & mut self , read: & mut [ u8 ] , write: & [ u8 ] ) -> Result <( ) , Self :: Error > {
294
291
for ( r, w) in read. iter_mut( ) . zip( write. iter( ) ) {
295
- block!( self . send( w . clone ( ) ) ) ?;
292
+ block!( self . send( * w ) ) ?;
296
293
* r = block!( self . read( ) ) ?;
297
294
}
298
295
Ok ( ( ) )
299
296
}
300
297
301
298
fn transfer_in_place( & mut self , words: & mut [ u8 ] ) -> Result <( ) , Self :: Error > {
302
299
for word in words. iter_mut( ) {
303
- block!( self . send( word. clone ( ) ) ) ?;
300
+ block!( self . send( * word) ) ?;
304
301
* word = block!( self . read( ) ) ?;
305
302
}
306
303
Ok ( ( ) )
0 commit comments