diff options
| author | Grant Miller <[email protected]> | 2022-03-14 15:10:56 -0500 |
|---|---|---|
| committer | Grant Miller <[email protected]> | 2022-03-14 15:56:08 -0500 |
| commit | 444b37fcdf744128347fd685a14874f44e5e05af (patch) | |
| tree | 68753baabe5043c2551baec60240f23a0e0e6690 | |
| parent | 683c11f3997bc550d5ed716ee6e3059af4a8051c (diff) | |
Add `flush_rx_fifo` function
| -rw-r--r-- | embassy-stm32/src/spi/mod.rs | 13 | ||||
| -rw-r--r-- | embassy-stm32/src/spi/v1.rs | 8 | ||||
| -rw-r--r-- | embassy-stm32/src/spi/v2.rs | 18 | ||||
| -rw-r--r-- | embassy-stm32/src/spi/v3.rs | 18 |
4 files changed, 37 insertions, 20 deletions
diff --git a/embassy-stm32/src/spi/mod.rs b/embassy-stm32/src/spi/mod.rs index 3352b24d2..24efb09d2 100644 --- a/embassy-stm32/src/spi/mod.rs +++ b/embassy-stm32/src/spi/mod.rs | |||
| @@ -614,6 +614,19 @@ fn spin_until_idle(regs: Regs) { | |||
| 614 | } | 614 | } |
| 615 | } | 615 | } |
| 616 | 616 | ||
| 617 | fn flush_rx_fifo(regs: Regs) { | ||
| 618 | unsafe { | ||
| 619 | #[cfg(not(spi_v3))] | ||
| 620 | while regs.sr().read().rxne() { | ||
| 621 | let _ = regs.dr().read(); | ||
| 622 | } | ||
| 623 | #[cfg(spi_v3)] | ||
| 624 | while regs.sr().read().rxp() { | ||
| 625 | let _ = regs.rxdr().read(); | ||
| 626 | } | ||
| 627 | } | ||
| 628 | } | ||
| 629 | |||
| 617 | fn finish_dma(regs: Regs) { | 630 | fn finish_dma(regs: Regs) { |
| 618 | spin_until_idle(regs); | 631 | spin_until_idle(regs); |
| 619 | 632 | ||
diff --git a/embassy-stm32/src/spi/v1.rs b/embassy-stm32/src/spi/v1.rs index 33cf9c50e..19562b8a0 100644 --- a/embassy-stm32/src/spi/v1.rs +++ b/embassy-stm32/src/spi/v1.rs | |||
| @@ -17,6 +17,10 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | |||
| 17 | }); | 17 | }); |
| 18 | } | 18 | } |
| 19 | 19 | ||
| 20 | // TODO: This is unnecessary in some versions because | ||
| 21 | // clearing SPE automatically clears the fifos | ||
| 22 | flush_rx_fifo(T::regs()); | ||
| 23 | |||
| 20 | let tx_request = self.txdma.request(); | 24 | let tx_request = self.txdma.request(); |
| 21 | let tx_dst = T::regs().tx_ptr(); | 25 | let tx_dst = T::regs().tx_ptr(); |
| 22 | unsafe { self.txdma.start_write(tx_request, write, tx_dst) } | 26 | unsafe { self.txdma.start_write(tx_request, write, tx_dst) } |
| @@ -110,6 +114,10 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | |||
| 110 | }); | 114 | }); |
| 111 | } | 115 | } |
| 112 | 116 | ||
| 117 | // TODO: This is unnecessary in some versions because | ||
| 118 | // clearing SPE automatically clears the fifos | ||
| 119 | flush_rx_fifo(T::regs()); | ||
| 120 | |||
| 113 | let rx_request = self.rxdma.request(); | 121 | let rx_request = self.rxdma.request(); |
| 114 | let rx_src = T::regs().rx_ptr(); | 122 | let rx_src = T::regs().rx_ptr(); |
| 115 | unsafe { self.rxdma.start_read(rx_request, rx_src, read) }; | 123 | unsafe { self.rxdma.start_read(rx_request, rx_src, read) }; |
diff --git a/embassy-stm32/src/spi/v2.rs b/embassy-stm32/src/spi/v2.rs index 7ffc52be8..19562b8a0 100644 --- a/embassy-stm32/src/spi/v2.rs +++ b/embassy-stm32/src/spi/v2.rs | |||
| @@ -15,13 +15,12 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | |||
| 15 | T::regs().cr1().modify(|w| { | 15 | T::regs().cr1().modify(|w| { |
| 16 | w.set_spe(false); | 16 | w.set_spe(false); |
| 17 | }); | 17 | }); |
| 18 | |||
| 19 | // Flush the read buffer to avoid errornous data from being read | ||
| 20 | while T::regs().sr().read().rxne() { | ||
| 21 | let _ = T::regs().dr().read(); | ||
| 22 | } | ||
| 23 | } | 18 | } |
| 24 | 19 | ||
| 20 | // TODO: This is unnecessary in some versions because | ||
| 21 | // clearing SPE automatically clears the fifos | ||
| 22 | flush_rx_fifo(T::regs()); | ||
| 23 | |||
| 25 | let tx_request = self.txdma.request(); | 24 | let tx_request = self.txdma.request(); |
| 26 | let tx_dst = T::regs().tx_ptr(); | 25 | let tx_dst = T::regs().tx_ptr(); |
| 27 | unsafe { self.txdma.start_write(tx_request, write, tx_dst) } | 26 | unsafe { self.txdma.start_write(tx_request, write, tx_dst) } |
| @@ -113,13 +112,12 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | |||
| 113 | T::regs().cr2().modify(|reg| { | 112 | T::regs().cr2().modify(|reg| { |
| 114 | reg.set_rxdmaen(true); | 113 | reg.set_rxdmaen(true); |
| 115 | }); | 114 | }); |
| 116 | |||
| 117 | // Flush the read buffer to avoid errornous data from being read | ||
| 118 | while T::regs().sr().read().rxne() { | ||
| 119 | let _ = T::regs().dr().read(); | ||
| 120 | } | ||
| 121 | } | 115 | } |
| 122 | 116 | ||
| 117 | // TODO: This is unnecessary in some versions because | ||
| 118 | // clearing SPE automatically clears the fifos | ||
| 119 | flush_rx_fifo(T::regs()); | ||
| 120 | |||
| 123 | let rx_request = self.rxdma.request(); | 121 | let rx_request = self.rxdma.request(); |
| 124 | let rx_src = T::regs().rx_ptr(); | 122 | let rx_src = T::regs().rx_ptr(); |
| 125 | unsafe { self.rxdma.start_read(rx_request, rx_src, read) }; | 123 | unsafe { self.rxdma.start_read(rx_request, rx_src, read) }; |
diff --git a/embassy-stm32/src/spi/v3.rs b/embassy-stm32/src/spi/v3.rs index 9e766cfdb..5c7472cc0 100644 --- a/embassy-stm32/src/spi/v3.rs +++ b/embassy-stm32/src/spi/v3.rs | |||
| @@ -15,13 +15,12 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | |||
| 15 | T::regs().cr1().modify(|w| { | 15 | T::regs().cr1().modify(|w| { |
| 16 | w.set_spe(false); | 16 | w.set_spe(false); |
| 17 | }); | 17 | }); |
| 18 | |||
| 19 | // Flush the read buffer to avoid errornous data from being read | ||
| 20 | while T::regs().sr().read().rxp() { | ||
| 21 | let _ = T::regs().rxdr().read(); | ||
| 22 | } | ||
| 23 | } | 18 | } |
| 24 | 19 | ||
| 20 | // TODO: This is unnecessary in some versions because | ||
| 21 | // clearing SPE automatically clears the fifos | ||
| 22 | flush_rx_fifo(T::regs()); | ||
| 23 | |||
| 25 | let tx_request = self.txdma.request(); | 24 | let tx_request = self.txdma.request(); |
| 26 | let tx_dst = T::regs().tx_ptr(); | 25 | let tx_dst = T::regs().tx_ptr(); |
| 27 | unsafe { self.txdma.start_write(tx_request, write, tx_dst) } | 26 | unsafe { self.txdma.start_write(tx_request, write, tx_dst) } |
| @@ -119,13 +118,12 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | |||
| 119 | T::regs().cfg1().modify(|reg| { | 118 | T::regs().cfg1().modify(|reg| { |
| 120 | reg.set_rxdmaen(true); | 119 | reg.set_rxdmaen(true); |
| 121 | }); | 120 | }); |
| 122 | |||
| 123 | // Flush the read buffer to avoid errornous data from being read | ||
| 124 | while T::regs().sr().read().rxp() { | ||
| 125 | let _ = T::regs().rxdr().read(); | ||
| 126 | } | ||
| 127 | } | 121 | } |
| 128 | 122 | ||
| 123 | // TODO: This is unnecessary in some versions because | ||
| 124 | // clearing SPE automatically clears the fifos | ||
| 125 | flush_rx_fifo(T::regs()); | ||
| 126 | |||
| 129 | let rx_request = self.rxdma.request(); | 127 | let rx_request = self.rxdma.request(); |
| 130 | let rx_src = T::regs().rx_ptr(); | 128 | let rx_src = T::regs().rx_ptr(); |
| 131 | unsafe { self.rxdma.start_read(rx_request, rx_src, read) }; | 129 | unsafe { self.rxdma.start_read(rx_request, rx_src, read) }; |
