aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2022-03-15 00:31:36 +0100
committerDario Nieuwenhuis <[email protected]>2022-03-15 00:40:48 +0100
commit306110f56e4614cc51f6c3d3e9ff96b5fe2ced6f (patch)
treede62bae790e72db73d2268701c89baf21090273c
parent8ef8ab170766051be22cc93ec0359f1f95dc6027 (diff)
stm32/spi: implement async trasnfer_in_place
-rw-r--r--embassy-stm32/src/spi/mod.rs35
-rw-r--r--tests/stm32/src/bin/spi_dma.rs3
2 files changed, 30 insertions, 8 deletions
diff --git a/embassy-stm32/src/spi/mod.rs b/embassy-stm32/src/spi/mod.rs
index 5271d941c..7fa30cb61 100644
--- a/embassy-stm32/src/spi/mod.rs
+++ b/embassy-stm32/src/spi/mod.rs
@@ -7,7 +7,7 @@ use embassy_hal_common::unborrow;
7use futures::future::join; 7use futures::future::join;
8 8
9use self::sealed::WordSize; 9use self::sealed::WordSize;
10use crate::dma::{NoDma, Transfer}; 10use crate::dma::{slice_ptr_parts, NoDma, Transfer};
11use crate::gpio::sealed::{AFType, Pin as _}; 11use crate::gpio::sealed::{AFType, Pin as _};
12use crate::gpio::AnyPin; 12use crate::gpio::AnyPin;
13use crate::pac::spi::Spi as Regs; 13use crate::pac::spi::Spi as Regs;
@@ -501,14 +501,19 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
501 Ok(()) 501 Ok(())
502 } 502 }
503 503
504 pub async fn transfer<W: Word>(&mut self, read: &mut [W], write: &[W]) -> Result<(), Error> 504 async fn transfer_inner<W: Word>(
505 &mut self,
506 read: *mut [W],
507 write: *const [W],
508 ) -> Result<(), Error>
505 where 509 where
506 Tx: TxDma<T>, 510 Tx: TxDma<T>,
507 Rx: RxDma<T>, 511 Rx: RxDma<T>,
508 { 512 {
509 assert_eq!(read.len(), write.len()); 513 let (_, rx_len) = slice_ptr_parts(read);
510 514 let (_, tx_len) = slice_ptr_parts(write);
511 if read.len() == 0 { 515 assert_eq!(rx_len, tx_len);
516 if rx_len == 0 {
512 return Ok(()); 517 return Ok(());
513 } 518 }
514 519
@@ -552,6 +557,22 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
552 Ok(()) 557 Ok(())
553 } 558 }
554 559
560 pub async fn transfer<W: Word>(&mut self, read: &mut [W], write: &[W]) -> Result<(), Error>
561 where
562 Tx: TxDma<T>,
563 Rx: RxDma<T>,
564 {
565 self.transfer_inner(read, write).await
566 }
567
568 pub async fn transfer_in_place<W: Word>(&mut self, data: &mut [W]) -> Result<(), Error>
569 where
570 Tx: TxDma<T>,
571 Rx: RxDma<T>,
572 {
573 self.transfer_inner(data, data).await
574 }
575
555 pub fn blocking_write<W: Word>(&mut self, words: &[W]) -> Result<(), Error> { 576 pub fn blocking_write<W: Word>(&mut self, words: &[W]) -> Result<(), Error> {
556 self.set_word_size(W::WORDSIZE); 577 self.set_word_size(W::WORDSIZE);
557 for word in words.iter() { 578 for word in words.iter() {
@@ -935,9 +956,7 @@ cfg_if::cfg_if! {
935 &'a mut self, 956 &'a mut self,
936 words: &'a mut [W], 957 words: &'a mut [W],
937 ) -> Self::TransferInPlaceFuture<'a> { 958 ) -> Self::TransferInPlaceFuture<'a> {
938 // TODO: Implement async version 959 self.transfer_in_place(words)
939 let result = self.blocking_transfer_in_place(words);
940 async move { result }
941 } 960 }
942 } 961 }
943 } 962 }
diff --git a/tests/stm32/src/bin/spi_dma.rs b/tests/stm32/src/bin/spi_dma.rs
index 59a5bcd0c..ce80bde74 100644
--- a/tests/stm32/src/bin/spi_dma.rs
+++ b/tests/stm32/src/bin/spi_dma.rs
@@ -47,6 +47,9 @@ async fn main(_spawner: Spawner, p: Peripherals) {
47 spi.transfer(&mut buf, &data).await.unwrap(); 47 spi.transfer(&mut buf, &data).await.unwrap();
48 assert_eq!(buf, data); 48 assert_eq!(buf, data);
49 49
50 spi.transfer_in_place(&mut buf).await.unwrap();
51 assert_eq!(buf, data);
52
50 info!("Test OK"); 53 info!("Test OK");
51 cortex_m::asm::bkpt(); 54 cortex_m::asm::bkpt();
52} 55}