@@ -220,34 +220,34 @@ impl<I2C: Instance> I2c<I2C> {
220220 let sr1 = self . i2c . sr1 ( ) . read ( ) ;
221221
222222 if sr1. timeout ( ) . bit_is_set ( ) {
223- self . i2c . sr1 ( ) . modify ( |_ , w| w. timeout ( ) . clear_bit ( ) ) ;
223+ self . i2c . sr1 ( ) . write ( | w| w. timeout ( ) . clear_bit ( ) ) ;
224224 return Err ( Error :: Timeout ) ;
225225 }
226226
227227 if sr1. pecerr ( ) . bit_is_set ( ) {
228- self . i2c . sr1 ( ) . modify ( |_ , w| w. pecerr ( ) . clear_bit ( ) ) ;
228+ self . i2c . sr1 ( ) . write ( | w| w. pecerr ( ) . clear_bit ( ) ) ;
229229 return Err ( Error :: Crc ) ;
230230 }
231231
232232 if sr1. ovr ( ) . bit_is_set ( ) {
233- self . i2c . sr1 ( ) . modify ( |_ , w| w. ovr ( ) . clear_bit ( ) ) ;
233+ self . i2c . sr1 ( ) . write ( | w| w. ovr ( ) . clear_bit ( ) ) ;
234234 return Err ( Error :: Overrun ) ;
235235 }
236236
237237 if sr1. af ( ) . bit_is_set ( ) {
238- self . i2c . sr1 ( ) . modify ( |_ , w| w. af ( ) . clear_bit ( ) ) ;
238+ self . i2c . sr1 ( ) . write ( | w| w. af ( ) . clear_bit ( ) ) ;
239239 return Err ( Error :: NoAcknowledge ( NoAcknowledgeSource :: Unknown ) ) ;
240240 }
241241
242242 if sr1. arlo ( ) . bit_is_set ( ) {
243- self . i2c . sr1 ( ) . modify ( |_ , w| w. arlo ( ) . clear_bit ( ) ) ;
243+ self . i2c . sr1 ( ) . write ( | w| w. arlo ( ) . clear_bit ( ) ) ;
244244 return Err ( Error :: ArbitrationLoss ) ;
245245 }
246246
247247 // The errata indicates that BERR may be incorrectly detected. It recommends ignoring and
248248 // clearing the BERR bit instead.
249249 if sr1. berr ( ) . bit_is_set ( ) {
250- self . i2c . sr1 ( ) . modify ( |_ , w| w. berr ( ) . clear_bit ( ) ) ;
250+ self . i2c . sr1 ( ) . write ( | w| w. berr ( ) . clear_bit ( ) ) ;
251251 }
252252
253253 Ok ( sr1)
@@ -264,6 +264,8 @@ impl<I2C: Instance> I2c<I2C> {
264264 // to start a new transaction.
265265 while self . i2c . cr1 ( ) . read ( ) . stop ( ) . bit_is_set ( ) { }
266266
267+ // Clear all pending error bits
268+ self . i2c . sr1 ( ) . write ( |w| unsafe { w. bits ( 0 ) } ) ;
267269 // Send a START condition
268270 self . i2c . cr1 ( ) . modify ( |_, w| w. start ( ) . set_bit ( ) ) ;
269271
@@ -325,6 +327,8 @@ impl<I2C: Instance> I2c<I2C> {
325327 // to start a new transaction.
326328 while self . i2c . cr1 ( ) . read ( ) . stop ( ) . bit_is_set ( ) { }
327329
330+ // Clear all pending error bits
331+ self . i2c . sr1 ( ) . write ( |w| unsafe { w. bits ( 0 ) } ) ;
328332 // Send a START condition and set ACK bit
329333 self . i2c
330334 . cr1 ( )
0 commit comments