mirror of
https://github.com/embassy-rs/embassy.git
synced 2025-09-28 04:40:39 +00:00
In fixing a different timing related bug, #3887, a new bug was introduced causing I2C reads longer than 255 bytes to timeout for some I2C devices, #3888. The issue was caused by incorrect branch order, and poll function being called unnecessarily. Async I2C read poll function now only looks for I2C transfer complete reload (TCR) interrupts, intead of TCR and transfer complete (TC) interrupts, since TC interrupts are not raised when AUTOEND bit is set.
This commit is contained in:
parent
a44abaf7e4
commit
47869d122a
@ -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));
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user