@@ -235,19 +235,14 @@ macro_rules! spi {
235235 impl <PINS > Spi <$SPIX, PINS > {
236236 pub fn read( & mut self ) -> nb:: Result <u8 , Error > {
237237 let sr = self . spi. sr( ) . read( ) ;
238-
239238 Err ( if sr. ovr( ) . bit_is_set( ) {
240239 nb:: Error :: Other ( Error :: Overrun )
241240 } else if sr. modf( ) . bit_is_set( ) {
242241 nb:: Error :: Other ( Error :: ModeFault )
243242 } else if sr. crcerr( ) . bit_is_set( ) {
244243 nb:: Error :: Other ( Error :: Crc )
245244 } 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 ) ;
251246 } else {
252247 nb:: Error :: WouldBlock
253248 } )
@@ -262,7 +257,9 @@ macro_rules! spi {
262257 } else if sr. crcerr( ) . bit_is_set( ) {
263258 nb:: Error :: Other ( Error :: Crc )
264259 } 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+ }
266263 return Ok ( ( ) ) ;
267264 } else {
268265 nb:: Error :: WouldBlock
@@ -284,23 +281,23 @@ macro_rules! spi {
284281
285282 fn write( & mut self , words: & [ u8 ] ) -> Result <( ) , Self :: Error > {
286283 for word in words. iter( ) {
287- block!( self . send( word. clone ( ) ) ) ?;
284+ block!( self . send( * word) ) ?;
288285 block!( self . read( ) ) ?;
289286 }
290287 Ok ( ( ) )
291288 }
292289
293290 fn transfer( & mut self , read: & mut [ u8 ] , write: & [ u8 ] ) -> Result <( ) , Self :: Error > {
294291 for ( r, w) in read. iter_mut( ) . zip( write. iter( ) ) {
295- block!( self . send( w . clone ( ) ) ) ?;
292+ block!( self . send( * w ) ) ?;
296293 * r = block!( self . read( ) ) ?;
297294 }
298295 Ok ( ( ) )
299296 }
300297
301298 fn transfer_in_place( & mut self , words: & mut [ u8 ] ) -> Result <( ) , Self :: Error > {
302299 for word in words. iter_mut( ) {
303- block!( self . send( word. clone ( ) ) ) ?;
300+ block!( self . send( * word) ) ?;
304301 * word = block!( self . read( ) ) ?;
305302 }
306303 Ok ( ( ) )
0 commit comments