aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-stm32/src/spi/mod.rs27
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;
7use futures::future::join; 7use futures::future::join;
8 8
9use self::sealed::WordSize; 9use self::sealed::WordSize;
10use crate::dma::{slice_ptr_parts, slice_ptr_parts_mut, NoDma, Transfer}; 10use crate::dma::{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;
@@ -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 {