diff --git a/ci.sh b/ci.sh index 5b63c507b..e2d3db546 100755 --- a/ci.sh +++ b/ci.sh @@ -328,8 +328,9 @@ rm out/tests/stm32wb55rg/wpan_ble # unstable, I think it's running out of RAM? rm out/tests/stm32f207zg/eth -# temporarily disabled, hard faults for unknown reasons +# temporarily disabled, flaky. rm out/tests/stm32f207zg/usart_rx_ringbuffered +rm out/tests/stm32l152re/usart_rx_ringbuffered # doesn't work, gives "noise error", no idea why. usart_dma does pass. rm out/tests/stm32u5a5zj/usart 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, _)) => {}