@@ -220,34 +220,34 @@ impl<I2C: Instance> I2c<I2C> {
220
220
let sr1 = self . i2c . sr1 ( ) . read ( ) ;
221
221
222
222
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 ( ) ) ;
224
224
return Err ( Error :: Timeout ) ;
225
225
}
226
226
227
227
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 ( ) ) ;
229
229
return Err ( Error :: Crc ) ;
230
230
}
231
231
232
232
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 ( ) ) ;
234
234
return Err ( Error :: Overrun ) ;
235
235
}
236
236
237
237
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 ( ) ) ;
239
239
return Err ( Error :: NoAcknowledge ( NoAcknowledgeSource :: Unknown ) ) ;
240
240
}
241
241
242
242
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 ( ) ) ;
244
244
return Err ( Error :: ArbitrationLoss ) ;
245
245
}
246
246
247
247
// The errata indicates that BERR may be incorrectly detected. It recommends ignoring and
248
248
// clearing the BERR bit instead.
249
249
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 ( ) ) ;
251
251
}
252
252
253
253
Ok ( sr1)
@@ -264,6 +264,8 @@ impl<I2C: Instance> I2c<I2C> {
264
264
// to start a new transaction.
265
265
while self . i2c . cr1 ( ) . read ( ) . stop ( ) . bit_is_set ( ) { }
266
266
267
+ // Clear all pending error bits
268
+ self . i2c . sr1 ( ) . write ( |w| unsafe { w. bits ( 0 ) } ) ;
267
269
// Send a START condition
268
270
self . i2c . cr1 ( ) . modify ( |_, w| w. start ( ) . set_bit ( ) ) ;
269
271
@@ -325,6 +327,8 @@ impl<I2C: Instance> I2c<I2C> {
325
327
// to start a new transaction.
326
328
while self . i2c . cr1 ( ) . read ( ) . stop ( ) . bit_is_set ( ) { }
327
329
330
+ // Clear all pending error bits
331
+ self . i2c . sr1 ( ) . write ( |w| unsafe { w. bits ( 0 ) } ) ;
328
332
// Send a START condition and set ACK bit
329
333
self . i2c
330
334
. cr1 ( )
0 commit comments