use e310x::qspi0::csmode::Mode as CsMode;
use embedded_hal::spi::Mode;
use crate::{clock::Clocks, time::Hertz};
#[derive(Clone)]
pub struct SpiConfig {
pub mode: Mode,
pub(crate) clock_divisor: u32,
pub cs_mode: CsMode,
pub txmark: u8,
pub rxmark: u8,
pub delays: SpiDelayConfig,
}
#[derive(Clone)]
pub struct SpiDelayConfig {
pub cssck: u8,
pub sckcs: u8,
pub intercs: u8,
pub interxfr: u8,
}
impl SpiConfig {
pub fn new(mode: Mode, freq: Hertz, clocks: &Clocks) -> Self {
let clock_divisor = clocks.tlclk().0 / (2 * freq.0) - 1;
assert!(clock_divisor <= 0xfff);
Self {
mode,
clock_divisor,
cs_mode: CsMode::Hold,
txmark: 1,
rxmark: 0,
delays: SpiDelayConfig::default(),
}
}
pub fn clock_divisor(&self) -> u32 {
self.clock_divisor
}
}
impl Default for SpiDelayConfig {
fn default() -> Self {
Self {
cssck: 1, sckcs: 1, intercs: 1, interxfr: 0, }
}
}