diff options
| author | Tobias Pisani <[email protected]> | 2021-10-11 23:33:32 +0200 |
|---|---|---|
| committer | Tobias Pisani <[email protected]> | 2021-10-11 23:33:32 +0200 |
| commit | 43a7226d8b8e5a2dabae8afbaf9e81651b59ca6e (patch) | |
| tree | b04e9f1524c9750c9eeabd88216aab4e781dfbd2 | |
| parent | 2cbb8a7ece70f5d489b8527f80de708693d9f55b (diff) | |
inline FRE register check for SPI on F1
| -rw-r--r-- | embassy-stm32/src/spi/v1.rs | 42 |
1 files changed, 19 insertions, 23 deletions
diff --git a/embassy-stm32/src/spi/v1.rs b/embassy-stm32/src/spi/v1.rs index d4fa888c9..b727f2008 100644 --- a/embassy-stm32/src/spi/v1.rs +++ b/embassy-stm32/src/spi/v1.rs | |||
| @@ -439,13 +439,18 @@ fn write_word<W: Word>(regs: &'static crate::pac::spi::Spi, word: W) -> Result<( | |||
| 439 | let sr = unsafe { regs.sr().read() }; | 439 | let sr = unsafe { regs.sr().read() }; |
| 440 | if sr.ovr() { | 440 | if sr.ovr() { |
| 441 | return Err(Error::Overrun); | 441 | return Err(Error::Overrun); |
| 442 | } else if sr_fre(sr) { | 442 | } |
| 443 | #[cfg(not(spi_f1))] | ||
| 444 | if sr.fre() { | ||
| 443 | return Err(Error::Framing); | 445 | return Err(Error::Framing); |
| 444 | } else if sr.modf() { | 446 | } |
| 447 | if sr.modf() { | ||
| 445 | return Err(Error::ModeFault); | 448 | return Err(Error::ModeFault); |
| 446 | } else if sr.crcerr() { | 449 | } |
| 450 | if sr.crcerr() { | ||
| 447 | return Err(Error::Crc); | 451 | return Err(Error::Crc); |
| 448 | } else if sr.txe() { | 452 | } |
| 453 | if sr.txe() { | ||
| 449 | unsafe { | 454 | unsafe { |
| 450 | let dr = regs.dr().ptr() as *mut W; | 455 | let dr = regs.dr().ptr() as *mut W; |
| 451 | ptr::write_volatile(dr, word); | 456 | ptr::write_volatile(dr, word); |
| @@ -461,13 +466,18 @@ fn read_word<W: Word>(regs: &'static crate::pac::spi::Spi) -> Result<W, Error> { | |||
| 461 | let sr = unsafe { regs.sr().read() }; | 466 | let sr = unsafe { regs.sr().read() }; |
| 462 | if sr.ovr() { | 467 | if sr.ovr() { |
| 463 | return Err(Error::Overrun); | 468 | return Err(Error::Overrun); |
| 464 | } else if sr.modf() { | 469 | } |
| 465 | return Err(Error::ModeFault); | 470 | #[cfg(not(spi_f1))] |
| 466 | } else if sr_fre(sr) { | 471 | if sr.fre() { |
| 467 | return Err(Error::Framing); | 472 | return Err(Error::Framing); |
| 468 | } else if sr.crcerr() { | 473 | } |
| 474 | if sr.modf() { | ||
| 475 | return Err(Error::ModeFault); | ||
| 476 | } | ||
| 477 | if sr.crcerr() { | ||
| 469 | return Err(Error::Crc); | 478 | return Err(Error::Crc); |
| 470 | } else if sr.rxne() { | 479 | } |
| 480 | if sr.rxne() { | ||
| 471 | unsafe { | 481 | unsafe { |
| 472 | let dr = regs.dr().ptr() as *const W; | 482 | let dr = regs.dr().ptr() as *const W; |
| 473 | return Ok(ptr::read_volatile(dr)); | 483 | return Ok(ptr::read_volatile(dr)); |
| @@ -475,17 +485,3 @@ fn read_word<W: Word>(regs: &'static crate::pac::spi::Spi) -> Result<W, Error> { | |||
| 475 | } | 485 | } |
| 476 | } | 486 | } |
| 477 | } | 487 | } |
| 478 | |||
| 479 | // SPI on F1 is just V1 without FRE and FRF fields | ||
| 480 | // This driver only uses FRE, so add a simple function here to read fre on v1, | ||
| 481 | // and return false on f1 | ||
| 482 | |||
| 483 | #[cfg(spi_v1)] | ||
| 484 | fn sr_fre(sr: crate::pac::spi::regs::Sr) -> bool { | ||
| 485 | sr.fre() | ||
| 486 | } | ||
| 487 | |||
| 488 | #[cfg(spi_f1)] | ||
| 489 | fn sr_fre(_sr: crate::pac::spi::regs::Sr) -> bool { | ||
| 490 | false | ||
| 491 | } | ||
