@@ -214,11 +214,7 @@ macro_rules! spi {
214
214
} else if sr. crcerr( ) . bit_is_set( ) {
215
215
nb:: Error :: Other ( Error :: Crc )
216
216
} else if sr. rxne( ) . bit_is_set( ) {
217
- // NOTE(read_volatile) read only 1 byte (the svd2rust API only allows
218
- // reading a half-word)
219
- return Ok ( unsafe {
220
- ptr:: read_volatile( & self . spi. dr as * const _ as * const W )
221
- } ) ;
217
+ return Ok ( self . read_unchecked( ) ) ;
222
218
} else {
223
219
nb:: Error :: WouldBlock
224
220
} )
@@ -233,15 +229,33 @@ macro_rules! spi {
233
229
} else if sr. crcerr( ) . bit_is_set( ) {
234
230
nb:: Error :: Other ( Error :: Crc )
235
231
} else if sr. txe( ) . bit_is_set( ) {
236
- let dr = & self . spi. dr as * const _ as * const UnsafeCell <W >;
237
- // NOTE(write_volatile) see note above
238
- unsafe { ptr:: write_volatile( UnsafeCell :: raw_get( dr) , word) } ;
232
+ self . write_unchecked( word) ;
239
233
return Ok ( ( ) ) ;
240
234
} else {
241
235
nb:: Error :: WouldBlock
242
236
} )
243
237
}
244
238
#[ inline]
239
+ fn nb_read_no_err( & mut self ) -> nb:: Result <u8 , ( ) > {
240
+ if self . spi. sr. read( ) . rxne( ) . bit_is_set( ) {
241
+ Ok ( self . read_unchecked( ) )
242
+ } else {
243
+ Err ( nb:: Error :: WouldBlock )
244
+ }
245
+ }
246
+ #[ inline]
247
+ fn read_unchecked<W : FrameSize >( & mut self ) -> W {
248
+ // NOTE(read_volatile) read only 1 byte (the svd2rust API only allows
249
+ // reading a half-word)
250
+ unsafe { ptr:: read_volatile( & self . spi. dr as * const _ as * const W ) }
251
+ }
252
+ #[ inline]
253
+ fn write_unchecked<W : FrameSize >( & mut self , word: W ) {
254
+ let dr = & self . spi. dr as * const _ as * const UnsafeCell <W >;
255
+ // NOTE(write_volatile) see note above
256
+ unsafe { ptr:: write_volatile( UnsafeCell :: raw_get( dr) , word) } ;
257
+ }
258
+ #[ inline]
245
259
pub fn set_tx_only( & mut self ) {
246
260
self . spi
247
261
. cr1
@@ -278,10 +292,11 @@ macro_rules! spi {
278
292
// one frame should be enough?
279
293
nb:: block!( self . nb_write( 0u8 ) ) ?;
280
294
let len = words. len( ) ;
281
- for w in words[ ..len-1 ] . iter_mut( ) {
295
+ for r in words[ ..len-1 ] . iter_mut( ) {
282
296
// TODO: 16 bit frames, bidirectional pins
283
297
nb:: block!( self . nb_write( 0u8 ) ) ?;
284
- * w = nb:: block!( self . nb_read( ) ) ?;
298
+ // errors have been checked by the write above
299
+ * r = unsafe { nb:: block!( self . nb_read_no_err( ) ) . unwrap_unchecked( ) } ;
285
300
}
286
301
// safety: length > 0 checked at start of function
287
302
* words. last_mut( ) . unwrap( ) = nb:: block!( self . nb_read( ) ) ?;
@@ -314,7 +329,7 @@ macro_rules! spi {
314
329
let zipped = read. iter_mut( ) . zip( write. into_iter( ) . skip( 1 ) ) . take( common_len - 1 ) ;
315
330
for ( r, w) in zipped {
316
331
nb:: block!( self . nb_write( * w) ) ?;
317
- * r = nb:: block!( self . nb_read ( ) ) ? ;
332
+ * r = unsafe { nb:: block!( self . nb_read_no_err ( ) ) . unwrap_unchecked ( ) } ;
318
333
}
319
334
read[ common_len-1 ] = nb:: block!( self . nb_read( ) ) ?;
320
335
@@ -335,7 +350,7 @@ macro_rules! spi {
335
350
let w = & rw[ 1 ] ;
336
351
337
352
nb:: block!( self . nb_write( w. get( ) ) ) ?;
338
- r. set( nb:: block!( self . nb_read ( ) ) ? ) ;
353
+ r. set( unsafe { nb:: block!( self . nb_read_no_err ( ) ) . unwrap_unchecked ( ) } ) ;
339
354
}
340
355
* words. last_mut( ) . unwrap( ) = nb:: block!( self . nb_read( ) ) ?;
341
356
Ok ( ( ) )
0 commit comments