diff options
| author | Alexandros Liarokapis <[email protected]> | 2024-05-27 20:43:17 +0300 |
|---|---|---|
| committer | Alexandros Liarokapis <[email protected]> | 2024-05-27 20:43:24 +0300 |
| commit | 76fbec74da30c5cd04b441aa49414a286170a491 (patch) | |
| tree | ed7b5d1f7b8151a2fd6dd526e43c90fa82e30e43 | |
| parent | f9324201b1d9375e12b4af9a6b2424fe3ff85d32 (diff) | |
fix spi panic on read due to i2s configuration conversion check
| -rw-r--r-- | embassy-stm32/src/spi/mod.rs | 52 |
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 | } |
