aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBob McWhirter <[email protected]>2021-07-22 09:28:42 -0400
committerBob McWhirter <[email protected]>2021-07-23 13:22:39 -0400
commit473a83a937ed03c844da8dd72bc6a1dc089367e1 (patch)
treee2aac36a4ba0caf51f2b7ee50369e712e11b5caf
parent67283c0cbd595929cc82ce1de7bf6434077227a4 (diff)
Adjust how we deal with read/write being different length.
Including some docs about it. Removing the Rx-enablement for write-only operations.
-rw-r--r--embassy-stm32/src/spi/v1.rs7
-rw-r--r--embassy-stm32/src/spi/v2.rs7
-rw-r--r--embassy-stm32/src/spi/v3.rs3
-rw-r--r--embassy-traits/src/spi.rs3
4 files changed, 11 insertions, 9 deletions
diff --git a/embassy-stm32/src/spi/v1.rs b/embassy-stm32/src/spi/v1.rs
index 72bde898d..b4ebe5a6d 100644
--- a/embassy-stm32/src/spi/v1.rs
+++ b/embassy-stm32/src/spi/v1.rs
@@ -151,9 +151,6 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
151 T::regs().cr1().modify(|w| { 151 T::regs().cr1().modify(|w| {
152 w.set_spe(false); 152 w.set_spe(false);
153 }); 153 });
154 T::regs().cr2().modify(|reg| {
155 reg.set_rxdmaen(true);
156 });
157 } 154 }
158 self.set_word_size(WordSize::EightBit); 155 self.set_word_size(WordSize::EightBit);
159 156
@@ -233,6 +230,8 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
233 Tx: TxDmaChannel<T>, 230 Tx: TxDmaChannel<T>,
234 Rx: RxDmaChannel<T>, 231 Rx: RxDmaChannel<T>,
235 { 232 {
233 assert!(read.len() >= write.len());
234
236 unsafe { 235 unsafe {
237 T::regs().cr1().modify(|w| { 236 T::regs().cr1().modify(|w| {
238 w.set_spe(false); 237 w.set_spe(false);
@@ -245,7 +244,7 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
245 244
246 let rx_request = self.rxdma.request(); 245 let rx_request = self.rxdma.request();
247 let rx_src = T::regs().dr().ptr() as *mut u8; 246 let rx_src = T::regs().dr().ptr() as *mut u8;
248 let rx_f = self.rxdma.read(rx_request, rx_src, read); 247 let rx_f = self.rxdma.read(rx_request, rx_src, read[0..write.len()]);
249 248
250 let tx_request = self.txdma.request(); 249 let tx_request = self.txdma.request();
251 let tx_dst = T::regs().dr().ptr() as *mut u8; 250 let tx_dst = T::regs().dr().ptr() as *mut u8;
diff --git a/embassy-stm32/src/spi/v2.rs b/embassy-stm32/src/spi/v2.rs
index 400fd89af..9ca3e3c1c 100644
--- a/embassy-stm32/src/spi/v2.rs
+++ b/embassy-stm32/src/spi/v2.rs
@@ -163,9 +163,6 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
163 T::regs().cr1().modify(|w| { 163 T::regs().cr1().modify(|w| {
164 w.set_spe(false); 164 w.set_spe(false);
165 }); 165 });
166 T::regs().cr2().modify(|reg| {
167 reg.set_rxdmaen(true);
168 });
169 } 166 }
170 Self::set_word_size(WordSize::EightBit); 167 Self::set_word_size(WordSize::EightBit);
171 168
@@ -245,6 +242,8 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
245 Tx: TxDmaChannel<T>, 242 Tx: TxDmaChannel<T>,
246 Rx: RxDmaChannel<T>, 243 Rx: RxDmaChannel<T>,
247 { 244 {
245 assert!(read.len() >= write.len());
246
248 unsafe { 247 unsafe {
249 T::regs().cr1().modify(|w| { 248 T::regs().cr1().modify(|w| {
250 w.set_spe(false); 249 w.set_spe(false);
@@ -257,7 +256,7 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
257 256
258 let rx_request = self.rxdma.request(); 257 let rx_request = self.rxdma.request();
259 let rx_src = T::regs().dr().ptr() as *mut u8; 258 let rx_src = T::regs().dr().ptr() as *mut u8;
260 let rx_f = self.rxdma.read(rx_request, rx_src, read); 259 let rx_f = self.rxdma.read(rx_request, rx_src, read[0..write.len()]);
261 260
262 let tx_request = self.txdma.request(); 261 let tx_request = self.txdma.request();
263 let tx_dst = T::regs().dr().ptr() as *mut u8; 262 let tx_dst = T::regs().dr().ptr() as *mut u8;
diff --git a/embassy-stm32/src/spi/v3.rs b/embassy-stm32/src/spi/v3.rs
index 2d6f4a28f..f433d7f9c 100644
--- a/embassy-stm32/src/spi/v3.rs
+++ b/embassy-stm32/src/spi/v3.rs
@@ -207,7 +207,6 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
207 f.await; 207 f.await;
208 unsafe { 208 unsafe {
209 T::regs().cfg1().modify(|reg| { 209 T::regs().cfg1().modify(|reg| {
210 reg.set_rxdmaen(false);
211 reg.set_txdmaen(false); 210 reg.set_txdmaen(false);
212 }); 211 });
213 T::regs().cr1().modify(|w| { 212 T::regs().cr1().modify(|w| {
@@ -278,6 +277,8 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
278 Tx: TxDmaChannel<T>, 277 Tx: TxDmaChannel<T>,
279 Rx: RxDmaChannel<T>, 278 Rx: RxDmaChannel<T>,
280 { 279 {
280 assert!(read.len() >= write.len());
281
281 Self::set_word_size(WordSize::EightBit); 282 Self::set_word_size(WordSize::EightBit);
282 unsafe { 283 unsafe {
283 T::regs().cr1().modify(|w| { 284 T::regs().cr1().modify(|w| {
diff --git a/embassy-traits/src/spi.rs b/embassy-traits/src/spi.rs
index 9d044dfd3..04322dddc 100644
--- a/embassy-traits/src/spi.rs
+++ b/embassy-traits/src/spi.rs
@@ -29,6 +29,9 @@ pub trait FullDuplex<Word>: Spi<Word> + Write<Word> + Read<Word> {
29 where 29 where
30 Self: 'a; 30 Self: 'a;
31 31
32 /// The `read` array must be at least as long as the `write` array,
33 /// but is guaranteed to only be filled with bytes equal to the
34 /// length of the `write` array.
32 fn read_write<'a>( 35 fn read_write<'a>(
33 &'a mut self, 36 &'a mut self,
34 read: &'a mut [Word], 37 read: &'a mut [Word],