use embedded_hal:: {
digital::v2::OutputPin,
blocking::{ delay::*, spi::*, },
};
use crate::errors::*;
use crate::register::*;
pub struct Adf4351<CE, LE, SPI> {
spi: SPI,
pin_ce: CE,
pin_le: LE,
}
impl<CE, LE, SPI,> Adf4351<CE, LE, SPI,>
where CE: OutputPin,
LE: OutputPin,
SPI: Write<u8>,
{
pub fn new(
spi: SPI,
pin_ce: CE,
pin_le: LE,
) -> Self {
Adf4351 { spi, pin_ce, pin_le, }
}
pub fn write_register_set<Delay>(
self: &mut Self,
delay: &mut Delay,
rs: &RegisterSet,
) -> Result<(), Error>
where Delay: DelayUs<u16>,
{
for r in rs.to_words().iter().rev() {
self.write_register(delay, *r)?;
}
Ok(())
}
#[inline(always)]
pub fn write_register<Delay>(self: &mut Self, delay: &mut Delay, w: u32) -> Result<(), Error>
where Delay: DelayUs<u16>,
{
let data = [
((w >> 24) & 0xFF ) as u8,
((w >> 16) & 0xFF ) as u8,
((w >> 8) & 0xFF ) as u8,
( w & 0xFF ) as u8,
];
self.spi.write(&data).map_err(|_| Error::Spi)?;
delay.delay_us(5);
self.load_enable()?;
delay.delay_us(10);
self.load_disable()?;
delay.delay_us(5);
Ok(())
}
#[inline(always)]
pub fn enable(self: &mut Self) -> Result<(), Error> {
self.pin_ce.set_high().map_err(|_| Error::Pin)
}
#[inline(always)]
pub fn disable(self: &mut Self) -> Result<(), Error> {
self.pin_ce.set_low().map_err(|_| Error::Pin)
}
#[inline(always)]
pub fn load_enable(self: &mut Self) -> Result<(), Error> {
self.pin_le.set_high().map_err(|_| Error::Pin)
}
#[inline(always)]
fn load_disable(self: &mut Self) -> Result<(), Error> {
self.pin_le.set_low().map_err(|_| Error::Pin)
}
}