Update mod.rs
This commit is contained in:
parent
b4bc9ac028
commit
f0714a026e
@ -77,6 +77,7 @@ pub struct Spi<'d, T: Instance, Tx, Rx> {
|
|||||||
sck: Option<PeripheralRef<'d, AnyPin>>,
|
sck: Option<PeripheralRef<'d, AnyPin>>,
|
||||||
mosi: Option<PeripheralRef<'d, AnyPin>>,
|
mosi: Option<PeripheralRef<'d, AnyPin>>,
|
||||||
miso: Option<PeripheralRef<'d, AnyPin>>,
|
miso: Option<PeripheralRef<'d, AnyPin>>,
|
||||||
|
cs: Option<PeripheralRef<'d, AnyPin>>,
|
||||||
txdma: PeripheralRef<'d, Tx>,
|
txdma: PeripheralRef<'d, Tx>,
|
||||||
rxdma: PeripheralRef<'d, Rx>,
|
rxdma: PeripheralRef<'d, Rx>,
|
||||||
current_word_size: word_impl::Config,
|
current_word_size: word_impl::Config,
|
||||||
@ -108,6 +109,46 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
|
|||||||
|
|
||||||
Self::new_inner(
|
Self::new_inner(
|
||||||
peri,
|
peri,
|
||||||
|
None,
|
||||||
|
Some(sck.map_into()),
|
||||||
|
Some(mosi.map_into()),
|
||||||
|
Some(miso.map_into()),
|
||||||
|
txdma,
|
||||||
|
rxdma,
|
||||||
|
config,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Creates a new SPI instance with hardware CS pin.
|
||||||
|
pub fn new_cs(
|
||||||
|
peri: impl Peripheral<P = T> + 'd,
|
||||||
|
cs: impl Peripheral<P = impl CsPin<T>> + 'd,
|
||||||
|
sck: impl Peripheral<P = impl SckPin<T>> + 'd,
|
||||||
|
mosi: impl Peripheral<P = impl MosiPin<T>> + 'd,
|
||||||
|
miso: impl Peripheral<P = impl MisoPin<T>> + 'd,
|
||||||
|
txdma: impl Peripheral<P = Tx> + 'd,
|
||||||
|
rxdma: impl Peripheral<P = Rx> + 'd,
|
||||||
|
config: Config,
|
||||||
|
) -> Self {
|
||||||
|
into_ref!(cs, peri, sck, mosi, miso);
|
||||||
|
|
||||||
|
let sck_pull_mode = match config.mode.polarity {
|
||||||
|
Polarity::IdleLow => Pull::Down,
|
||||||
|
Polarity::IdleHigh => Pull::Up,
|
||||||
|
};
|
||||||
|
|
||||||
|
cs.set_as_af(cs.af_num(), AFType::OutputPushPull);
|
||||||
|
cs.set_speed(crate::gpio::Speed::VeryHigh);
|
||||||
|
sck.set_as_af_pull(sck.af_num(), AFType::OutputPushPull, sck_pull_mode);
|
||||||
|
sck.set_speed(crate::gpio::Speed::VeryHigh);
|
||||||
|
mosi.set_as_af(mosi.af_num(), AFType::OutputPushPull);
|
||||||
|
mosi.set_speed(crate::gpio::Speed::VeryHigh);
|
||||||
|
miso.set_as_af(miso.af_num(), AFType::Input);
|
||||||
|
miso.set_speed(crate::gpio::Speed::VeryHigh);
|
||||||
|
|
||||||
|
Self::new_inner(
|
||||||
|
peri,
|
||||||
|
Some(cs.map_into()),
|
||||||
Some(sck.map_into()),
|
Some(sck.map_into()),
|
||||||
Some(mosi.map_into()),
|
Some(mosi.map_into()),
|
||||||
Some(miso.map_into()),
|
Some(miso.map_into()),
|
||||||
@ -133,6 +174,7 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
|
|||||||
|
|
||||||
Self::new_inner(
|
Self::new_inner(
|
||||||
peri,
|
peri,
|
||||||
|
None,
|
||||||
Some(sck.map_into()),
|
Some(sck.map_into()),
|
||||||
None,
|
None,
|
||||||
Some(miso.map_into()),
|
Some(miso.map_into()),
|
||||||
@ -158,6 +200,36 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
|
|||||||
|
|
||||||
Self::new_inner(
|
Self::new_inner(
|
||||||
peri,
|
peri,
|
||||||
|
None,
|
||||||
|
Some(sck.map_into()),
|
||||||
|
Some(mosi.map_into()),
|
||||||
|
None,
|
||||||
|
txdma,
|
||||||
|
rxdma,
|
||||||
|
config,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn new_txonly_cs(
|
||||||
|
peri: impl Peripheral<P = T> + 'd,
|
||||||
|
cs: impl Peripheral<P = impl CsPin<T>> + 'd,
|
||||||
|
sck: impl Peripheral<P = impl SckPin<T>> + 'd,
|
||||||
|
mosi: impl Peripheral<P = impl MosiPin<T>> + 'd,
|
||||||
|
txdma: impl Peripheral<P = Tx> + 'd,
|
||||||
|
rxdma: impl Peripheral<P = Rx> + 'd, // TODO remove
|
||||||
|
config: Config,
|
||||||
|
) -> Self {
|
||||||
|
into_ref!(cs, sck, mosi);
|
||||||
|
cs.set_as_af(cs.af_num(), AFType::OutputPushPull);
|
||||||
|
cs.set_speed(crate::gpio::Speed::VeryHigh);
|
||||||
|
sck.set_as_af(sck.af_num(), AFType::OutputPushPull);
|
||||||
|
sck.set_speed(crate::gpio::Speed::VeryHigh);
|
||||||
|
mosi.set_as_af(mosi.af_num(), AFType::OutputPushPull);
|
||||||
|
mosi.set_speed(crate::gpio::Speed::VeryHigh);
|
||||||
|
|
||||||
|
Self::new_inner(
|
||||||
|
peri,
|
||||||
|
Some(cs.map_into()),
|
||||||
Some(sck.map_into()),
|
Some(sck.map_into()),
|
||||||
Some(mosi.map_into()),
|
Some(mosi.map_into()),
|
||||||
None,
|
None,
|
||||||
@ -178,7 +250,24 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
|
|||||||
mosi.set_as_af_pull(mosi.af_num(), AFType::OutputPushPull, Pull::Down);
|
mosi.set_as_af_pull(mosi.af_num(), AFType::OutputPushPull, Pull::Down);
|
||||||
mosi.set_speed(crate::gpio::Speed::Medium);
|
mosi.set_speed(crate::gpio::Speed::Medium);
|
||||||
|
|
||||||
Self::new_inner(peri, None, Some(mosi.map_into()), None, txdma, rxdma, config)
|
Self::new_inner(peri, None, None, Some(mosi.map_into()), None, txdma, rxdma, config)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn new_txonly_nosck_cs(
|
||||||
|
peri: impl Peripheral<P = T> + 'd,
|
||||||
|
cs: impl Peripheral<P = impl CsPin<T>> + 'd,
|
||||||
|
mosi: impl Peripheral<P = impl MosiPin<T>> + 'd,
|
||||||
|
txdma: impl Peripheral<P = Tx> + 'd,
|
||||||
|
rxdma: impl Peripheral<P = Rx> + 'd, // TODO: remove
|
||||||
|
config: Config,
|
||||||
|
) -> Self {
|
||||||
|
into_ref!(cs, mosi);
|
||||||
|
cs.set_as_af(cs.af_num(), AFType::OutputPushPull);
|
||||||
|
cs.set_speed(crate::gpio::Speed::VeryHigh);
|
||||||
|
mosi.set_as_af_pull(mosi.af_num(), AFType::OutputPushPull, Pull::Down);
|
||||||
|
mosi.set_speed(crate::gpio::Speed::Medium);
|
||||||
|
|
||||||
|
Self::new_inner(peri, Some(cs.map_into()), None, Some(mosi.map_into()), None, txdma, rxdma, config)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(stm32wl)]
|
#[cfg(stm32wl)]
|
||||||
@ -197,7 +286,7 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
|
|||||||
config.mode = MODE_0;
|
config.mode = MODE_0;
|
||||||
config.bit_order = BitOrder::MsbFirst;
|
config.bit_order = BitOrder::MsbFirst;
|
||||||
config.frequency = freq;
|
config.frequency = freq;
|
||||||
Self::new_inner(peri, None, None, None, txdma, rxdma, config)
|
Self::new_inner(peri, None, None, None, None, txdma, rxdma, config)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
@ -207,11 +296,12 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
|
|||||||
rxdma: impl Peripheral<P = Rx> + 'd,
|
rxdma: impl Peripheral<P = Rx> + 'd,
|
||||||
config: Config,
|
config: Config,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
Self::new_inner(peri, None, None, None, txdma, rxdma, config)
|
Self::new_inner(peri, None, None, None, None, txdma, rxdma, config)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn new_inner(
|
fn new_inner(
|
||||||
peri: impl Peripheral<P = T> + 'd,
|
peri: impl Peripheral<P = T> + 'd,
|
||||||
|
cs: Option<PeripheralRef<'d, AnyPin>>,
|
||||||
sck: Option<PeripheralRef<'d, AnyPin>>,
|
sck: Option<PeripheralRef<'d, AnyPin>>,
|
||||||
mosi: Option<PeripheralRef<'d, AnyPin>>,
|
mosi: Option<PeripheralRef<'d, AnyPin>>,
|
||||||
miso: Option<PeripheralRef<'d, AnyPin>>,
|
miso: Option<PeripheralRef<'d, AnyPin>>,
|
||||||
@ -235,7 +325,7 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
|
|||||||
#[cfg(any(spi_v1, spi_f1))]
|
#[cfg(any(spi_v1, spi_f1))]
|
||||||
{
|
{
|
||||||
T::REGS.cr2().modify(|w| {
|
T::REGS.cr2().modify(|w| {
|
||||||
w.set_ssoe(false);
|
w.set_ssoe(cs.is_some());
|
||||||
});
|
});
|
||||||
T::REGS.cr1().modify(|w| {
|
T::REGS.cr1().modify(|w| {
|
||||||
w.set_cpha(cpha);
|
w.set_cpha(cpha);
|
||||||
@ -261,7 +351,7 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
|
|||||||
let (ds, frxth) = <u8 as sealed::Word>::CONFIG;
|
let (ds, frxth) = <u8 as sealed::Word>::CONFIG;
|
||||||
w.set_frxth(frxth);
|
w.set_frxth(frxth);
|
||||||
w.set_ds(ds);
|
w.set_ds(ds);
|
||||||
w.set_ssoe(false);
|
w.set_ssoe(cs.is_some());
|
||||||
});
|
});
|
||||||
T::REGS.cr1().modify(|w| {
|
T::REGS.cr1().modify(|w| {
|
||||||
w.set_cpha(cpha);
|
w.set_cpha(cpha);
|
||||||
@ -281,8 +371,7 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
|
|||||||
{
|
{
|
||||||
T::REGS.ifcr().write(|w| w.0 = 0xffff_ffff);
|
T::REGS.ifcr().write(|w| w.0 = 0xffff_ffff);
|
||||||
T::REGS.cfg2().modify(|w| {
|
T::REGS.cfg2().modify(|w| {
|
||||||
//w.set_ssoe(true);
|
w.set_ssoe(cs.is_some());
|
||||||
w.set_ssoe(false);
|
|
||||||
w.set_cpha(cpha);
|
w.set_cpha(cpha);
|
||||||
w.set_cpol(cpol);
|
w.set_cpol(cpol);
|
||||||
w.set_lsbfirst(lsbfirst);
|
w.set_lsbfirst(lsbfirst);
|
||||||
@ -315,12 +404,26 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
|
|||||||
sck,
|
sck,
|
||||||
mosi,
|
mosi,
|
||||||
miso,
|
miso,
|
||||||
|
cs: None,
|
||||||
txdma,
|
txdma,
|
||||||
rxdma,
|
rxdma,
|
||||||
current_word_size: <u8 as sealed::Word>::CONFIG,
|
current_word_size: <u8 as sealed::Word>::CONFIG,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Enables/disables the hardware CS pin. Requires that a hardware CS pin
|
||||||
|
/// was passed in during initialization. Useful if you have one device with
|
||||||
|
/// hardware CS and another with software/GPIO CS.
|
||||||
|
pub fn set_hardware_cs_enabled(&mut self, enabled: bool) {
|
||||||
|
if enabled && self.cs.is_none() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
T::REGS.cfg2().modify(|w| {
|
||||||
|
w.set_ssoe(enabled);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/// Reconfigures it with the supplied config.
|
/// Reconfigures it with the supplied config.
|
||||||
pub fn set_config(&mut self, config: &Config) -> Result<(), ()> {
|
pub fn set_config(&mut self, config: &Config) -> Result<(), ()> {
|
||||||
let cpha = config.raw_phase();
|
let cpha = config.raw_phase();
|
||||||
|
Loading…
Reference in New Issue
Block a user