diff options
| author | Dario Nieuwenhuis <[email protected]> | 2025-09-02 19:46:43 +0000 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-09-02 19:46:43 +0000 |
| commit | 2ef9dfb5122f602255eaa0b3cef440f6f84af33e (patch) | |
| tree | 7080747d146ba95744c24f1c630ae1d0e337961c /embassy-stm32 | |
| parent | 1405b1affa1b81bb50e6a39456793d968d39f63f (diff) | |
| parent | 0835b58deb24482ec7831c2d04d7f73d1abd197b (diff) | |
Merge pull request #4634 from fwolter/fix-i2c-stop
stm32/i2c: fix failure of subsequent transmissions after NACK
Diffstat (limited to 'embassy-stm32')
| -rw-r--r-- | embassy-stm32/CHANGELOG.md | 1 | ||||
| -rw-r--r-- | embassy-stm32/src/i2c/v2.rs | 15 |
2 files changed, 12 insertions, 4 deletions
diff --git a/embassy-stm32/CHANGELOG.md b/embassy-stm32/CHANGELOG.md index 133defcc6..c9be259ea 100644 --- a/embassy-stm32/CHANGELOG.md +++ b/embassy-stm32/CHANGELOG.md | |||
| @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | |||
| 10 | 10 | ||
| 11 | - fix: Fixed STM32H5 builds requiring time feature | 11 | - fix: Fixed STM32H5 builds requiring time feature |
| 12 | - feat: Derive Clone, Copy for QSPI Config | 12 | - feat: Derive Clone, Copy for QSPI Config |
| 13 | - fix: stm32/i2c in master mode (blocking): subsequent transmissions failed after a NACK was received | ||
| 13 | 14 | ||
| 14 | ## 0.4.0 - 2025-08-26 | 15 | ## 0.4.0 - 2025-08-26 |
| 15 | 16 | ||
diff --git a/embassy-stm32/src/i2c/v2.rs b/embassy-stm32/src/i2c/v2.rs index 3b09f1b34..6b20a601b 100644 --- a/embassy-stm32/src/i2c/v2.rs +++ b/embassy-stm32/src/i2c/v2.rs | |||
| @@ -454,7 +454,8 @@ impl<'d, M: Mode, IM: MasterMode> I2c<'d, M, IM> { | |||
| 454 | // (START has been ACKed or last byte when | 454 | // (START has been ACKed or last byte when |
| 455 | // through) | 455 | // through) |
| 456 | if let Err(err) = self.wait_txis(timeout) { | 456 | if let Err(err) = self.wait_txis(timeout) { |
| 457 | if send_stop { | 457 | if send_stop && err != Error::Nack { |
| 458 | // STOP is sent automatically if a NACK was received | ||
| 458 | self.master_stop(); | 459 | self.master_stop(); |
| 459 | } | 460 | } |
| 460 | return Err(err); | 461 | return Err(err); |
| @@ -548,7 +549,9 @@ impl<'d, M: Mode, IM: MasterMode> I2c<'d, M, IM> { | |||
| 548 | (idx != last_slice_index) || (slice_len > 255), | 549 | (idx != last_slice_index) || (slice_len > 255), |
| 549 | timeout, | 550 | timeout, |
| 550 | ) { | 551 | ) { |
| 551 | self.master_stop(); | 552 | if err != Error::Nack { |
| 553 | self.master_stop(); | ||
| 554 | } | ||
| 552 | return Err(err); | 555 | return Err(err); |
| 553 | } | 556 | } |
| 554 | } | 557 | } |
| @@ -561,7 +564,9 @@ impl<'d, M: Mode, IM: MasterMode> I2c<'d, M, IM> { | |||
| 561 | (number != last_chunk_idx) || (idx != last_slice_index), | 564 | (number != last_chunk_idx) || (idx != last_slice_index), |
| 562 | timeout, | 565 | timeout, |
| 563 | ) { | 566 | ) { |
| 564 | self.master_stop(); | 567 | if err != Error::Nack { |
| 568 | self.master_stop(); | ||
| 569 | } | ||
| 565 | return Err(err); | 570 | return Err(err); |
| 566 | } | 571 | } |
| 567 | } | 572 | } |
| @@ -571,7 +576,9 @@ impl<'d, M: Mode, IM: MasterMode> I2c<'d, M, IM> { | |||
| 571 | // (START has been ACKed or last byte when | 576 | // (START has been ACKed or last byte when |
| 572 | // through) | 577 | // through) |
| 573 | if let Err(err) = self.wait_txis(timeout) { | 578 | if let Err(err) = self.wait_txis(timeout) { |
| 574 | self.master_stop(); | 579 | if err != Error::Nack { |
| 580 | self.master_stop(); | ||
| 581 | } | ||
| 575 | return Err(err); | 582 | return Err(err); |
| 576 | } | 583 | } |
| 577 | 584 | ||
