Created basic lib for AD5940.

This commit is contained in:
2025-07-16 09:55:10 +02:00
parent 73b96c2756
commit c6b250a4a8
2 changed files with 91 additions and 6 deletions

51
src/ad5940.rs Normal file
View File

@@ -0,0 +1,51 @@
use embassy_stm32::{gpio::Output, mode::Blocking, spi::Spi};
pub struct AD5940 {
spi: Spi<'static, Blocking>,
cs: Output<'static>,
}
impl AD5940 {
pub fn new(spi: Spi<'static, Blocking>, cs: Output<'static>) -> Self {
AD5940 { spi, cs }
}
fn read_reg_16(&mut self, address: u16) -> Result<u16, embassy_stm32::spi::Error> {
let addr_bytes = address.to_be_bytes();
// Write address command
self.cs.set_low();
self.spi.blocking_write(&[Command::SPICMD_SETADDR as u8])?;
self.spi.blocking_write(&addr_bytes)?;
self.cs.set_high();
// Read command
self.cs.set_low();
self.spi.blocking_write(&[Command::SPICMD_READREG as u8])?;
let mut data = [0u8; 3]; // First byte dummy, then two data bytes
self.spi.blocking_read(&mut data)?;
self.cs.set_high();
Ok(u16::from_be_bytes([data[1], data[2]]))
}
pub fn get_chipid(&mut self) -> Result<u16, embassy_stm32::spi::Error> {
self.read_reg_16(Register::CHIPID as u16)
}
}
#[allow(dead_code)]
#[allow(non_camel_case_types)]
enum Command {
SPICMD_SETADDR = 0x20,
SPICMD_READREG = 0x6D,
SPICMD_WRITEREG = 0x2D,
SPICMD_READFIFO = 0x5F,
}
#[allow(non_camel_case_types)]
#[repr(u16)]
enum Register {
CHIPID = 0x0000_0404, // Changed from u32 to u16, as expected by SPI write
}