aboutsummaryrefslogtreecommitdiff
path: root/embassy-mspm0/src/i2c.rs
diff options
context:
space:
mode:
Diffstat (limited to 'embassy-mspm0/src/i2c.rs')
-rw-r--r--embassy-mspm0/src/i2c.rs29
1 files changed, 14 insertions, 15 deletions
diff --git a/embassy-mspm0/src/i2c.rs b/embassy-mspm0/src/i2c.rs
index 7581f131e..d1b260114 100644
--- a/embassy-mspm0/src/i2c.rs
+++ b/embassy-mspm0/src/i2c.rs
@@ -16,7 +16,6 @@ use crate::interrupt::{Interrupt, InterruptExt};
16use crate::mode::{Async, Blocking, Mode}; 16use crate::mode::{Async, Blocking, Mode};
17use crate::pac::i2c::{vals, I2c as Regs}; 17use crate::pac::i2c::{vals, I2c as Regs};
18use crate::pac::{self}; 18use crate::pac::{self};
19use crate::time::Hertz;
20use crate::Peri; 19use crate::Peri;
21 20
22/// The clock source for the I2C. 21/// The clock source for the I2C.
@@ -106,15 +105,15 @@ pub enum BusSpeed {
106 /// Custom mode. 105 /// Custom mode.
107 /// 106 ///
108 /// The custom mode frequency (in Hz) can be set manually. 107 /// The custom mode frequency (in Hz) can be set manually.
109 Custom(Hertz), 108 Custom(u32),
110} 109}
111 110
112impl BusSpeed { 111impl BusSpeed {
113 fn hertz(self) -> Hertz { 112 fn hertz(self) -> u32 {
114 match self { 113 match self {
115 Self::Standard => Hertz::khz(100), 114 Self::Standard => 100_000,
116 Self::FastMode => Hertz::khz(400), 115 Self::FastMode => 400_000,
117 Self::FastModePlus => Hertz::mhz(1), 116 Self::FastModePlus => 1_000_000,
118 Self::Custom(s) => s, 117 Self::Custom(s) => s,
119 } 118 }
120 } 119 }
@@ -197,12 +196,12 @@ impl Config {
197 } 196 }
198 197
199 #[cfg(any(mspm0c110x))] 198 #[cfg(any(mspm0c110x))]
200 fn calculate_clock_source(&self) -> Hertz { 199 fn calculate_clock_source(&self) -> u32 {
201 // Assume that BusClk has default value. 200 // Assume that BusClk has default value.
202 // TODO: calculate BusClk more precisely. 201 // TODO: calculate BusClk more precisely.
203 match self.clock_source { 202 match self.clock_source {
204 ClockSel::MfClk => Hertz::mhz(4), 203 ClockSel::MfClk => 4_000_000,
205 ClockSel::BusClk => Hertz::mhz(24), 204 ClockSel::BusClk => 24_000_000,
206 } 205 }
207 } 206 }
208 207
@@ -210,18 +209,18 @@ impl Config {
210 mspm0g110x, mspm0g150x, mspm0g151x, mspm0g310x, mspm0g350x, mspm0g351x, mspm0l110x, mspm0l122x, mspm0l130x, 209 mspm0g110x, mspm0g150x, mspm0g151x, mspm0g310x, mspm0g350x, mspm0g351x, mspm0l110x, mspm0l122x, mspm0l130x,
211 mspm0l134x, mspm0l222x 210 mspm0l134x, mspm0l222x
212 ))] 211 ))]
213 fn calculate_clock_source(&self) -> Hertz { 212 fn calculate_clock_source(&self) -> u32 {
214 // Assume that BusClk has default value. 213 // Assume that BusClk has default value.
215 // TODO: calculate BusClk more precisely. 214 // TODO: calculate BusClk more precisely.
216 match self.clock_source { 215 match self.clock_source {
217 ClockSel::MfClk => Hertz::mhz(4), 216 ClockSel::MfClk => 4_000_000,
218 ClockSel::BusClk => Hertz::mhz(32), 217 ClockSel::BusClk => 24_000_000,
219 } 218 }
220 } 219 }
221 220
222 fn check_clock_i2c(&self) -> bool { 221 fn check_clock_i2c(&self) -> bool {
223 // make sure source clock is ~20 faster than i2c clock 222 // make sure source clock is ~20 faster than i2c clock
224 let clk_ratio = 20u8; 223 let clk_ratio = 20;
225 224
226 let i2c_clk = self.bus_speed.hertz() / self.clock_div.divider(); 225 let i2c_clk = self.bus_speed.hertz() / self.clock_div.divider();
227 let src_clk = self.calculate_clock_source(); 226 let src_clk = self.calculate_clock_source();
@@ -233,7 +232,7 @@ impl Config {
233 fn define_clock_source(&mut self) -> bool { 232 fn define_clock_source(&mut self) -> bool {
234 // decide which clock source to choose based on i2c clock. 233 // decide which clock source to choose based on i2c clock.
235 // If i2c speed <= 200kHz, use MfClk, otherwise use BusClk 234 // If i2c speed <= 200kHz, use MfClk, otherwise use BusClk
236 if self.bus_speed.hertz() / self.clock_div.divider() > Hertz::khz(200) { 235 if self.bus_speed.hertz() / self.clock_div.divider() > 200_000 {
237 // TODO: check if BUSCLK enabled 236 // TODO: check if BUSCLK enabled
238 self.clock_source = ClockSel::BusClk; 237 self.clock_source = ClockSel::BusClk;
239 } else { 238 } else {
@@ -419,7 +418,7 @@ impl<'d, M: Mode> I2c<'d, M> {
419 418
420 self.state 419 self.state
421 .clock 420 .clock
422 .store(config.calculate_clock_source().0, Ordering::Relaxed); 421 .store(config.calculate_clock_source(), Ordering::Relaxed);
423 422
424 self.info 423 self.info
425 .regs 424 .regs