@@ -605,6 +605,19 @@ impl<SPI: Instance, PINS, const BIDI: bool, W, OPERATION> Spi<SPI, PINS, BIDI, W
605605 pub fn is_overrun ( & self ) -> bool {
606606 self . spi . sr . read ( ) . ovr ( ) . bit_is_set ( )
607607 }
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+ }
608621}
609622
610623trait ReadWriteReg < W > {
@@ -685,30 +698,47 @@ impl<SPI: Instance, PINS, const BIDI: bool, W: FrameSize, OPERATION>
685698 where
686699 WI : IntoIterator < Item = W > ,
687700 {
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+ }
699722 }
700- break ;
723+ }
724+ if sr. modf ( ) . bit_is_set ( ) {
725+ self . enable ( false ) ;
726+ return Err ( Error :: ModeFault ) ;
701727 }
702728 }
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 ( ( ) )
703741 }
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 ( ( ) )
712742 }
713743}
714744
0 commit comments