aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-stm32/CHANGELOG.md1
-rw-r--r--embassy-stm32/src/i2c/v2.rs15
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