use crate::spi::{self, AccessMode};
#[derive(Debug)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub struct W5500<SPI> {
spi: SPI,
}
impl<SPI, SpiError> W5500<SPI>
where
SPI: embedded_hal::blocking::spi::Transfer<u8, Error = SpiError>
+ embedded_hal::blocking::spi::Write<u8, Error = SpiError>,
{
pub fn new(spi: SPI) -> Self {
W5500 { spi }
}
pub fn free(self) -> SPI {
self.spi
}
}
impl<SPI, SpiError> crate::Registers for W5500<SPI>
where
SPI: embedded_hal::blocking::spi::Transfer<u8, Error = SpiError>
+ embedded_hal::blocking::spi::Write<u8, Error = SpiError>,
{
type Error = SpiError;
#[allow(clippy::while_let_on_iterator)]
fn read(&mut self, mut address: u16, block: u8, data: &mut [u8]) -> Result<(), Self::Error> {
let mut chunks = data.chunks_exact_mut(4);
while let Some(chunk) = chunks.next() {
let header = spi::fdm_header_4b(address, block, AccessMode::Read);
self.spi.write(&header)?;
self.spi.transfer(chunk)?;
address = address.wrapping_add(4);
}
let mut chunks = chunks.into_remainder().chunks_exact_mut(2);
while let Some(chunk) = chunks.next() {
let header = spi::fdm_header_2b(address, block, AccessMode::Read);
self.spi.write(&header)?;
self.spi.transfer(chunk)?;
address = address.wrapping_add(2);
}
let mut chunks = chunks.into_remainder().chunks_exact_mut(1);
while let Some(chunk) = chunks.next() {
let header = spi::fdm_header_1b(address, block, AccessMode::Read);
self.spi.write(&header)?;
self.spi.transfer(chunk)?;
address = address.wrapping_add(1);
}
Ok(())
}
#[allow(clippy::while_let_on_iterator)]
fn write(&mut self, mut address: u16, block: u8, data: &[u8]) -> Result<(), Self::Error> {
let mut chunks = data.chunks_exact(4);
while let Some(chunk) = chunks.next() {
let header = spi::fdm_header_4b(address, block, AccessMode::Write);
self.spi.write(&header)?;
self.spi.write(chunk)?;
address = address.wrapping_add(4);
}
let mut chunks = chunks.remainder().chunks_exact(2);
while let Some(chunk) = chunks.next() {
let header = spi::fdm_header_2b(address, block, AccessMode::Write);
self.spi.write(&header)?;
self.spi.write(chunk)?;
address = address.wrapping_add(2);
}
let mut chunks = chunks.remainder().chunks_exact(1);
while let Some(chunk) = chunks.next() {
let header = spi::fdm_header_1b(address, block, AccessMode::Write);
self.spi.write(&header)?;
self.spi.write(chunk)?;
address = address.wrapping_add(1);
}
Ok(())
}
}