From b0ba604ba5ab1ba866df71b7e11099a3b1ceee3f Mon Sep 17 00:00:00 2001 From: Badr Bouslikhin Date: Fri, 7 Mar 2025 18:00:52 +0100 Subject: [PATCH] fix(stm32): handle half-duplex in ringbuffered read --- embassy-stm32/src/usart/mod.rs | 1 - embassy-stm32/src/usart/ringbuffered.rs | 10 ++++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/embassy-stm32/src/usart/mod.rs b/embassy-stm32/src/usart/mod.rs index 5b7f8dc26..10e3ea88b 100644 --- a/embassy-stm32/src/usart/mod.rs +++ b/embassy-stm32/src/usart/mod.rs @@ -711,7 +711,6 @@ impl<'d> UartRx<'d, Async> { // make sure USART state is restored to neutral state when this future is dropped let on_drop = OnDrop::new(move || { - // defmt::trace!("Clear all USART interrupts and DMA Read Request"); // clear all interrupts and DMA Rx Request r.cr1().modify(|w| { // disable RXNE interrupt diff --git a/embassy-stm32/src/usart/ringbuffered.rs b/embassy-stm32/src/usart/ringbuffered.rs index 8e42d5917..eaa9424c5 100644 --- a/embassy-stm32/src/usart/ringbuffered.rs +++ b/embassy-stm32/src/usart/ringbuffered.rs @@ -150,6 +150,16 @@ impl<'d> RingBufferedUartRx<'d> { pub async fn read(&mut self, buf: &mut [u8]) -> Result { self.start_dma_or_check_errors()?; + // In half-duplex mode, we need to disable the Transmitter and enable the Receiver + // since they can't operate simultaneously on the shared line + let r = self.info.regs; + if r.cr3().read().hdsel() && r.cr1().read().te() { + r.cr1().modify(|reg| { + reg.set_re(true); + reg.set_te(false); + }); + } + loop { match self.ring_buf.read(buf) { Ok((0, _)) => {}