diff options
| -rw-r--r-- | embassy-stm32/src/spi/mod.rs | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/embassy-stm32/src/spi/mod.rs b/embassy-stm32/src/spi/mod.rs index 3b39f0fd2..5271d941c 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::{slice_ptr_parts, slice_ptr_parts_mut, NoDma, Transfer}; | 10 | use crate::dma::{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; |
| @@ -411,6 +411,10 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | |||
| 411 | where | 411 | where |
| 412 | Tx: TxDma<T>, | 412 | Tx: TxDma<T>, |
| 413 | { | 413 | { |
| 414 | if data.len() == 0 { | ||
| 415 | return Ok(()); | ||
| 416 | } | ||
| 417 | |||
| 414 | self.set_word_size(W::WORDSIZE); | 418 | self.set_word_size(W::WORDSIZE); |
| 415 | unsafe { | 419 | unsafe { |
| 416 | T::REGS.cr1().modify(|w| { | 420 | T::REGS.cr1().modify(|w| { |
| @@ -418,10 +422,6 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | |||
| 418 | }); | 422 | }); |
| 419 | } | 423 | } |
| 420 | 424 | ||
| 421 | // TODO: This is unnecessary in some versions because | ||
| 422 | // clearing SPE automatically clears the fifos | ||
| 423 | flush_rx_fifo(T::REGS); | ||
| 424 | |||
| 425 | let tx_request = self.txdma.request(); | 425 | let tx_request = self.txdma.request(); |
| 426 | let tx_dst = T::REGS.tx_ptr(); | 426 | let tx_dst = T::REGS.tx_ptr(); |
| 427 | unsafe { self.txdma.start_write(tx_request, data, tx_dst) } | 427 | unsafe { self.txdma.start_write(tx_request, data, tx_dst) } |
| @@ -440,6 +440,9 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | |||
| 440 | 440 | ||
| 441 | tx_f.await; | 441 | tx_f.await; |
| 442 | 442 | ||
| 443 | // flush here otherwise `finish_dma` hangs waiting for the rx fifo to empty | ||
| 444 | flush_rx_fifo(T::REGS); | ||
| 445 | |||
| 443 | finish_dma(T::REGS); | 446 | finish_dma(T::REGS); |
| 444 | 447 | ||
| 445 | Ok(()) | 448 | Ok(()) |
| @@ -450,6 +453,10 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | |||
| 450 | Tx: TxDma<T>, | 453 | Tx: TxDma<T>, |
| 451 | Rx: RxDma<T>, | 454 | Rx: RxDma<T>, |
| 452 | { | 455 | { |
| 456 | if data.len() == 0 { | ||
| 457 | return Ok(()); | ||
| 458 | } | ||
| 459 | |||
| 453 | self.set_word_size(W::WORDSIZE); | 460 | self.set_word_size(W::WORDSIZE); |
| 454 | unsafe { | 461 | unsafe { |
| 455 | T::REGS.cr1().modify(|w| { | 462 | T::REGS.cr1().modify(|w| { |
| @@ -458,7 +465,7 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | |||
| 458 | set_rxdmaen(T::REGS, true); | 465 | set_rxdmaen(T::REGS, true); |
| 459 | } | 466 | } |
| 460 | 467 | ||
| 461 | let (_, clock_byte_count) = slice_ptr_parts_mut(data); | 468 | let clock_byte_count = data.len(); |
| 462 | 469 | ||
| 463 | let rx_request = self.rxdma.request(); | 470 | let rx_request = self.rxdma.request(); |
| 464 | let rx_src = T::REGS.rx_ptr(); | 471 | let rx_src = T::REGS.rx_ptr(); |
| @@ -499,9 +506,11 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | |||
| 499 | Tx: TxDma<T>, | 506 | Tx: TxDma<T>, |
| 500 | Rx: RxDma<T>, | 507 | Rx: RxDma<T>, |
| 501 | { | 508 | { |
| 502 | let (_, rx_len) = slice_ptr_parts(read); | 509 | assert_eq!(read.len(), write.len()); |
| 503 | let (_, tx_len) = slice_ptr_parts(write); | 510 | |
| 504 | assert_eq!(rx_len, tx_len); | 511 | if read.len() == 0 { |
| 512 | return Ok(()); | ||
| 513 | } | ||
| 505 | 514 | ||
| 506 | self.set_word_size(W::WORDSIZE); | 515 | self.set_word_size(W::WORDSIZE); |
| 507 | unsafe { | 516 | unsafe { |
