Merge #666
666: stm32/spi: Clear rx fifo in blocking methods r=Dirbaio a=GrantM11235 Co-authored-by: Grant Miller <GrantM11235@gmail.com> Co-authored-by: Dario Nieuwenhuis <dirbaio@dirbaio.net>
This commit is contained in:
commit
cb1be3983a
@ -575,6 +575,8 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn blocking_write<W: Word>(&mut self, words: &[W]) -> Result<(), Error> {
|
pub fn blocking_write<W: Word>(&mut self, words: &[W]) -> Result<(), Error> {
|
||||||
|
unsafe { T::REGS.cr1().modify(|w| w.set_spe(true)) }
|
||||||
|
flush_rx_fifo(T::REGS);
|
||||||
self.set_word_size(W::WORDSIZE);
|
self.set_word_size(W::WORDSIZE);
|
||||||
for word in words.iter() {
|
for word in words.iter() {
|
||||||
let _ = transfer_word(T::REGS, *word)?;
|
let _ = transfer_word(T::REGS, *word)?;
|
||||||
@ -583,6 +585,8 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn blocking_read<W: Word>(&mut self, words: &mut [W]) -> Result<(), Error> {
|
pub fn blocking_read<W: Word>(&mut self, words: &mut [W]) -> Result<(), Error> {
|
||||||
|
unsafe { T::REGS.cr1().modify(|w| w.set_spe(true)) }
|
||||||
|
flush_rx_fifo(T::REGS);
|
||||||
self.set_word_size(W::WORDSIZE);
|
self.set_word_size(W::WORDSIZE);
|
||||||
for word in words.iter_mut() {
|
for word in words.iter_mut() {
|
||||||
*word = transfer_word(T::REGS, W::default())?;
|
*word = transfer_word(T::REGS, W::default())?;
|
||||||
@ -591,6 +595,8 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn blocking_transfer_in_place<W: Word>(&mut self, words: &mut [W]) -> Result<(), Error> {
|
pub fn blocking_transfer_in_place<W: Word>(&mut self, words: &mut [W]) -> Result<(), Error> {
|
||||||
|
unsafe { T::REGS.cr1().modify(|w| w.set_spe(true)) }
|
||||||
|
flush_rx_fifo(T::REGS);
|
||||||
self.set_word_size(W::WORDSIZE);
|
self.set_word_size(W::WORDSIZE);
|
||||||
for word in words.iter_mut() {
|
for word in words.iter_mut() {
|
||||||
*word = transfer_word(T::REGS, *word)?;
|
*word = transfer_word(T::REGS, *word)?;
|
||||||
@ -599,6 +605,8 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn blocking_transfer<W: Word>(&mut self, read: &mut [W], write: &[W]) -> Result<(), Error> {
|
pub fn blocking_transfer<W: Word>(&mut self, read: &mut [W], write: &[W]) -> Result<(), Error> {
|
||||||
|
unsafe { T::REGS.cr1().modify(|w| w.set_spe(true)) }
|
||||||
|
flush_rx_fifo(T::REGS);
|
||||||
self.set_word_size(W::WORDSIZE);
|
self.set_word_size(W::WORDSIZE);
|
||||||
let len = read.len().max(write.len());
|
let len = read.len().max(write.len());
|
||||||
for i in 0..len {
|
for i in 0..len {
|
||||||
@ -727,7 +735,6 @@ fn spin_until_rx_ready(regs: Regs) -> Result<(), Error> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(not(spi_v3))]
|
|
||||||
fn flush_rx_fifo(regs: Regs) {
|
fn flush_rx_fifo(regs: Regs) {
|
||||||
unsafe {
|
unsafe {
|
||||||
#[cfg(not(spi_v3))]
|
#[cfg(not(spi_v3))]
|
||||||
|
@ -68,6 +68,22 @@ async fn main(_spawner: Spawner, p: Peripherals) {
|
|||||||
spi.read::<u8>(&mut []).await.unwrap();
|
spi.read::<u8>(&mut []).await.unwrap();
|
||||||
spi.write::<u8>(&[]).await.unwrap();
|
spi.write::<u8>(&[]).await.unwrap();
|
||||||
|
|
||||||
|
// === Check mixing blocking with async.
|
||||||
|
spi.blocking_transfer(&mut buf, &data).unwrap();
|
||||||
|
assert_eq!(buf, data);
|
||||||
|
spi.transfer(&mut buf, &data).await.unwrap();
|
||||||
|
assert_eq!(buf, data);
|
||||||
|
spi.blocking_write(&buf).unwrap();
|
||||||
|
spi.transfer(&mut buf, &data).await.unwrap();
|
||||||
|
assert_eq!(buf, data);
|
||||||
|
spi.blocking_read(&mut buf).unwrap();
|
||||||
|
spi.blocking_write(&buf).unwrap();
|
||||||
|
spi.write(&buf).await.unwrap();
|
||||||
|
spi.read(&mut buf).await.unwrap();
|
||||||
|
spi.blocking_write(&buf).unwrap();
|
||||||
|
spi.blocking_read(&mut buf).unwrap();
|
||||||
|
spi.write(&buf).await.unwrap();
|
||||||
|
|
||||||
info!("Test OK");
|
info!("Test OK");
|
||||||
cortex_m::asm::bkpt();
|
cortex_m::asm::bkpt();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user