Shared buses with SetConfig

This commit is contained in:
Henrik Alsér
2022-07-08 15:47:47 +02:00
parent 6baddaf539
commit f30ff9cadc
9 changed files with 352 additions and 0 deletions

View File

@ -4,6 +4,7 @@ use core::marker::PhantomData;
use core::sync::atomic::{compiler_fence, Ordering};
use core::task::Poll;
use embassy_embedded_hal::SetConfig;
use embassy_hal_common::unborrow;
pub use embedded_hal_02::spi::{Mode, Phase, Polarity, MODE_0, MODE_1, MODE_2, MODE_3};
use futures::future::poll_fn;
@ -521,3 +522,45 @@ cfg_if::cfg_if! {
}
}
}
impl<'d, T: Instance> SetConfig<Config> for Spim<'d, T> {
fn set_config(&mut self, config: &Config) {
let r = T::regs();
// Configure mode.
let mode = config.mode;
r.config.write(|w| {
match mode {
MODE_0 => {
w.order().msb_first();
w.cpol().active_high();
w.cpha().leading();
}
MODE_1 => {
w.order().msb_first();
w.cpol().active_high();
w.cpha().trailing();
}
MODE_2 => {
w.order().msb_first();
w.cpol().active_low();
w.cpha().leading();
}
MODE_3 => {
w.order().msb_first();
w.cpol().active_low();
w.cpha().trailing();
}
}
w
});
// Configure frequency.
let frequency = config.frequency;
r.frequency.write(|w| w.frequency().variant(frequency));
// Set over-read character
let orc = config.orc;
r.orc.write(|w| unsafe { w.orc().bits(orc) });
}
}

View File

@ -15,6 +15,7 @@ use core::task::Poll;
#[cfg(feature = "time")]
use embassy::time::{Duration, Instant};
use embassy::waitqueue::AtomicWaker;
use embassy_embedded_hal::SetConfig;
use embassy_hal_common::unborrow;
use futures::future::poll_fn;
@ -24,6 +25,7 @@ use crate::interrupt::{Interrupt, InterruptExt};
use crate::util::{slice_in_ram, slice_in_ram_or};
use crate::{gpio, pac, Unborrow};
#[derive(Clone, Copy)]
pub enum Frequency {
#[doc = "26738688: 100 kbps"]
K100 = 26738688,
@ -877,3 +879,11 @@ cfg_if::cfg_if! {
}
}
}
impl<'d, T: Instance> SetConfig<Config> for Twim<'d, T> {
fn set_config(&mut self, config: &Config) {
let r = T::regs();
r.frequency
.write(|w| unsafe { w.frequency().bits(config.frequency as u32) });
}
}