From 15c533fe2a7fe2adad3aff186a3d57332eb014fb Mon Sep 17 00:00:00 2001 From: Grant Miller Date: Mon, 14 Mar 2022 18:04:31 -0500 Subject: [PATCH 1/3] Fix async `write` bug --- embassy-stm32/src/spi/mod.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/embassy-stm32/src/spi/mod.rs b/embassy-stm32/src/spi/mod.rs index 3b39f0fd2..1b2cdf19e 100644 --- a/embassy-stm32/src/spi/mod.rs +++ b/embassy-stm32/src/spi/mod.rs @@ -418,10 +418,6 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { }); } - // TODO: This is unnecessary in some versions because - // clearing SPE automatically clears the fifos - flush_rx_fifo(T::REGS); - let tx_request = self.txdma.request(); let tx_dst = T::REGS.tx_ptr(); unsafe { self.txdma.start_write(tx_request, data, tx_dst) } @@ -440,6 +436,9 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { tx_f.await; + // flush here otherwise `finish_dma` hangs waiting for the rx fifo to empty + flush_rx_fifo(T::REGS); + finish_dma(T::REGS); Ok(()) From 71632648c72879f2ce678600b497878abc63e0de Mon Sep 17 00:00:00 2001 From: Grant Miller Date: Mon, 14 Mar 2022 18:14:55 -0500 Subject: [PATCH 2/3] Fix zero-length-slice bugs --- embassy-stm32/src/spi/mod.rs | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/embassy-stm32/src/spi/mod.rs b/embassy-stm32/src/spi/mod.rs index 1b2cdf19e..a7edcc0d8 100644 --- a/embassy-stm32/src/spi/mod.rs +++ b/embassy-stm32/src/spi/mod.rs @@ -7,7 +7,7 @@ use embassy_hal_common::unborrow; use futures::future::join; use self::sealed::WordSize; -use crate::dma::{slice_ptr_parts, slice_ptr_parts_mut, NoDma, Transfer}; +use crate::dma::{NoDma, Transfer}; use crate::gpio::sealed::{AFType, Pin as _}; use crate::gpio::AnyPin; use crate::pac::spi::Spi as Regs; @@ -411,6 +411,10 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { where Tx: TxDma, { + if data.len() == 0 { + return Ok(()) + } + self.set_word_size(W::WORDSIZE); unsafe { T::REGS.cr1().modify(|w| { @@ -449,6 +453,10 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { Tx: TxDma, Rx: RxDma, { + if data.len() == 0 { + return Ok(()) + } + self.set_word_size(W::WORDSIZE); unsafe { T::REGS.cr1().modify(|w| { @@ -457,7 +465,7 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { set_rxdmaen(T::REGS, true); } - let (_, clock_byte_count) = slice_ptr_parts_mut(data); + let clock_byte_count = data.len(); let rx_request = self.rxdma.request(); let rx_src = T::REGS.rx_ptr(); @@ -498,9 +506,11 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { Tx: TxDma, Rx: RxDma, { - let (_, rx_len) = slice_ptr_parts(read); - let (_, tx_len) = slice_ptr_parts(write); - assert_eq!(rx_len, tx_len); + assert_eq!(read.len(), write.len()); + + if read.len() == 0 { + return Ok(()) + } self.set_word_size(W::WORDSIZE); unsafe { From f1d6c95205b8f6253c6fe520e392bc14b2bca597 Mon Sep 17 00:00:00 2001 From: Grant Miller Date: Mon, 14 Mar 2022 18:22:41 -0500 Subject: [PATCH 3/3] rustfmt --- embassy-stm32/src/spi/mod.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/embassy-stm32/src/spi/mod.rs b/embassy-stm32/src/spi/mod.rs index a7edcc0d8..5271d941c 100644 --- a/embassy-stm32/src/spi/mod.rs +++ b/embassy-stm32/src/spi/mod.rs @@ -412,7 +412,7 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { Tx: TxDma, { if data.len() == 0 { - return Ok(()) + return Ok(()); } self.set_word_size(W::WORDSIZE); @@ -454,7 +454,7 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { Rx: RxDma, { if data.len() == 0 { - return Ok(()) + return Ok(()); } self.set_word_size(W::WORDSIZE); @@ -509,7 +509,7 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { assert_eq!(read.len(), write.len()); if read.len() == 0 { - return Ok(()) + return Ok(()); } self.set_word_size(W::WORDSIZE);