diff --git a/examples/spi.rs b/examples/spi.rs new file mode 100644 index 00000000..4ef51277 --- /dev/null +++ b/examples/spi.rs @@ -0,0 +1,60 @@ +#![deny(unsafe_code)] +#![no_std] +#![no_main] + +use cortex_m_rt::entry; +use panic_halt as _; + +use embedded_hal::spi::{Mode, Phase, Polarity}; +pub const MODE: Mode = Mode { + phase: Phase::CaptureOnSecondTransition, + polarity: Polarity::IdleHigh, +}; + +use stm32f1xx_hal::{ + gpio::gpioa::PA4, + gpio::{Output, PushPull}, + pac::{Peripherals, SPI1}, + prelude::*, + spi::{Pins, Spi, Spi1NoRemap}, +}; + +fn setup() -> ( + Spi, u8>, + PA4>, +) { + let dp = Peripherals::take().unwrap(); + + let mut flash = dp.FLASH.constrain(); + let mut rcc = dp.RCC.constrain(); + + let clocks = rcc.cfgr.freeze(&mut flash.acr); + + let mut afio = dp.AFIO.constrain(&mut rcc.apb2); + let mut gpioa = dp.GPIOA.split(&mut rcc.apb2); + + // SPI1 + let sck = gpioa.pa5.into_alternate_push_pull(&mut gpioa.crl); + let miso = gpioa.pa6; + let mosi = gpioa.pa7.into_alternate_push_pull(&mut gpioa.crl); + let cs = gpioa.pa4.into_push_pull_output(&mut gpioa.crl); + + let spi = Spi::spi1( + dp.SPI1, + (sck, miso, mosi), + &mut afio.mapr, + MODE, + 1_u32.mhz(), + clocks, + &mut rcc.apb2, + ); + + (spi, cs) +} + +#[entry] +fn main() -> ! { + let (_spi, _cs) = setup(); + + loop {} +} diff --git a/src/spi.rs b/src/spi.rs index e08cfbba..45799511 100644 --- a/src/spi.rs +++ b/src/spi.rs @@ -79,37 +79,19 @@ mod sealed { pub trait Sck {} pub trait Miso {} pub trait Mosi {} - pub struct _Sck; - pub struct _Miso; - pub struct _Mosi; } -use sealed::{Miso, Mosi, Remap, Sck}; +pub use sealed::Remap; +use sealed::{Miso, Mosi, Sck}; -pub trait Pins { - type _Pos; -} -macro_rules! pins_impl { - ( $( ( $($PINX:ident),+ ), ( $($TRAIT:ident),+ ), ( $($POS:ident),* ); )+ ) => { - $( - #[allow(unused_parens)] - impl Pins for ($($PINX),+) - where - $($PINX: $TRAIT,)+ - { - type _Pos = ($(sealed::$POS),+); - } - )+ - }; -} +pub trait Pins {} -pins_impl!( - (SCK, MISO, MOSI), (Sck, Miso, Mosi), (_Sck, _Miso, _Mosi); - (SCK, MOSI, MISO), (Sck, Mosi, Miso), (_Sck, _Mosi, _Miso); - (MOSI, SCK, MISO), (Mosi, Sck, Miso), (_Mosi, _Sck, _Miso); - (MOSI, MISO, SCK), (Mosi, Miso, Sck), (_Mosi, _Miso, _Sck); - (MISO, MOSI, SCK), (Miso, Mosi, Sck), (_Miso, _Mosi, _Sck); - (MISO, SCK, MOSI), (Miso, Sck, Mosi), (_Miso, _Sck, _Mosi); -); +impl Pins for (SCK, MISO, MOSI) +where + SCK: Sck, + MISO: Miso, + MOSI: Mosi, +{ +} pub struct Spi { spi: SPI, @@ -169,7 +151,7 @@ impl Spi { You can also use `NoSck`, `NoMiso` or `NoMosi` if you don't want to use the pins */ - pub fn spi1( + pub fn spi1( spi: SPI1, pins: PINS, mapr: &mut MAPR, @@ -181,7 +163,7 @@ impl Spi { where F: Into, REMAP: Remap, - PINS: Pins, + PINS: Pins, { mapr.modify_mapr(|_, w| w.spi1_remap().bit(REMAP::REMAP)); Spi::::_spi(spi, pins, mode, freq.into(), clocks, apb) @@ -196,7 +178,7 @@ impl Spi { You can also use `NoSck`, `NoMiso` or `NoMosi` if you don't want to use the pins */ - pub fn spi2( + pub fn spi2( spi: SPI2, pins: PINS, mode: Mode, @@ -207,7 +189,7 @@ impl Spi { where F: Into, REMAP: Remap, - PINS: Pins, + PINS: Pins, { Spi::::_spi(spi, pins, mode, freq.into(), clocks, apb) } @@ -223,7 +205,7 @@ impl Spi { You can also use `NoSck`, `NoMiso` or `NoMosi` if you don't want to use the pins */ #[cfg(not(feature = "connectivity"))] - pub fn spi3( + pub fn spi3( spi: SPI3, pins: PINS, mode: Mode, @@ -234,7 +216,7 @@ impl Spi { where F: Into, REMAP: Remap, - PINS: Pins, + PINS: Pins, { Spi::::_spi(spi, pins, mode, freq.into(), clocks, apb) } @@ -247,7 +229,7 @@ impl Spi { You can also use `NoSck`, `NoMiso` or `NoMosi` if you don't want to use the pins */ #[cfg(feature = "connectivity")] - pub fn spi3( + pub fn spi3( spi: SPI3, pins: PINS, mapr: &mut MAPR, @@ -259,7 +241,7 @@ impl Spi { where F: Into, REMAP: Remap, - PINS: Pins, + PINS: Pins, { mapr.modify_mapr(|_, w| w.spi3_remap().bit(REMAP::REMAP)); Spi::::_spi(spi, pins, mode, freq.into(), clocks, apb)