Implement I2C pullup configuration
This commit is contained in:
@ -213,7 +213,7 @@ impl<'d, T: Pin> Drop for Flex<'d, T> {
|
||||
}
|
||||
|
||||
/// Pull setting for an input.
|
||||
#[derive(Debug, Eq, PartialEq)]
|
||||
#[derive(Debug, Eq, PartialEq, Copy, Clone)]
|
||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||
pub enum Pull {
|
||||
None,
|
||||
@ -235,7 +235,7 @@ impl From<Pull> for vals::Pupdr {
|
||||
}
|
||||
|
||||
/// Speed settings
|
||||
#[derive(Debug)]
|
||||
#[derive(Debug, Copy, Clone)]
|
||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||
pub enum Speed {
|
||||
Low,
|
||||
@ -303,7 +303,7 @@ impl<'d, T: Pin> Input<'d, T> {
|
||||
}
|
||||
|
||||
/// Digital input or output level.
|
||||
#[derive(Debug, Eq, PartialEq)]
|
||||
#[derive(Debug, Eq, PartialEq, Copy, Clone)]
|
||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||
pub enum Level {
|
||||
Low,
|
||||
@ -470,7 +470,7 @@ pub(crate) mod sealed {
|
||||
use super::*;
|
||||
|
||||
/// Alternate function type settings
|
||||
#[derive(Debug)]
|
||||
#[derive(Debug, Copy, Clone)]
|
||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||
pub enum AFType {
|
||||
Input,
|
||||
|
@ -4,11 +4,24 @@ use embassy_embedded_hal::SetConfig;
|
||||
use embassy_hal_common::into_ref;
|
||||
|
||||
use crate::gpio::sealed::AFType;
|
||||
use crate::gpio::Pull;
|
||||
use crate::i2c::{Error, Instance, SclPin, SdaPin};
|
||||
use crate::pac::i2c;
|
||||
use crate::time::Hertz;
|
||||
use crate::Peripheral;
|
||||
|
||||
#[non_exhaustive]
|
||||
#[derive(Copy, Clone)]
|
||||
pub struct Config {
|
||||
pullup_enable: bool,
|
||||
}
|
||||
|
||||
impl Default for Config {
|
||||
fn default() -> Self {
|
||||
Self { pullup_enable: true }
|
||||
}
|
||||
}
|
||||
|
||||
pub struct State {}
|
||||
|
||||
impl State {
|
||||
@ -27,15 +40,21 @@ impl<'d, T: Instance> I2c<'d, T> {
|
||||
scl: impl Peripheral<P = impl SclPin<T>> + 'd,
|
||||
sda: impl Peripheral<P = impl SdaPin<T>> + 'd,
|
||||
freq: Hertz,
|
||||
config: Config,
|
||||
) -> Self {
|
||||
into_ref!(scl, sda);
|
||||
|
||||
T::enable();
|
||||
T::reset();
|
||||
|
||||
let pull = match config.pullup_enable {
|
||||
true => Pull::Up,
|
||||
false => Pull::None,
|
||||
};
|
||||
|
||||
unsafe {
|
||||
scl.set_as_af(scl.af_num(), AFType::OutputOpenDrain);
|
||||
sda.set_as_af(sda.af_num(), AFType::OutputOpenDrain);
|
||||
scl.set_as_af_pull(scl.af_num(), AFType::OutputOpenDrain, pull);
|
||||
sda.set_as_af_pull(sda.af_num(), AFType::OutputOpenDrain, pull);
|
||||
}
|
||||
|
||||
unsafe {
|
||||
|
@ -10,12 +10,25 @@ use futures::future::poll_fn;
|
||||
|
||||
use crate::dma::NoDma;
|
||||
use crate::gpio::sealed::AFType;
|
||||
use crate::gpio::Pull;
|
||||
use crate::i2c::{Error, Instance, SclPin, SdaPin};
|
||||
use crate::interrupt::InterruptExt;
|
||||
use crate::pac::i2c;
|
||||
use crate::time::Hertz;
|
||||
use crate::Peripheral;
|
||||
|
||||
#[non_exhaustive]
|
||||
#[derive(Copy, Clone)]
|
||||
pub struct Config {
|
||||
pullup_enable: bool,
|
||||
}
|
||||
|
||||
impl Default for Config {
|
||||
fn default() -> Self {
|
||||
Self { pullup_enable: true }
|
||||
}
|
||||
}
|
||||
|
||||
pub struct State {
|
||||
waker: AtomicWaker,
|
||||
chunks_transferred: AtomicUsize,
|
||||
@ -46,15 +59,21 @@ impl<'d, T: Instance, TXDMA, RXDMA> I2c<'d, T, TXDMA, RXDMA> {
|
||||
tx_dma: impl Peripheral<P = TXDMA> + 'd,
|
||||
rx_dma: impl Peripheral<P = RXDMA> + 'd,
|
||||
freq: Hertz,
|
||||
config: Config,
|
||||
) -> Self {
|
||||
into_ref!(peri, irq, scl, sda, tx_dma, rx_dma);
|
||||
|
||||
T::enable();
|
||||
T::reset();
|
||||
|
||||
let pull = match config.pullup_enable {
|
||||
true => Pull::Up,
|
||||
false => Pull::None,
|
||||
};
|
||||
|
||||
unsafe {
|
||||
scl.set_as_af(scl.af_num(), AFType::OutputOpenDrain);
|
||||
sda.set_as_af(sda.af_num(), AFType::OutputOpenDrain);
|
||||
scl.set_as_af_pull(scl.af_num(), AFType::OutputOpenDrain, pull);
|
||||
sda.set_as_af_pull(sda.af_num(), AFType::OutputOpenDrain, pull);
|
||||
}
|
||||
|
||||
unsafe {
|
||||
|
Reference in New Issue
Block a user