diff options
| author | Dario Nieuwenhuis <[email protected]> | 2022-03-15 00:31:36 +0100 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2022-03-15 00:40:48 +0100 |
| commit | 306110f56e4614cc51f6c3d3e9ff96b5fe2ced6f (patch) | |
| tree | de62bae790e72db73d2268701c89baf21090273c | |
| parent | 8ef8ab170766051be22cc93ec0359f1f95dc6027 (diff) | |
stm32/spi: implement async trasnfer_in_place
| -rw-r--r-- | embassy-stm32/src/spi/mod.rs | 35 | ||||
| -rw-r--r-- | tests/stm32/src/bin/spi_dma.rs | 3 |
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; | |||
| 7 | use futures::future::join; | 7 | use futures::future::join; |
| 8 | 8 | ||
| 9 | use self::sealed::WordSize; | 9 | use self::sealed::WordSize; |
| 10 | use crate::dma::{NoDma, Transfer}; | 10 | use crate::dma::{slice_ptr_parts, NoDma, Transfer}; |
| 11 | use crate::gpio::sealed::{AFType, Pin as _}; | 11 | use crate::gpio::sealed::{AFType, Pin as _}; |
| 12 | use crate::gpio::AnyPin; | 12 | use crate::gpio::AnyPin; |
| 13 | use crate::pac::spi::Spi as Regs; | 13 | use 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 | } |
