diff options
| author | Grant Miller <[email protected]> | 2021-12-06 14:24:02 -0600 |
|---|---|---|
| committer | Grant Miller <[email protected]> | 2021-12-06 14:24:02 -0600 |
| commit | aeb69a76651b2a06cc74b15ee926a0797a3536f4 (patch) | |
| tree | b248d85846473c87deee7c92640056b9902b7dc3 | |
| parent | d51885c0eb5bc0d46db49c7ffd8f58128e5c983e (diff) | |
Track current word size in v2 and v3 also
| -rw-r--r-- | embassy-stm32/src/spi/v1.rs | 2 | ||||
| -rw-r--r-- | embassy-stm32/src/spi/v2.rs | 22 | ||||
| -rw-r--r-- | embassy-stm32/src/spi/v3.rs | 22 |
3 files changed, 29 insertions, 17 deletions
diff --git a/embassy-stm32/src/spi/v1.rs b/embassy-stm32/src/spi/v1.rs index 08bee758b..a41c79913 100644 --- a/embassy-stm32/src/spi/v1.rs +++ b/embassy-stm32/src/spi/v1.rs | |||
| @@ -140,8 +140,8 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | |||
| 140 | T::regs().cr1().modify(|reg| { | 140 | T::regs().cr1().modify(|reg| { |
| 141 | reg.set_spe(true); | 141 | reg.set_spe(true); |
| 142 | }); | 142 | }); |
| 143 | self.current_word_size = word_size; | ||
| 144 | } | 143 | } |
| 144 | self.current_word_size = word_size; | ||
| 145 | } | 145 | } |
| 146 | 146 | ||
| 147 | #[allow(unused)] | 147 | #[allow(unused)] |
diff --git a/embassy-stm32/src/spi/v2.rs b/embassy-stm32/src/spi/v2.rs index b281c7548..0c0d24ce9 100644 --- a/embassy-stm32/src/spi/v2.rs +++ b/embassy-stm32/src/spi/v2.rs | |||
| @@ -24,6 +24,7 @@ pub struct Spi<'d, T: Instance, Tx, Rx> { | |||
| 24 | miso: Option<AnyPin>, | 24 | miso: Option<AnyPin>, |
| 25 | txdma: Tx, | 25 | txdma: Tx, |
| 26 | rxdma: Rx, | 26 | rxdma: Rx, |
| 27 | current_word_size: WordSize, | ||
| 27 | phantom: PhantomData<&'d mut T>, | 28 | phantom: PhantomData<&'d mut T>, |
| 28 | } | 29 | } |
| 29 | 30 | ||
| @@ -107,6 +108,7 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | |||
| 107 | miso, | 108 | miso, |
| 108 | txdma, | 109 | txdma, |
| 109 | rxdma, | 110 | rxdma, |
| 111 | current_word_size: WordSize::EightBit, | ||
| 110 | phantom: PhantomData, | 112 | phantom: PhantomData, |
| 111 | } | 113 | } |
| 112 | } | 114 | } |
| @@ -125,7 +127,10 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | |||
| 125 | } | 127 | } |
| 126 | } | 128 | } |
| 127 | 129 | ||
| 128 | fn set_word_size(word_size: WordSize) { | 130 | fn set_word_size(&mut self, word_size: WordSize) { |
| 131 | if self.current_word_size == word_size { | ||
| 132 | return; | ||
| 133 | } | ||
| 129 | unsafe { | 134 | unsafe { |
| 130 | T::regs().cr1().modify(|w| { | 135 | T::regs().cr1().modify(|w| { |
| 131 | w.set_spe(false); | 136 | w.set_spe(false); |
| @@ -138,6 +143,7 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | |||
| 138 | w.set_spe(true); | 143 | w.set_spe(true); |
| 139 | }); | 144 | }); |
| 140 | } | 145 | } |
| 146 | self.current_word_size = word_size; | ||
| 141 | } | 147 | } |
| 142 | 148 | ||
| 143 | #[allow(unused)] | 149 | #[allow(unused)] |
| @@ -150,7 +156,7 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | |||
| 150 | w.set_spe(false); | 156 | w.set_spe(false); |
| 151 | }); | 157 | }); |
| 152 | } | 158 | } |
| 153 | Self::set_word_size(WordSize::EightBit); | 159 | self.set_word_size(WordSize::EightBit); |
| 154 | 160 | ||
| 155 | let request = self.txdma.request(); | 161 | let request = self.txdma.request(); |
| 156 | let dst = T::regs().dr().ptr() as *mut u8; | 162 | let dst = T::regs().dr().ptr() as *mut u8; |
| @@ -192,7 +198,7 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | |||
| 192 | reg.set_rxdmaen(true); | 198 | reg.set_rxdmaen(true); |
| 193 | }); | 199 | }); |
| 194 | } | 200 | } |
| 195 | Self::set_word_size(WordSize::EightBit); | 201 | self.set_word_size(WordSize::EightBit); |
| 196 | 202 | ||
| 197 | let clock_byte_count = read.len(); | 203 | let clock_byte_count = read.len(); |
| 198 | 204 | ||
| @@ -252,7 +258,7 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | |||
| 252 | let _ = T::regs().dr().read(); | 258 | let _ = T::regs().dr().read(); |
| 253 | } | 259 | } |
| 254 | } | 260 | } |
| 255 | Self::set_word_size(WordSize::EightBit); | 261 | self.set_word_size(WordSize::EightBit); |
| 256 | 262 | ||
| 257 | let rx_request = self.rxdma.request(); | 263 | let rx_request = self.rxdma.request(); |
| 258 | let rx_src = T::regs().dr().ptr() as *mut u8; | 264 | let rx_src = T::regs().dr().ptr() as *mut u8; |
| @@ -365,7 +371,7 @@ impl<'d, T: Instance, Rx> embedded_hal::blocking::spi::Write<u8> for Spi<'d, T, | |||
| 365 | type Error = Error; | 371 | type Error = Error; |
| 366 | 372 | ||
| 367 | fn write(&mut self, words: &[u8]) -> Result<(), Self::Error> { | 373 | fn write(&mut self, words: &[u8]) -> Result<(), Self::Error> { |
| 368 | Self::set_word_size(WordSize::EightBit); | 374 | self.set_word_size(WordSize::EightBit); |
| 369 | let regs = T::regs(); | 375 | let regs = T::regs(); |
| 370 | 376 | ||
| 371 | for word in words.iter() { | 377 | for word in words.iter() { |
| @@ -381,7 +387,7 @@ impl<'d, T: Instance> embedded_hal::blocking::spi::Transfer<u8> for Spi<'d, T, N | |||
| 381 | type Error = Error; | 387 | type Error = Error; |
| 382 | 388 | ||
| 383 | fn transfer<'w>(&mut self, words: &'w mut [u8]) -> Result<&'w [u8], Self::Error> { | 389 | fn transfer<'w>(&mut self, words: &'w mut [u8]) -> Result<&'w [u8], Self::Error> { |
| 384 | Self::set_word_size(WordSize::EightBit); | 390 | self.set_word_size(WordSize::EightBit); |
| 385 | let regs = T::regs(); | 391 | let regs = T::regs(); |
| 386 | 392 | ||
| 387 | for word in words.iter_mut() { | 393 | for word in words.iter_mut() { |
| @@ -397,7 +403,7 @@ impl<'d, T: Instance, Rx> embedded_hal::blocking::spi::Write<u16> for Spi<'d, T, | |||
| 397 | type Error = Error; | 403 | type Error = Error; |
| 398 | 404 | ||
| 399 | fn write(&mut self, words: &[u16]) -> Result<(), Self::Error> { | 405 | fn write(&mut self, words: &[u16]) -> Result<(), Self::Error> { |
| 400 | Self::set_word_size(WordSize::SixteenBit); | 406 | self.set_word_size(WordSize::SixteenBit); |
| 401 | let regs = T::regs(); | 407 | let regs = T::regs(); |
| 402 | 408 | ||
| 403 | for word in words.iter() { | 409 | for word in words.iter() { |
| @@ -413,7 +419,7 @@ impl<'d, T: Instance> embedded_hal::blocking::spi::Transfer<u16> for Spi<'d, T, | |||
| 413 | type Error = Error; | 419 | type Error = Error; |
| 414 | 420 | ||
| 415 | fn transfer<'w>(&mut self, words: &'w mut [u16]) -> Result<&'w [u16], Self::Error> { | 421 | fn transfer<'w>(&mut self, words: &'w mut [u16]) -> Result<&'w [u16], Self::Error> { |
| 416 | Self::set_word_size(WordSize::SixteenBit); | 422 | self.set_word_size(WordSize::SixteenBit); |
| 417 | let regs = T::regs(); | 423 | let regs = T::regs(); |
| 418 | 424 | ||
| 419 | for word in words.iter_mut() { | 425 | for word in words.iter_mut() { |
diff --git a/embassy-stm32/src/spi/v3.rs b/embassy-stm32/src/spi/v3.rs index cd88acb7a..e2751ce20 100644 --- a/embassy-stm32/src/spi/v3.rs +++ b/embassy-stm32/src/spi/v3.rs | |||
| @@ -26,6 +26,7 @@ pub struct Spi<'d, T: Instance, Tx = NoDma, Rx = NoDma> { | |||
| 26 | miso: Option<AnyPin>, | 26 | miso: Option<AnyPin>, |
| 27 | txdma: Tx, | 27 | txdma: Tx, |
| 28 | rxdma: Rx, | 28 | rxdma: Rx, |
| 29 | current_word_size: WordSize, | ||
| 29 | phantom: PhantomData<&'d mut T>, | 30 | phantom: PhantomData<&'d mut T>, |
| 30 | } | 31 | } |
| 31 | 32 | ||
| @@ -120,6 +121,7 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | |||
| 120 | miso, | 121 | miso, |
| 121 | txdma, | 122 | txdma, |
| 122 | rxdma, | 123 | rxdma, |
| 124 | current_word_size: WordSize::EightBit, | ||
| 123 | phantom: PhantomData, | 125 | phantom: PhantomData, |
| 124 | } | 126 | } |
| 125 | } | 127 | } |
| @@ -138,7 +140,10 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | |||
| 138 | } | 140 | } |
| 139 | } | 141 | } |
| 140 | 142 | ||
| 141 | fn set_word_size(word_size: WordSize) { | 143 | fn set_word_size(&mut self, word_size: WordSize) { |
| 144 | if self.current_word_size == word_size { | ||
| 145 | return; | ||
| 146 | } | ||
| 142 | unsafe { | 147 | unsafe { |
| 143 | T::regs().cr1().modify(|w| { | 148 | T::regs().cr1().modify(|w| { |
| 144 | w.set_csusp(true); | 149 | w.set_csusp(true); |
| @@ -155,6 +160,7 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | |||
| 155 | w.set_spe(true); | 160 | w.set_spe(true); |
| 156 | }); | 161 | }); |
| 157 | } | 162 | } |
| 163 | self.current_word_size = word_size; | ||
| 158 | } | 164 | } |
| 159 | 165 | ||
| 160 | #[allow(unused)] | 166 | #[allow(unused)] |
| @@ -162,7 +168,7 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | |||
| 162 | where | 168 | where |
| 163 | Tx: TxDmaChannel<T>, | 169 | Tx: TxDmaChannel<T>, |
| 164 | { | 170 | { |
| 165 | Self::set_word_size(WordSize::EightBit); | 171 | self.set_word_size(WordSize::EightBit); |
| 166 | unsafe { | 172 | unsafe { |
| 167 | T::regs().cr1().modify(|w| { | 173 | T::regs().cr1().modify(|w| { |
| 168 | w.set_spe(false); | 174 | w.set_spe(false); |
| @@ -204,7 +210,7 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | |||
| 204 | Tx: TxDmaChannel<T>, | 210 | Tx: TxDmaChannel<T>, |
| 205 | Rx: RxDmaChannel<T>, | 211 | Rx: RxDmaChannel<T>, |
| 206 | { | 212 | { |
| 207 | Self::set_word_size(WordSize::EightBit); | 213 | self.set_word_size(WordSize::EightBit); |
| 208 | unsafe { | 214 | unsafe { |
| 209 | T::regs().cr1().modify(|w| { | 215 | T::regs().cr1().modify(|w| { |
| 210 | w.set_spe(false); | 216 | w.set_spe(false); |
| @@ -260,7 +266,7 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | |||
| 260 | { | 266 | { |
| 261 | assert!(read.len() >= write.len()); | 267 | assert!(read.len() >= write.len()); |
| 262 | 268 | ||
| 263 | Self::set_word_size(WordSize::EightBit); | 269 | self.set_word_size(WordSize::EightBit); |
| 264 | unsafe { | 270 | unsafe { |
| 265 | T::regs().cr1().modify(|w| { | 271 | T::regs().cr1().modify(|w| { |
| 266 | w.set_spe(false); | 272 | w.set_spe(false); |
| @@ -336,7 +342,7 @@ impl<'d, T: Instance> embedded_hal::blocking::spi::Write<u8> for Spi<'d, T, NoDm | |||
| 336 | type Error = Error; | 342 | type Error = Error; |
| 337 | 343 | ||
| 338 | fn write(&mut self, words: &[u8]) -> Result<(), Self::Error> { | 344 | fn write(&mut self, words: &[u8]) -> Result<(), Self::Error> { |
| 339 | Self::set_word_size(WordSize::EightBit); | 345 | self.set_word_size(WordSize::EightBit); |
| 340 | let regs = T::regs(); | 346 | let regs = T::regs(); |
| 341 | 347 | ||
| 342 | for word in words.iter() { | 348 | for word in words.iter() { |
| @@ -384,7 +390,7 @@ impl<'d, T: Instance> embedded_hal::blocking::spi::Transfer<u8> for Spi<'d, T, N | |||
| 384 | type Error = Error; | 390 | type Error = Error; |
| 385 | 391 | ||
| 386 | fn transfer<'w>(&mut self, words: &'w mut [u8]) -> Result<&'w [u8], Self::Error> { | 392 | fn transfer<'w>(&mut self, words: &'w mut [u8]) -> Result<&'w [u8], Self::Error> { |
| 387 | Self::set_word_size(WordSize::EightBit); | 393 | self.set_word_size(WordSize::EightBit); |
| 388 | let regs = T::regs(); | 394 | let regs = T::regs(); |
| 389 | 395 | ||
| 390 | for word in words.iter_mut() { | 396 | for word in words.iter_mut() { |
| @@ -441,7 +447,7 @@ impl<'d, T: Instance> embedded_hal::blocking::spi::Write<u16> for Spi<'d, T, NoD | |||
| 441 | type Error = Error; | 447 | type Error = Error; |
| 442 | 448 | ||
| 443 | fn write(&mut self, words: &[u16]) -> Result<(), Self::Error> { | 449 | fn write(&mut self, words: &[u16]) -> Result<(), Self::Error> { |
| 444 | Self::set_word_size(WordSize::SixteenBit); | 450 | self.set_word_size(WordSize::SixteenBit); |
| 445 | let regs = T::regs(); | 451 | let regs = T::regs(); |
| 446 | 452 | ||
| 447 | for word in words.iter() { | 453 | for word in words.iter() { |
| @@ -490,7 +496,7 @@ impl<'d, T: Instance> embedded_hal::blocking::spi::Transfer<u16> for Spi<'d, T, | |||
| 490 | type Error = Error; | 496 | type Error = Error; |
| 491 | 497 | ||
| 492 | fn transfer<'w>(&mut self, words: &'w mut [u16]) -> Result<&'w [u16], Self::Error> { | 498 | fn transfer<'w>(&mut self, words: &'w mut [u16]) -> Result<&'w [u16], Self::Error> { |
| 493 | Self::set_word_size(WordSize::SixteenBit); | 499 | self.set_word_size(WordSize::SixteenBit); |
| 494 | let regs = T::regs(); | 500 | let regs = T::regs(); |
| 495 | 501 | ||
| 496 | for word in words.iter_mut() { | 502 | for word in words.iter_mut() { |
