aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2023-03-01 03:08:05 +0100
committerGitHub <[email protected]>2023-03-01 03:08:05 +0100
commit351e4407ef2c726ce78638306a0ebcbdf580d72c (patch)
tree63786223379627e84585e7c8758a63d0a90253ae
parent66ca57312f62bdf83cd30a9d2449962416fcd99c (diff)
parentaabc275186aff8a640ee6591c3572c00f508b3b7 (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.rs6
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()) };