diff --git a/embassy-stm32/src/i2c/v2.rs b/embassy-stm32/src/i2c/v2.rs index 1f53a995d..50a25754e 100644 --- a/embassy-stm32/src/i2c/v2.rs +++ b/embassy-stm32/src/i2c/v2.rs @@ -617,9 +617,10 @@ impl<'d> I2c<'d, Async> { restart, timeout, )?; - } else if remaining_len == 0 { - return Poll::Ready(Ok(())); - } else if !(isr.tcr() || isr.tc()) { + if total_len <= 255 { + return Poll::Ready(Ok(())); + } + } else if isr.tcr() { // poll_fn was woken without an interrupt present return Poll::Pending; } else { @@ -628,6 +629,11 @@ impl<'d> I2c<'d, Async> { if let Err(e) = Self::master_continue(self.info, remaining_len.min(255), !last_piece, timeout) { return Poll::Ready(Err(e)); } + // Return here if we are on last chunk, + // end of transfer will be awaited with the DMA below + if last_piece { + return Poll::Ready(Ok(())); + } self.info.regs.cr1().modify(|w| w.set_tcie(true)); }