embassy/embassy-stm32/src/i2c/mod.rs

77 lines
1.7 KiB
Rust
Raw Normal View History

2021-05-24 17:41:37 +02:00
#![macro_use]
#[cfg_attr(i2c_v1, path = "v1.rs")]
#[cfg_attr(i2c_v2, path = "v2.rs")]
2021-05-24 17:41:37 +02:00
mod _version;
use crate::peripherals;
2021-05-24 17:41:37 +02:00
pub use _version::*;
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
2021-05-24 17:41:37 +02:00
pub enum Error {
Bus,
Arbitration,
Nack,
2021-05-25 20:47:07 +02:00
Timeout,
Crc,
Overrun,
2021-07-09 07:57:34 +02:00
ZeroLengthTransfer,
2021-05-24 17:41:37 +02:00
}
pub(crate) mod sealed {
use crate::gpio::Pin;
use crate::rcc::RccPeripheral;
2021-05-24 17:41:37 +02:00
pub trait Instance: RccPeripheral {
2021-05-24 17:41:37 +02:00
fn regs() -> &'static crate::pac::i2c::I2c;
}
pub trait SclPin<T: Instance>: Pin {
fn af_num(&self) -> u8;
}
pub trait SdaPin<T: Instance>: Pin {
fn af_num(&self) -> u8;
}
}
pub trait Instance: sealed::Instance + 'static {}
pub trait SclPin<T: Instance>: sealed::SclPin<T> + 'static {}
pub trait SdaPin<T: Instance>: sealed::SdaPin<T> + 'static {}
crate::pac::peripherals!(
(i2c, $inst:ident) => {
impl sealed::Instance for peripherals::$inst {
2021-05-24 17:41:37 +02:00
fn regs() -> &'static crate::pac::i2c::I2c {
&crate::pac::$inst
}
}
impl Instance for peripherals::$inst {}
2021-05-24 17:41:37 +02:00
};
);
2021-05-24 17:41:37 +02:00
2021-06-03 17:29:29 +02:00
macro_rules! impl_pin {
($inst:ident, $pin:ident, $signal:ident, $af:expr) => {
impl $signal<peripherals::$inst> for peripherals::$pin {}
2021-05-24 17:41:37 +02:00
2021-06-03 17:29:29 +02:00
impl sealed::$signal<peripherals::$inst> for peripherals::$pin {
2021-05-24 17:41:37 +02:00
fn af_num(&self) -> u8 {
$af
}
}
};
2021-06-03 17:29:29 +02:00
}
2021-06-03 17:29:29 +02:00
crate::pac::peripheral_pins!(
($inst:ident, i2c, I2C, $pin:ident, SDA, $af:expr) => {
impl_pin!($inst, $pin, SdaPin, $af);
};
2021-06-03 17:29:29 +02:00
($inst:ident, i2c, I2C, $pin:ident, SCL, $af:expr) => {
impl_pin!($inst, $pin, SclPin, $af);
};
);