Skip to content

Commit 585dd0f

Browse files
authored
Merge pull request #829 from stm32-rs/i2s-sr-write
Use write instead of modify to clear I2C::SR flags
2 parents ed88ea1 + 571c3a3 commit 585dd0f

File tree

2 files changed

+11
-6
lines changed

2 files changed

+11
-6
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
77

88
## [Unreleased]
99

10+
- Use `write` instead of `modify` to clear flags
1011
- Bump `stm32f4-staging`
1112

1213
## [v0.22.1] - 2024-11-03

src/i2c.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)