diff --git a/CHANGELOG.md b/CHANGELOG.md index 082de926..f0d66867 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,6 +49,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ### Changed +- Use manual impls for blocking spi instead of `Default`. - Split `Stream` trait on `Stream` and `StreamISR`. Use const generics for `Stream` and `Channel`. - [breaking-change] `Timer::new` now just initializes peripheral. diff --git a/src/spi.rs b/src/spi.rs index 481a69af..c51b257a 100644 --- a/src/spi.rs +++ b/src/spi.rs @@ -587,12 +587,56 @@ where } } -impl embedded_hal::blocking::spi::transfer::Default for Spi where - SPI: Instance +impl embedded_hal::blocking::spi::Transfer for Spi +where + SPI: Instance, +{ + type Error = Error; + + fn transfer<'w>(&mut self, words: &'w mut [u8]) -> Result<&'w [u8], Self::Error> { + use spi::FullDuplex; + for word in words.iter_mut() { + nb::block!(self.send(*word))?; + *word = nb::block!(self.read())?; + } + + Ok(words) + } +} + +impl embedded_hal::blocking::spi::Write for Spi +where + SPI: Instance, { + type Error = Error; + + fn write(&mut self, words: &[u8]) -> Result<(), Self::Error> { + use spi::FullDuplex; + for word in words { + nb::block!(self.send(*word))?; + nb::block!(self.read())?; + } + + Ok(()) + } } -impl embedded_hal::blocking::spi::write::Default for Spi where - SPI: Instance +impl embedded_hal::blocking::spi::WriteIter for Spi +where + SPI: Instance, { + type Error = Error; + + fn write_iter(&mut self, words: WI) -> Result<(), Self::Error> + where + WI: IntoIterator, + { + use spi::FullDuplex; + for word in words.into_iter() { + nb::block!(self.send(word))?; + nb::block!(self.read())?; + } + + Ok(()) + } }