diff options
| author | Dario Nieuwenhuis <[email protected]> | 2023-03-01 03:08:05 +0100 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-03-01 03:08:05 +0100 |
| commit | 351e4407ef2c726ce78638306a0ebcbdf580d72c (patch) | |
| tree | 63786223379627e84585e7c8758a63d0a90253ae | |
| parent | 66ca57312f62bdf83cd30a9d2449962416fcd99c (diff) | |
| parent | aabc275186aff8a640ee6591c3572c00f508b3b7 (diff) | |
Merge pull request #1252 from pattop/stm32_spi_fifo_fix
stm32/spi: fix occasional data corruption
| -rw-r--r-- | embassy-stm32/src/spi/mod.rs | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/embassy-stm32/src/spi/mod.rs b/embassy-stm32/src/spi/mod.rs index e5ba746e4..1f1708873 100644 --- a/embassy-stm32/src/spi/mod.rs +++ b/embassy-stm32/src/spi/mod.rs | |||
| @@ -456,13 +456,14 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | |||
| 456 | T::REGS.cr1().modify(|w| { | 456 | T::REGS.cr1().modify(|w| { |
| 457 | w.set_spe(false); | 457 | w.set_spe(false); |
| 458 | }); | 458 | }); |
| 459 | set_rxdmaen(T::REGS, true); | ||
| 460 | } | 459 | } |
| 461 | 460 | ||
| 462 | // SPIv3 clears rxfifo on SPE=0 | 461 | // SPIv3 clears rxfifo on SPE=0 |
| 463 | #[cfg(not(any(spi_v3, spi_v4)))] | 462 | #[cfg(not(any(spi_v3, spi_v4)))] |
| 464 | flush_rx_fifo(T::REGS); | 463 | flush_rx_fifo(T::REGS); |
| 465 | 464 | ||
| 465 | set_rxdmaen(T::REGS, true); | ||
| 466 | |||
| 466 | let clock_byte_count = data.len(); | 467 | let clock_byte_count = data.len(); |
| 467 | 468 | ||
| 468 | let rx_request = self.rxdma.request(); | 469 | let rx_request = self.rxdma.request(); |
| @@ -510,13 +511,14 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | |||
| 510 | T::REGS.cr1().modify(|w| { | 511 | T::REGS.cr1().modify(|w| { |
| 511 | w.set_spe(false); | 512 | w.set_spe(false); |
| 512 | }); | 513 | }); |
| 513 | set_rxdmaen(T::REGS, true); | ||
| 514 | } | 514 | } |
| 515 | 515 | ||
| 516 | // SPIv3 clears rxfifo on SPE=0 | 516 | // SPIv3 clears rxfifo on SPE=0 |
| 517 | #[cfg(not(any(spi_v3, spi_v4)))] | 517 | #[cfg(not(any(spi_v3, spi_v4)))] |
| 518 | flush_rx_fifo(T::REGS); | 518 | flush_rx_fifo(T::REGS); |
| 519 | 519 | ||
| 520 | set_rxdmaen(T::REGS, true); | ||
| 521 | |||
| 520 | let rx_request = self.rxdma.request(); | 522 | let rx_request = self.rxdma.request(); |
| 521 | let rx_src = T::REGS.rx_ptr(); | 523 | let rx_src = T::REGS.rx_ptr(); |
| 522 | unsafe { self.rxdma.start_read(rx_request, rx_src, read, Default::default()) }; | 524 | unsafe { self.rxdma.start_read(rx_request, rx_src, read, Default::default()) }; |
