mirror of
https://github.com/hubaldv/bioz-firmware-rs.git
synced 2025-12-06 05:01:18 +00:00
Created basic lib for AD5940.
This commit is contained in:
51
src/ad5940.rs
Normal file
51
src/ad5940.rs
Normal 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
|
||||
}
|
||||
Reference in New Issue
Block a user