@@ -605,6 +605,19 @@ impl<SPI: Instance, PINS, const BIDI: bool, W, OPERATION> Spi<SPI, PINS, BIDI, W
605
605
pub fn is_overrun ( & self ) -> bool {
606
606
self . spi . sr . read ( ) . ovr ( ) . bit_is_set ( )
607
607
}
608
+
609
+ fn check_errors ( & self ) -> Result < ( ) , Error > {
610
+ let sr = self . spi . sr . read ( ) ;
611
+ if sr. ovr ( ) . bit_is_set ( ) {
612
+ Err ( Error :: Overrun )
613
+ } else if sr. modf ( ) . bit_is_set ( ) {
614
+ Err ( Error :: ModeFault )
615
+ } else if sr. crcerr ( ) . bit_is_set ( ) {
616
+ Err ( Error :: Crc )
617
+ } else {
618
+ Ok ( ( ) )
619
+ }
620
+ }
608
621
}
609
622
610
623
trait ReadWriteReg < W > {
@@ -685,30 +698,47 @@ impl<SPI: Instance, PINS, const BIDI: bool, W: FrameSize, OPERATION>
685
698
where
686
699
WI : IntoIterator < Item = W > ,
687
700
{
688
- if BIDI {
689
- self . spi . cr1 . modify ( |_, w| w. bidioe ( ) . set_bit ( ) ) ;
690
- }
691
- // Write each word when the tx buffer is empty
692
- for word in words {
693
- loop {
694
- let sr = self . spi . sr . read ( ) ;
695
- if sr. txe ( ) . bit_is_set ( ) {
696
- self . write_data_reg ( word) ;
697
- if sr. modf ( ) . bit_is_set ( ) {
698
- return Err ( Error :: ModeFault ) ;
701
+ let mut words = words. into_iter ( ) ;
702
+ if let Some ( first) = words. next ( ) {
703
+ if BIDI {
704
+ self . spi . cr1 . modify ( |_, w| w. bidioe ( ) . set_bit ( ) ) ;
705
+ }
706
+ // p.2
707
+ self . write_data_reg ( first) ;
708
+ // Write each word when the tx buffer is empty
709
+ // p.3,4
710
+ ' main: loop {
711
+ let word = words. next ( ) ;
712
+ let mut sr;
713
+ loop {
714
+ sr = self . spi . sr . read ( ) ;
715
+ if sr. txe ( ) . bit_is_set ( ) {
716
+ if let Some ( word) = word {
717
+ self . write_data_reg ( word) ;
718
+ break ;
719
+ } else {
720
+ break ' main;
721
+ }
699
722
}
700
- break ;
723
+ }
724
+ if sr. modf ( ) . bit_is_set ( ) {
725
+ self . enable ( false ) ;
726
+ return Err ( Error :: ModeFault ) ;
701
727
}
702
728
}
729
+ // p.4
730
+ // Wait for final !BSY
731
+ while self . is_busy ( ) { }
732
+
733
+ if !BIDI {
734
+ // Clear OVR set due to dropped received values
735
+ let _ = self . read_data_reg ( ) ;
736
+ }
737
+ let _ = self . spi . sr . read ( ) ;
738
+ self . check_errors ( )
739
+ } else {
740
+ Ok ( ( ) )
703
741
}
704
- // Wait for final TXE
705
- while !self . is_tx_empty ( ) { }
706
- // Wait for final !BSY
707
- while self . is_busy ( ) { }
708
- // Clear OVR set due to dropped received values
709
- let _ = self . read_data_reg ( ) ;
710
- let _ = self . spi . sr . read ( ) ;
711
- Ok ( ( ) )
712
742
}
713
743
}
714
744
0 commit comments