diff options
| author | Bob McWhirter <[email protected]> | 2021-07-22 09:28:42 -0400 |
|---|---|---|
| committer | Bob McWhirter <[email protected]> | 2021-07-23 13:22:39 -0400 |
| commit | 473a83a937ed03c844da8dd72bc6a1dc089367e1 (patch) | |
| tree | e2aac36a4ba0caf51f2b7ee50369e712e11b5caf | |
| parent | 67283c0cbd595929cc82ce1de7bf6434077227a4 (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.rs | 7 | ||||
| -rw-r--r-- | embassy-stm32/src/spi/v2.rs | 7 | ||||
| -rw-r--r-- | embassy-stm32/src/spi/v3.rs | 3 | ||||
| -rw-r--r-- | embassy-traits/src/spi.rs | 3 |
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], |
