diff options
| author | Dario Nieuwenhuis <[email protected]> | 2022-03-15 02:36:34 +0100 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2022-03-15 02:36:34 +0100 |
| commit | 4579192832e09efaa657fea1fc975d0548499d2a (patch) | |
| tree | 984bb4779942a247e5741c975f65a344d09a2c35 | |
| parent | 3d6592d22d37402509bd43d88a0a979683f74b04 (diff) | |
stm32/spi: fix hang in SPIv3 by not waiting for rxfifo empty in finish_dma.
| -rw-r--r-- | embassy-stm32/src/spi/mod.rs | 33 |
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 | ||
| 729 | fn 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 | |||
| 749 | fn flush_rx_fifo(regs: Regs) { | 726 | fn 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 | ||
| 788 | fn finish_dma(regs: Regs) { | 765 | fn 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 | }); |
