aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandros Liarokapis <[email protected]>2024-05-27 20:43:17 +0300
committerAlexandros Liarokapis <[email protected]>2024-05-27 20:43:24 +0300
commit76fbec74da30c5cd04b441aa49414a286170a491 (patch)
treeed7b5d1f7b8151a2fd6dd526e43c90fa82e30e43
parentf9324201b1d9375e12b4af9a6b2424fe3ff85d32 (diff)
fix spi panic on read due to i2s configuration conversion check
-rw-r--r--embassy-stm32/src/spi/mod.rs52
1 files changed, 29 insertions, 23 deletions
diff --git a/embassy-stm32/src/spi/mod.rs b/embassy-stm32/src/spi/mod.rs
index 0a0afafc6..0b12bc9b6 100644
--- a/embassy-stm32/src/spi/mod.rs
+++ b/embassy-stm32/src/spi/mod.rs
@@ -643,36 +643,40 @@ impl<'d> Spi<'d, Async> {
643 return Ok(()); 643 return Ok(());
644 } 644 }
645 645
646 self.info.regs.cr1().modify(|w| { 646 let regs = self.info.regs;
647
648 regs.cr1().modify(|w| {
647 w.set_spe(false); 649 w.set_spe(false);
648 }); 650 });
649 651
650 let comm = self.info.regs.cfg2().modify(|w| { 652 let comm = regs.cfg2().modify(|w| {
651 let prev = w.comm(); 653 let prev = w.comm();
652 w.set_comm(vals::Comm::RECEIVER); 654 w.set_comm(vals::Comm::RECEIVER);
653 prev 655 prev
654 }); 656 });
655 657
656 let i2scfg = self.info.regs.i2scfgr().modify(|w| { 658 let i2scfg = regs.i2scfgr().modify(|w| {
657 let prev = w.i2scfg(); 659 w.i2smod().then(|| {
658 w.set_i2scfg(match prev { 660 let prev = w.i2scfg();
659 vals::I2scfg::SLAVERX | vals::I2scfg::SLAVEFULLDUPLEX => vals::I2scfg::SLAVERX, 661 w.set_i2scfg(match prev {
660 vals::I2scfg::MASTERRX | vals::I2scfg::MASTERFULLDUPLEX => vals::I2scfg::MASTERRX, 662 vals::I2scfg::SLAVERX | vals::I2scfg::SLAVEFULLDUPLEX => vals::I2scfg::SLAVERX,
661 _ => panic!("unsupported configuration"), 663 vals::I2scfg::MASTERRX | vals::I2scfg::MASTERFULLDUPLEX => vals::I2scfg::MASTERRX,
662 }); 664 _ => panic!("unsupported configuration"),
663 prev 665 });
666 prev
667 })
664 }); 668 });
665 669
666 let tsize = self.info.regs.cr2().read().tsize(); 670 let tsize = regs.cr2().read().tsize();
667 671
668 let rx_src = self.info.regs.rx_ptr(); 672 let rx_src = regs.rx_ptr();
669 673
670 let mut read = 0; 674 let mut read = 0;
671 let mut remaining = data.len(); 675 let mut remaining = data.len();
672 676
673 loop { 677 loop {
674 self.set_word_size(W::CONFIG); 678 self.set_word_size(W::CONFIG);
675 set_rxdmaen(self.info.regs, true); 679 set_rxdmaen(regs, true);
676 680
677 let transfer_size = remaining.min(u16::max_value().into()); 681 let transfer_size = remaining.min(u16::max_value().into());
678 682
@@ -683,21 +687,21 @@ impl<'d> Spi<'d, Async> {
683 .read(rx_src, &mut data[read..(read + transfer_size)], Default::default()) 687 .read(rx_src, &mut data[read..(read + transfer_size)], Default::default())
684 }; 688 };
685 689
686 self.info.regs.cr2().modify(|w| { 690 regs.cr2().modify(|w| {
687 w.set_tsize(transfer_size as u16); 691 w.set_tsize(transfer_size as u16);
688 }); 692 });
689 693
690 self.info.regs.cr1().modify(|w| { 694 regs.cr1().modify(|w| {
691 w.set_spe(true); 695 w.set_spe(true);
692 }); 696 });
693 697
694 self.info.regs.cr1().modify(|w| { 698 regs.cr1().modify(|w| {
695 w.set_cstart(true); 699 w.set_cstart(true);
696 }); 700 });
697 701
698 transfer.await; 702 transfer.await;
699 703
700 finish_dma(self.info.regs); 704 finish_dma(regs);
701 705
702 remaining -= transfer_size; 706 remaining -= transfer_size;
703 707
@@ -708,21 +712,23 @@ impl<'d> Spi<'d, Async> {
708 read += transfer_size; 712 read += transfer_size;
709 } 713 }
710 714
711 self.info.regs.cr1().modify(|w| { 715 regs.cr1().modify(|w| {
712 w.set_spe(false); 716 w.set_spe(false);
713 }); 717 });
714 718
715 self.info.regs.cfg2().modify(|w| { 719 regs.cfg2().modify(|w| {
716 w.set_comm(comm); 720 w.set_comm(comm);
717 }); 721 });
718 722
719 self.info.regs.cr2().modify(|w| { 723 regs.cr2().modify(|w| {
720 w.set_tsize(tsize); 724 w.set_tsize(tsize);
721 }); 725 });
722 726
723 self.info.regs.i2scfgr().modify(|w| { 727 if let Some(i2scfg) = i2scfg {
724 w.set_i2scfg(i2scfg); 728 regs.i2scfgr().modify(|w| {
725 }); 729 w.set_i2scfg(i2scfg);
730 });
731 }
726 732
727 Ok(()) 733 Ok(())
728 } 734 }