diff options
| -rw-r--r-- | embassy-nrf/src/uarte.rs | 43 |
1 files changed, 26 insertions, 17 deletions
diff --git a/embassy-nrf/src/uarte.rs b/embassy-nrf/src/uarte.rs index 494b92df3..895ac11c3 100644 --- a/embassy-nrf/src/uarte.rs +++ b/embassy-nrf/src/uarte.rs | |||
| @@ -170,6 +170,13 @@ where | |||
| 170 | trace!("endrx"); | 170 | trace!("endrx"); |
| 171 | let len = uarte.rxd.amount.read().bits(); | 171 | let len = uarte.rxd.amount.read().bits(); |
| 172 | compiler_fence(Ordering::SeqCst); | 172 | compiler_fence(Ordering::SeqCst); |
| 173 | |||
| 174 | if uarte.events_rxstarted.read().bits() != 0 { | ||
| 175 | // The ENDRX was signal triggered because DMA buffer is full. | ||
| 176 | uarte.events_rxstarted.reset(); | ||
| 177 | try_disable = true; | ||
| 178 | } | ||
| 179 | |||
| 173 | T::state().rx_done.signal(len); | 180 | T::state().rx_done.signal(len); |
| 174 | } | 181 | } |
| 175 | 182 | ||
| @@ -227,6 +234,7 @@ impl<T: Instance> embassy::uart::Uart for Uarte<T> { | |||
| 227 | // `mem::forget()` on a previous future after polling it once. | 234 | // `mem::forget()` on a previous future after polling it once. |
| 228 | assert!(!self.rx_started()); | 235 | assert!(!self.rx_started()); |
| 229 | 236 | ||
| 237 | T::state().rx_done.reset(); | ||
| 230 | self.enable(); | 238 | self.enable(); |
| 231 | 239 | ||
| 232 | ReceiveFuture { | 240 | ReceiveFuture { |
| @@ -334,27 +342,28 @@ where | |||
| 334 | fn poll(self: core::pin::Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> { | 342 | fn poll(self: core::pin::Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> { |
| 335 | let Self { uarte, buf } = unsafe { self.get_unchecked_mut() }; | 343 | let Self { uarte, buf } = unsafe { self.get_unchecked_mut() }; |
| 336 | 344 | ||
| 337 | if !uarte.rx_started() { | 345 | match T::state().rx_done.poll_wait(cx) { |
| 338 | let uarte = &uarte.instance; | 346 | Poll::Pending if !uarte.rx_started() => { |
| 347 | let uarte = &uarte.instance; | ||
| 339 | 348 | ||
| 340 | T::state().rx_done.reset(); | 349 | let ptr = buf.as_ptr(); |
| 341 | 350 | let len = buf.len(); | |
| 342 | let ptr = buf.as_ptr(); | 351 | assert!(len <= EASY_DMA_SIZE); |
| 343 | let len = buf.len(); | ||
| 344 | assert!(len <= EASY_DMA_SIZE); | ||
| 345 | 352 | ||
| 346 | compiler_fence(Ordering::SeqCst); | 353 | compiler_fence(Ordering::SeqCst); |
| 347 | uarte.rxd.ptr.write(|w| unsafe { w.ptr().bits(ptr as u32) }); | 354 | uarte.rxd.ptr.write(|w| unsafe { w.ptr().bits(ptr as u32) }); |
| 348 | uarte | 355 | uarte |
| 349 | .rxd | 356 | .rxd |
| 350 | .maxcnt | 357 | .maxcnt |
| 351 | .write(|w| unsafe { w.maxcnt().bits(len as _) }); | 358 | .write(|w| unsafe { w.maxcnt().bits(len as _) }); |
| 352 | 359 | ||
| 353 | trace!("startrx"); | 360 | trace!("startrx"); |
| 354 | uarte.tasks_startrx.write(|w| unsafe { w.bits(1) }); | 361 | uarte.tasks_startrx.write(|w| unsafe { w.bits(1) }); |
| 362 | Poll::Pending | ||
| 363 | } | ||
| 364 | Poll::Pending => Poll::Pending, | ||
| 365 | Poll::Ready(_) => Poll::Ready(Ok(())), | ||
| 355 | } | 366 | } |
| 356 | |||
| 357 | T::state().rx_done.poll_wait(cx).map(|_| Ok(())) | ||
| 358 | } | 367 | } |
| 359 | } | 368 | } |
| 360 | 369 | ||
