aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-stm32/src/spi/mod.rs23
1 files changed, 5 insertions, 18 deletions
diff --git a/embassy-stm32/src/spi/mod.rs b/embassy-stm32/src/spi/mod.rs
index 109b2738b..7fb8da5ac 100644
--- a/embassy-stm32/src/spi/mod.rs
+++ b/embassy-stm32/src/spi/mod.rs
@@ -657,28 +657,23 @@ impl<'d> Spi<'d, Async> {
657 }) 657 })
658 }); 658 });
659 659
660 let tsize = regs.cr2().read().tsize();
661
662 let rx_src = regs.rx_ptr(); 660 let rx_src = regs.rx_ptr();
663 661
664 let mut read = 0; 662 for mut chunk in data.chunks_mut(u16::max_value().into()) {
665 let mut remaining = data.len();
666
667 loop {
668 self.set_word_size(W::CONFIG); 663 self.set_word_size(W::CONFIG);
669 set_rxdmaen(regs, true); 664 set_rxdmaen(regs, true);
670 665
671 let transfer_size = remaining.min(u16::max_value().into()); 666 let tsize = chunk.len();
672 667
673 let transfer = unsafe { 668 let transfer = unsafe {
674 self.rx_dma 669 self.rx_dma
675 .as_mut() 670 .as_mut()
676 .unwrap() 671 .unwrap()
677 .read(rx_src, &mut data[read..(read + transfer_size)], Default::default()) 672 .read(rx_src, &mut chunk, Default::default())
678 }; 673 };
679 674
680 regs.cr2().modify(|w| { 675 regs.cr2().modify(|w| {
681 w.set_tsize(transfer_size as u16); 676 w.set_tsize(tsize as u16);
682 }); 677 });
683 678
684 regs.cr1().modify(|w| { 679 regs.cr1().modify(|w| {
@@ -692,14 +687,6 @@ impl<'d> Spi<'d, Async> {
692 transfer.await; 687 transfer.await;
693 688
694 finish_dma(regs); 689 finish_dma(regs);
695
696 remaining -= transfer_size;
697
698 if remaining == 0 {
699 break;
700 }
701
702 read += transfer_size;
703 } 690 }
704 691
705 regs.cr1().modify(|w| { 692 regs.cr1().modify(|w| {
@@ -711,7 +698,7 @@ impl<'d> Spi<'d, Async> {
711 }); 698 });
712 699
713 regs.cr2().modify(|w| { 700 regs.cr2().modify(|w| {
714 w.set_tsize(tsize); 701 w.set_tsize(0);
715 }); 702 });
716 703
717 #[cfg(spi_v3)] 704 #[cfg(spi_v3)]