diff options
| author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2022-03-15 03:14:07 +0000 |
|---|---|---|
| committer | GitHub <[email protected]> | 2022-03-15 03:14:07 +0000 |
| commit | cb1be3983a47029e0e6a1c07082dd6ed18eda2a7 (patch) | |
| tree | 50fb3b7175ceb0063dc440ec7221ff8399532981 | |
| parent | ff1215c6f9295d960c5111d30f27ca047605414d (diff) | |
| parent | 1dc618f0e4e045de63007893fb36fcaba82acfa4 (diff) | |
Merge #666
666: stm32/spi: Clear rx fifo in blocking methods r=Dirbaio a=GrantM11235
Co-authored-by: Grant Miller <[email protected]>
Co-authored-by: Dario Nieuwenhuis <[email protected]>
| -rw-r--r-- | embassy-stm32/src/spi/mod.rs | 9 | ||||
| -rw-r--r-- | tests/stm32/src/bin/spi_dma.rs | 16 |
2 files changed, 24 insertions, 1 deletions
diff --git a/embassy-stm32/src/spi/mod.rs b/embassy-stm32/src/spi/mod.rs index d8ffabb11..764a967ca 100644 --- a/embassy-stm32/src/spi/mod.rs +++ b/embassy-stm32/src/spi/mod.rs | |||
| @@ -575,6 +575,8 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | |||
| 575 | } | 575 | } |
| 576 | 576 | ||
| 577 | pub fn blocking_write<W: Word>(&mut self, words: &[W]) -> Result<(), Error> { | 577 | pub fn blocking_write<W: Word>(&mut self, words: &[W]) -> Result<(), Error> { |
| 578 | unsafe { T::REGS.cr1().modify(|w| w.set_spe(true)) } | ||
| 579 | flush_rx_fifo(T::REGS); | ||
| 578 | self.set_word_size(W::WORDSIZE); | 580 | self.set_word_size(W::WORDSIZE); |
| 579 | for word in words.iter() { | 581 | for word in words.iter() { |
| 580 | let _ = transfer_word(T::REGS, *word)?; | 582 | let _ = transfer_word(T::REGS, *word)?; |
| @@ -583,6 +585,8 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | |||
| 583 | } | 585 | } |
| 584 | 586 | ||
| 585 | pub fn blocking_read<W: Word>(&mut self, words: &mut [W]) -> Result<(), Error> { | 587 | pub fn blocking_read<W: Word>(&mut self, words: &mut [W]) -> Result<(), Error> { |
| 588 | unsafe { T::REGS.cr1().modify(|w| w.set_spe(true)) } | ||
| 589 | flush_rx_fifo(T::REGS); | ||
| 586 | self.set_word_size(W::WORDSIZE); | 590 | self.set_word_size(W::WORDSIZE); |
| 587 | for word in words.iter_mut() { | 591 | for word in words.iter_mut() { |
| 588 | *word = transfer_word(T::REGS, W::default())?; | 592 | *word = transfer_word(T::REGS, W::default())?; |
| @@ -591,6 +595,8 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | |||
| 591 | } | 595 | } |
| 592 | 596 | ||
| 593 | pub fn blocking_transfer_in_place<W: Word>(&mut self, words: &mut [W]) -> Result<(), Error> { | 597 | pub fn blocking_transfer_in_place<W: Word>(&mut self, words: &mut [W]) -> Result<(), Error> { |
| 598 | unsafe { T::REGS.cr1().modify(|w| w.set_spe(true)) } | ||
| 599 | flush_rx_fifo(T::REGS); | ||
| 594 | self.set_word_size(W::WORDSIZE); | 600 | self.set_word_size(W::WORDSIZE); |
| 595 | for word in words.iter_mut() { | 601 | for word in words.iter_mut() { |
| 596 | *word = transfer_word(T::REGS, *word)?; | 602 | *word = transfer_word(T::REGS, *word)?; |
| @@ -599,6 +605,8 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | |||
| 599 | } | 605 | } |
| 600 | 606 | ||
| 601 | pub fn blocking_transfer<W: Word>(&mut self, read: &mut [W], write: &[W]) -> Result<(), Error> { | 607 | pub fn blocking_transfer<W: Word>(&mut self, read: &mut [W], write: &[W]) -> Result<(), Error> { |
| 608 | unsafe { T::REGS.cr1().modify(|w| w.set_spe(true)) } | ||
| 609 | flush_rx_fifo(T::REGS); | ||
| 602 | self.set_word_size(W::WORDSIZE); | 610 | self.set_word_size(W::WORDSIZE); |
| 603 | let len = read.len().max(write.len()); | 611 | let len = read.len().max(write.len()); |
| 604 | for i in 0..len { | 612 | for i in 0..len { |
| @@ -727,7 +735,6 @@ fn spin_until_rx_ready(regs: Regs) -> Result<(), Error> { | |||
| 727 | } | 735 | } |
| 728 | } | 736 | } |
| 729 | 737 | ||
| 730 | #[cfg(not(spi_v3))] | ||
| 731 | fn flush_rx_fifo(regs: Regs) { | 738 | fn flush_rx_fifo(regs: Regs) { |
| 732 | unsafe { | 739 | unsafe { |
| 733 | #[cfg(not(spi_v3))] | 740 | #[cfg(not(spi_v3))] |
diff --git a/tests/stm32/src/bin/spi_dma.rs b/tests/stm32/src/bin/spi_dma.rs index 3e9521ae7..f4f1994c0 100644 --- a/tests/stm32/src/bin/spi_dma.rs +++ b/tests/stm32/src/bin/spi_dma.rs | |||
| @@ -68,6 +68,22 @@ async fn main(_spawner: Spawner, p: Peripherals) { | |||
| 68 | spi.read::<u8>(&mut []).await.unwrap(); | 68 | spi.read::<u8>(&mut []).await.unwrap(); |
| 69 | spi.write::<u8>(&[]).await.unwrap(); | 69 | spi.write::<u8>(&[]).await.unwrap(); |
| 70 | 70 | ||
| 71 | // === Check mixing blocking with async. | ||
| 72 | spi.blocking_transfer(&mut buf, &data).unwrap(); | ||
| 73 | assert_eq!(buf, data); | ||
| 74 | spi.transfer(&mut buf, &data).await.unwrap(); | ||
| 75 | assert_eq!(buf, data); | ||
| 76 | spi.blocking_write(&buf).unwrap(); | ||
| 77 | spi.transfer(&mut buf, &data).await.unwrap(); | ||
| 78 | assert_eq!(buf, data); | ||
| 79 | spi.blocking_read(&mut buf).unwrap(); | ||
| 80 | spi.blocking_write(&buf).unwrap(); | ||
| 81 | spi.write(&buf).await.unwrap(); | ||
| 82 | spi.read(&mut buf).await.unwrap(); | ||
| 83 | spi.blocking_write(&buf).unwrap(); | ||
| 84 | spi.blocking_read(&mut buf).unwrap(); | ||
| 85 | spi.write(&buf).await.unwrap(); | ||
| 86 | |||
| 71 | info!("Test OK"); | 87 | info!("Test OK"); |
| 72 | cortex_m::asm::bkpt(); | 88 | cortex_m::asm::bkpt(); |
| 73 | } | 89 | } |
