@@ -550,6 +550,10 @@ impl PinScl<FMPI2C> for PF15<AlternateOD<AF4>> {}
550
550
pub enum Error {
551
551
OVERRUN ,
552
552
NACK ,
553
+ TIMEOUT ,
554
+ BUS ,
555
+ CRC ,
556
+ ARBITRATION ,
553
557
}
554
558
555
559
#[ cfg( any(
@@ -767,6 +771,53 @@ where
767
771
self . i2c . cr1 . modify ( |_, w| w. pe ( ) . set_bit ( ) ) ;
768
772
}
769
773
774
+ fn check_and_clear_error_flags ( & self ) -> Result < ( ) , Error > {
775
+ let sr1 = self . i2c . sr1 . read ( ) ;
776
+
777
+ // Clear all pending error flags. We have already read the SR1, so it's safe to clear them
778
+ // before returning the error code.
779
+ self . i2c . sr1 . modify ( |_, w| {
780
+ w. timeout ( )
781
+ . clear_bit ( )
782
+ . pecerr ( )
783
+ . clear_bit ( )
784
+ . ovr ( )
785
+ . clear_bit ( )
786
+ . af ( )
787
+ . clear_bit ( )
788
+ . arlo ( )
789
+ . clear_bit ( )
790
+ . berr ( )
791
+ . clear_bit ( )
792
+ } ) ;
793
+
794
+ if sr1. timeout ( ) . bit_is_set ( ) {
795
+ return Err ( Error :: TIMEOUT ) ;
796
+ }
797
+
798
+ if sr1. pecerr ( ) . bit_is_set ( ) {
799
+ return Err ( Error :: CRC ) ;
800
+ }
801
+
802
+ if sr1. ovr ( ) . bit_is_set ( ) {
803
+ return Err ( Error :: OVERRUN ) ;
804
+ }
805
+
806
+ if sr1. af ( ) . bit_is_set ( ) {
807
+ return Err ( Error :: NACK ) ;
808
+ }
809
+
810
+ if sr1. arlo ( ) . bit_is_set ( ) {
811
+ return Err ( Error :: ARBITRATION ) ;
812
+ }
813
+
814
+ if sr1. berr ( ) . bit_is_set ( ) {
815
+ return Err ( Error :: BUS ) ;
816
+ }
817
+
818
+ Ok ( ( ) )
819
+ }
820
+
770
821
pub fn release ( self ) -> ( I2C , PINS ) {
771
822
( self . i2c , self . pins )
772
823
}
@@ -804,16 +855,11 @@ where
804
855
805
856
// Wait until address was sent
806
857
while {
807
- let sr1 = self . i2c . sr1 . read ( ) ;
858
+ // Check for any I2C errors. If a NACK occurs, the ADDR bit will never be set.
859
+ self . check_and_clear_error_flags ( ) ?;
808
860
809
- // If we received a NACK, then this is an error
810
- if sr1. af ( ) . bit_is_set ( ) {
811
- self . i2c . sr1 . modify ( |_, w| w. af ( ) . clear_bit ( ) ) ;
812
- return Err ( Error :: NACK ) ;
813
- }
814
-
815
- // Wait for the address to be acknowledged.
816
- sr1. addr ( ) . bit_is_clear ( )
861
+ // Wait for the address to be acknowledged
862
+ self . i2c . sr1 . read ( ) . addr ( ) . bit_is_clear ( )
817
863
} { }
818
864
819
865
// Clear condition by reading SR2
@@ -837,22 +883,23 @@ where
837
883
838
884
// Wait until byte is transferred
839
885
while {
840
- let sr1 = self . i2c . sr1 . read ( ) ;
841
-
842
- // If we received a NACK, then this is an error
843
- if sr1. af ( ) . bit_is_set ( ) {
844
- self . i2c . sr1 . modify ( |_, w| w. af ( ) . clear_bit ( ) ) ;
845
- return Err ( Error :: NACK ) ;
846
- }
886
+ // Check for any potential error conditions.
887
+ self . check_and_clear_error_flags ( ) ?;
847
888
848
- sr1. btf ( ) . bit_is_clear ( )
889
+ self . i2c . sr1 . read ( ) . btf ( ) . bit_is_clear ( )
849
890
} { }
850
891
851
892
Ok ( ( ) )
852
893
}
853
894
854
895
fn recv_byte ( & self ) -> Result < u8 , Error > {
855
- while self . i2c . sr1 . read ( ) . rx_ne ( ) . bit_is_clear ( ) { }
896
+ while {
897
+ // Check for any potential error conditions.
898
+ self . check_and_clear_error_flags ( ) ?;
899
+
900
+ self . i2c . sr1 . read ( ) . rx_ne ( ) . bit_is_clear ( )
901
+ } { }
902
+
856
903
let value = self . i2c . dr . read ( ) . bits ( ) as u8 ;
857
904
Ok ( value)
858
905
}
0 commit comments