aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2022-03-15 02:36:34 +0100
committerDario Nieuwenhuis <[email protected]>2022-03-15 02:36:34 +0100
commit4579192832e09efaa657fea1fc975d0548499d2a (patch)
tree984bb4779942a247e5741c975f65a344d09a2c35
parent3d6592d22d37402509bd43d88a0a979683f74b04 (diff)
stm32/spi: fix hang in SPIv3 by not waiting for rxfifo empty in finish_dma.
-rw-r--r--embassy-stm32/src/spi/mod.rs33
1 files changed, 8 insertions, 25 deletions
diff --git a/embassy-stm32/src/spi/mod.rs b/embassy-stm32/src/spi/mod.rs
index 7fa30cb61..1806fb369 100644
--- a/embassy-stm32/src/spi/mod.rs
+++ b/embassy-stm32/src/spi/mod.rs
@@ -440,9 +440,6 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
440 440
441 tx_f.await; 441 tx_f.await;
442 442
443 // flush here otherwise `finish_dma` hangs waiting for the rx fifo to empty
444 flush_rx_fifo(T::REGS);
445
446 finish_dma(T::REGS); 443 finish_dma(T::REGS);
447 444
448 Ok(()) 445 Ok(())
@@ -726,26 +723,6 @@ fn spin_until_rx_ready(regs: Regs) -> Result<(), Error> {
726 } 723 }
727} 724}
728 725
729fn spin_until_idle(regs: Regs) {
730 #[cfg(any(spi_v1, spi_f1))]
731 unsafe {
732 while regs.sr().read().bsy() {}
733 }
734
735 #[cfg(spi_v2)]
736 unsafe {
737 while regs.sr().read().ftlvl() > 0 {}
738 while regs.sr().read().frlvl() > 0 {}
739 while regs.sr().read().bsy() {}
740 }
741
742 #[cfg(spi_v3)]
743 unsafe {
744 while !regs.sr().read().txc() {}
745 while regs.sr().read().rxplvl().0 > 0 {}
746 }
747}
748
749fn flush_rx_fifo(regs: Regs) { 726fn flush_rx_fifo(regs: Regs) {
750 unsafe { 727 unsafe {
751 #[cfg(not(spi_v3))] 728 #[cfg(not(spi_v3))]
@@ -786,9 +763,15 @@ fn set_rxdmaen(regs: Regs, val: bool) {
786} 763}
787 764
788fn finish_dma(regs: Regs) { 765fn finish_dma(regs: Regs) {
789 spin_until_idle(regs);
790
791 unsafe { 766 unsafe {
767 #[cfg(spi_v2)]
768 while regs.sr().read().ftlvl() > 0 {}
769
770 #[cfg(spi_v3)]
771 while !regs.sr().read().txc() {}
772 #[cfg(not(spi_v3))]
773 while regs.sr().read().bsy() {}
774
792 regs.cr1().modify(|w| { 775 regs.cr1().modify(|w| {
793 w.set_spe(false); 776 w.set_spe(false);
794 }); 777 });