diff options
| author | Badr Bouslikhin <[email protected]> | 2025-03-07 18:00:52 +0100 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2025-04-06 23:52:39 +0200 |
| commit | b0ba604ba5ab1ba866df71b7e11099a3b1ceee3f (patch) | |
| tree | 1db3c53c7d580d9d83872f0106234b7ecb3cb765 | |
| parent | 668f5d42c3b444dfd5921cadb9245be65a14bb40 (diff) | |
fix(stm32): handle half-duplex in ringbuffered read
| -rw-r--r-- | embassy-stm32/src/usart/mod.rs | 1 | ||||
| -rw-r--r-- | embassy-stm32/src/usart/ringbuffered.rs | 10 |
2 files changed, 10 insertions, 1 deletions
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> { | |||
| 711 | 711 | ||
| 712 | // make sure USART state is restored to neutral state when this future is dropped | 712 | // make sure USART state is restored to neutral state when this future is dropped |
| 713 | let on_drop = OnDrop::new(move || { | 713 | let on_drop = OnDrop::new(move || { |
| 714 | // defmt::trace!("Clear all USART interrupts and DMA Read Request"); | ||
| 715 | // clear all interrupts and DMA Rx Request | 714 | // clear all interrupts and DMA Rx Request |
| 716 | r.cr1().modify(|w| { | 715 | r.cr1().modify(|w| { |
| 717 | // disable RXNE interrupt | 716 | // 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> { | |||
| 150 | pub async fn read(&mut self, buf: &mut [u8]) -> Result<usize, Error> { | 150 | pub async fn read(&mut self, buf: &mut [u8]) -> Result<usize, Error> { |
| 151 | self.start_dma_or_check_errors()?; | 151 | self.start_dma_or_check_errors()?; |
| 152 | 152 | ||
| 153 | // In half-duplex mode, we need to disable the Transmitter and enable the Receiver | ||
| 154 | // since they can't operate simultaneously on the shared line | ||
| 155 | let r = self.info.regs; | ||
| 156 | if r.cr3().read().hdsel() && r.cr1().read().te() { | ||
| 157 | r.cr1().modify(|reg| { | ||
| 158 | reg.set_re(true); | ||
| 159 | reg.set_te(false); | ||
| 160 | }); | ||
| 161 | } | ||
| 162 | |||
| 153 | loop { | 163 | loop { |
| 154 | match self.ring_buf.read(buf) { | 164 | match self.ring_buf.read(buf) { |
| 155 | Ok((0, _)) => {} | 165 | Ok((0, _)) => {} |
