aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-stm32/src/spi/mod.rs13
-rw-r--r--embassy-stm32/src/spi/v1.rs8
-rw-r--r--embassy-stm32/src/spi/v2.rs18
-rw-r--r--embassy-stm32/src/spi/v3.rs18
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
617fn 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
617fn finish_dma(regs: Regs) { 630fn 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) };