aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2022-03-15 03:14:07 +0000
committerGitHub <[email protected]>2022-03-15 03:14:07 +0000
commitcb1be3983a47029e0e6a1c07082dd6ed18eda2a7 (patch)
tree50fb3b7175ceb0063dc440ec7221ff8399532981
parentff1215c6f9295d960c5111d30f27ca047605414d (diff)
parent1dc618f0e4e045de63007893fb36fcaba82acfa4 (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.rs9
-rw-r--r--tests/stm32/src/bin/spi_dma.rs16
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))]
731fn flush_rx_fifo(regs: Regs) { 738fn 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}