aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGrant Miller <[email protected]>2021-12-06 14:24:02 -0600
committerGrant Miller <[email protected]>2021-12-06 14:24:02 -0600
commitaeb69a76651b2a06cc74b15ee926a0797a3536f4 (patch)
treeb248d85846473c87deee7c92640056b9902b7dc3
parentd51885c0eb5bc0d46db49c7ffd8f58128e5c983e (diff)
Track current word size in v2 and v3 also
-rw-r--r--embassy-stm32/src/spi/v1.rs2
-rw-r--r--embassy-stm32/src/spi/v2.rs22
-rw-r--r--embassy-stm32/src/spi/v3.rs22
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() {