Compare commits
1 Commits
3264832ecc
...
0d2fcd346b
Author | SHA1 | Date | |
---|---|---|---|
0d2fcd346b |
@@ -30,7 +30,7 @@ pub enum FifoEmptyMode {
|
|||||||
|
|
||||||
#[derive(Debug, PartialEq, Eq)]
|
#[derive(Debug, PartialEq, Eq)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct ClockTooSlowForFastI2cError;
|
pub struct ClockTooSlowForFastI2c;
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Eq)]
|
#[derive(Debug, PartialEq, Eq)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
@@ -52,11 +52,11 @@ pub enum InitError {
|
|||||||
/// Wrong address used in constructor
|
/// Wrong address used in constructor
|
||||||
WrongAddrMode,
|
WrongAddrMode,
|
||||||
/// APB1 clock is too slow for fast I2C mode.
|
/// APB1 clock is too slow for fast I2C mode.
|
||||||
ClkTooSlow(ClockTooSlowForFastI2cError),
|
ClkTooSlow(ClockTooSlowForFastI2c),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<ClockTooSlowForFastI2cError> for InitError {
|
impl From<ClockTooSlowForFastI2c> for InitError {
|
||||||
fn from(value: ClockTooSlowForFastI2cError) -> Self {
|
fn from(value: ClockTooSlowForFastI2c) -> Self {
|
||||||
Self::ClkTooSlow(value)
|
Self::ClkTooSlow(value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -318,7 +318,7 @@ impl<I2c: Instance> I2cBase<I2c> {
|
|||||||
speed_mode: I2cSpeed,
|
speed_mode: I2cSpeed,
|
||||||
ms_cfg: Option<&MasterConfig>,
|
ms_cfg: Option<&MasterConfig>,
|
||||||
sl_cfg: Option<&SlaveConfig>,
|
sl_cfg: Option<&SlaveConfig>,
|
||||||
) -> Result<Self, ClockTooSlowForFastI2cError> {
|
) -> Result<Self, ClockTooSlowForFastI2c> {
|
||||||
syscfg.enable_peripheral_clock(I2c::PERIPH_SEL);
|
syscfg.enable_peripheral_clock(I2c::PERIPH_SEL);
|
||||||
|
|
||||||
let mut i2c_base = I2cBase {
|
let mut i2c_base = I2cBase {
|
||||||
@@ -421,19 +421,19 @@ impl<I2c: Instance> I2cBase<I2c> {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
fn calc_clk_div(&self, speed_mode: I2cSpeed) -> Result<u8, ClockTooSlowForFastI2cError> {
|
fn calc_clk_div(&self, speed_mode: I2cSpeed) -> Result<u8, ClockTooSlowForFastI2c> {
|
||||||
if speed_mode == I2cSpeed::Regular100khz {
|
if speed_mode == I2cSpeed::Regular100khz {
|
||||||
Ok(((self.clock.raw() / CLK_100K.raw() / 20) - 1) as u8)
|
Ok(((self.clock.raw() / CLK_100K.raw() / 20) - 1) as u8)
|
||||||
} else {
|
} else {
|
||||||
if self.clock.raw() < MIN_CLK_400K.raw() {
|
if self.clock.raw() < MIN_CLK_400K.raw() {
|
||||||
return Err(ClockTooSlowForFastI2cError);
|
return Err(ClockTooSlowForFastI2c);
|
||||||
}
|
}
|
||||||
Ok(((self.clock.raw() / CLK_400K.raw() / 25) - 1) as u8)
|
Ok(((self.clock.raw() / CLK_400K.raw() / 25) - 1) as u8)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Configures the clock scale for a given speed mode setting
|
/// Configures the clock scale for a given speed mode setting
|
||||||
pub fn cfg_clk_scale(&mut self, speed_mode: I2cSpeed) -> Result<(), ClockTooSlowForFastI2cError> {
|
pub fn cfg_clk_scale(&mut self, speed_mode: I2cSpeed) -> Result<(), ClockTooSlowForFastI2c> {
|
||||||
let clk_div = self.calc_clk_div(speed_mode)?;
|
let clk_div = self.calc_clk_div(speed_mode)?;
|
||||||
self.i2c
|
self.i2c
|
||||||
.clkscale()
|
.clkscale()
|
||||||
@@ -472,7 +472,7 @@ impl<I2c: Instance, Addr> I2cMaster<I2c, Addr> {
|
|||||||
cfg: MasterConfig,
|
cfg: MasterConfig,
|
||||||
clocks: &Clocks,
|
clocks: &Clocks,
|
||||||
speed_mode: I2cSpeed,
|
speed_mode: I2cSpeed,
|
||||||
) -> Result<Self, ClockTooSlowForFastI2cError> {
|
) -> Result<Self, ClockTooSlowForFastI2c> {
|
||||||
Ok(I2cMaster {
|
Ok(I2cMaster {
|
||||||
i2c_base: I2cBase::new(i2c, sys_cfg, clocks, speed_mode, Some(&cfg), None)?,
|
i2c_base: I2cBase::new(i2c, sys_cfg, clocks, speed_mode, Some(&cfg), None)?,
|
||||||
addr: PhantomData,
|
addr: PhantomData,
|
||||||
@@ -733,7 +733,7 @@ impl<I2c: Instance, Addr> I2cSlave<I2c, Addr> {
|
|||||||
cfg: SlaveConfig,
|
cfg: SlaveConfig,
|
||||||
clocks: &Clocks,
|
clocks: &Clocks,
|
||||||
speed_mode: I2cSpeed,
|
speed_mode: I2cSpeed,
|
||||||
) -> Result<Self, ClockTooSlowForFastI2cError> {
|
) -> Result<Self, ClockTooSlowForFastI2c> {
|
||||||
Ok(I2cSlave {
|
Ok(I2cSlave {
|
||||||
i2c_base: I2cBase::new(i2c, sys_cfg, clocks, speed_mode, None, Some(&cfg))?,
|
i2c_base: I2cBase::new(i2c, sys_cfg, clocks, speed_mode, None, Some(&cfg))?,
|
||||||
addr: PhantomData,
|
addr: PhantomData,
|
||||||
@@ -895,7 +895,7 @@ impl<I2c: Instance> I2cSlave<I2c, TenBitAddress> {
|
|||||||
cfg: SlaveConfig,
|
cfg: SlaveConfig,
|
||||||
clocks: &Clocks,
|
clocks: &Clocks,
|
||||||
speed_mode: I2cSpeed,
|
speed_mode: I2cSpeed,
|
||||||
) -> Result<Self, ClockTooSlowForFastI2cError> {
|
) -> Result<Self, ClockTooSlowForFastI2c> {
|
||||||
Self::new_generic(i2c, sys_cfg, cfg, clocks, speed_mode)
|
Self::new_generic(i2c, sys_cfg, cfg, clocks, speed_mode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user