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> { | ||||
|         unsafe { T::REGS.cr1().modify(|w| w.set_spe(true)) } | ||||
|         flush_rx_fifo(T::REGS); | ||||
|         self.set_word_size(W::WORDSIZE); | ||||
|         for word in words.iter() { | ||||
|             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> { | ||||
|         unsafe { T::REGS.cr1().modify(|w| w.set_spe(true)) } | ||||
|         flush_rx_fifo(T::REGS); | ||||
|         self.set_word_size(W::WORDSIZE); | ||||
|         for word in words.iter_mut() { | ||||
|             *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> { | ||||
|         unsafe { T::REGS.cr1().modify(|w| w.set_spe(true)) } | ||||
|         flush_rx_fifo(T::REGS); | ||||
|         self.set_word_size(W::WORDSIZE); | ||||
|         for word in words.iter_mut() { | ||||
|             *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> { | ||||
|         unsafe { T::REGS.cr1().modify(|w| w.set_spe(true)) } | ||||
|         flush_rx_fifo(T::REGS); | ||||
|         self.set_word_size(W::WORDSIZE); | ||||
|         let len = read.len().max(write.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) { | ||||
|     unsafe { | ||||
|         #[cfg(not(spi_v3))] | ||||
|  | ||||
| @ -68,6 +68,22 @@ async fn main(_spawner: Spawner, p: Peripherals) { | ||||
|     spi.read::<u8>(&mut []).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"); | ||||
|     cortex_m::asm::bkpt(); | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user