@@ -296,8 +296,11 @@ macro_rules! spi {
296
296
let len = words. len( ) ;
297
297
if len == 0 { return Ok ( ( ) ) }
298
298
299
+ // flush data from previous operations, otherwise we'd get unwanted data
300
+ self . flush( ) ?;
299
301
// FIFO threshold to 16 bits
300
302
self . spi. cr2. modify( |_, w| w. frxth( ) . clear_bit( ) ) ;
303
+ self . set_bidi( ) ;
301
304
302
305
let half_len = len / 2 ;
303
306
let pair_left = len % 2 ;
@@ -309,36 +312,32 @@ macro_rules! spi {
309
312
}
310
313
311
314
for r in words. chunks_exact_mut( 2 ) . take( half_len - prefill) {
312
- nb:: block!( self . nb_write( 0u16 ) ) ?;
313
315
let r_two: u16 = unsafe {
314
316
nb:: block!( self . nb_read_no_err( ) ) . unwrap_unchecked( )
315
317
} ;
318
+ nb:: block!( self . nb_write( 0u16 ) ) ?;
316
319
// safety: chunks have exact length of 2
317
320
unsafe { * r. as_mut_ptr( ) . cast( ) = r_two. to_le_bytes( ) ; }
318
321
}
319
322
320
- let odd_idx = len. saturating_sub( prefill + pair_left) ;
323
+ let odd_idx = len. saturating_sub( 2 * prefill + pair_left) ;
321
324
// FIFO threshold to 8 bits
322
325
self . spi. cr2. modify( |_, w| w. frxth( ) . set_bit( ) ) ;
323
326
if pair_left == 1 {
324
327
nb:: block!( self . nb_write( 0u8 ) ) ?;
325
328
words[ odd_idx] = nb:: block!( self . nb_read_no_err( ) ) . unwrap( ) ;
326
329
}
327
330
328
- Ok ( for r in words[ odd_idx+1 ..] . iter_mut( ) {
331
+ Ok ( for r in words[ odd_idx+pair_left ..] . iter_mut( ) {
329
332
* r = nb:: block!( self . nb_read( ) ) ?;
330
333
} )
331
334
}
332
335
333
336
fn write( & mut self , words: & [ u8 ] ) -> Result <( ) , Self :: Error > {
334
- let catch = |spi: & mut Self | Ok ( for w in words {
335
- nb:: block!( spi. nb_write( * w) ) ?
336
- } ) ;
337
-
338
337
self . set_tx_only( ) ;
339
- let res = catch ( self ) ;
340
- self . set_bidi ( ) ;
341
- res
338
+ Ok ( for w in words {
339
+ nb :: block! ( self . nb_write ( * w ) ) ?
340
+ } )
342
341
}
343
342
344
343
fn transfer( & mut self , read: & mut [ u8 ] , write: & [ u8 ] ) -> Result <( ) , Self :: Error > {
@@ -348,6 +347,7 @@ macro_rules! spi {
348
347
return self . read( read)
349
348
}
350
349
350
+ self . set_bidi( ) ;
351
351
let common_len = core:: cmp:: min( read. len( ) , write. len( ) ) ;
352
352
let half_len = common_len / 2 ;
353
353
let pair_left = common_len % 2 ;
@@ -372,7 +372,6 @@ macro_rules! spi {
372
372
// write ahead of reading
373
373
let zipped = read. chunks_exact_mut( 2 ) . zip( write_iter) . take( half_len - prefill) ;
374
374
for ( r, w) in zipped {
375
-
376
375
let r_two: u16 = unsafe {
377
376
nb:: block!( self . nb_read_no_err( ) ) . unwrap_unchecked( )
378
377
} ;
@@ -410,6 +409,7 @@ macro_rules! spi {
410
409
let len = words. len( ) ;
411
410
if len == 0 { return Ok ( ( ) ) }
412
411
412
+ self . set_bidi( ) ;
413
413
self . spi. cr2. modify( |_, w| w. frxth( ) . clear_bit( ) ) ;
414
414
let half_len = len / 2 ;
415
415
let pair_left = len % 2 ;
@@ -450,23 +450,16 @@ macro_rules! spi {
450
450
} )
451
451
}
452
452
fn flush( & mut self ) -> Result <( ) , Self :: Error > {
453
- let catch = |spi: & mut Self | {
454
- // drain rx fifo
455
- while match spi. nb_read:: <u8 >( ) {
456
- Ok ( _) => true ,
457
- Err ( nb:: Error :: WouldBlock ) => false ,
458
- Err ( nb:: Error :: Other ( e) ) => { return Err ( e) }
459
- } { core:: hint:: spin_loop( ) } ;
460
- // wait for tx fifo to be drained by the peripheral
461
- while spi. spi. sr. read( ) . ftlvl( ) != 0 { core:: hint:: spin_loop( ) } ;
462
- Ok ( ( ) )
463
- } ;
464
-
465
453
// stop receiving data
466
454
self . set_tx_only( ) ;
467
- let res = catch( self ) ;
468
- self . set_bidi( ) ;
469
- res
455
+ // drain rx fifo
456
+ while match self . nb_read:: <u8 >( ) {
457
+ Ok ( _) => true ,
458
+ Err ( nb:: Error :: WouldBlock ) => false ,
459
+ Err ( nb:: Error :: Other ( e) ) => { return Err ( e) }
460
+ } { core:: hint:: spin_loop( ) } ;
461
+ // wait for idle
462
+ Ok ( while self . spi. sr. read( ) . bsy( ) . bit( ) { core:: hint:: spin_loop( ) } )
470
463
}
471
464
}
472
465
0 commit comments