Fix blocking-write for SPI.
This commit is contained in:
parent
548593ea41
commit
e36ae76e45
1 changed files with 27 additions and 3 deletions
|
@ -171,6 +171,7 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
|
|||
w.set_dsize(word_size.dsize());
|
||||
});
|
||||
T::regs().cr1().modify(|w| {
|
||||
w.set_csusp(false);
|
||||
w.set_spe(true);
|
||||
});
|
||||
}
|
||||
|
@ -375,8 +376,19 @@ impl<'d, T: Instance> embedded_hal::blocking::spi::Write<u8> for Spi<'d, T, NoDm
|
|||
}
|
||||
if !sr.txp() {
|
||||
// loop waiting for TXE
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
unsafe {
|
||||
let rxdr = regs.rxdr().ptr() as *const u8;
|
||||
// discard read to prevent pverrun.
|
||||
let _ = ptr::read_volatile(rxdr);
|
||||
}
|
||||
}
|
||||
|
||||
while unsafe { !regs.sr().read().txc() } {
|
||||
// spin
|
||||
}
|
||||
|
||||
Ok(())
|
||||
|
@ -469,8 +481,20 @@ impl<'d, T: Instance> embedded_hal::blocking::spi::Write<u16> for Spi<'d, T, NoD
|
|||
}
|
||||
if !sr.txp() {
|
||||
// loop waiting for TXE
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
unsafe {
|
||||
let rxdr = regs.rxdr().ptr() as *const u8;
|
||||
// discard read to prevent pverrun.
|
||||
let _ = ptr::read_volatile(rxdr);
|
||||
}
|
||||
}
|
||||
|
||||
while unsafe { !regs.sr().read().txc() } {
|
||||
// spin
|
||||
}
|
||||
|
||||
Ok(())
|
||||
|
@ -537,7 +561,7 @@ impl<'d, T: Instance, Tx, Rx> traits::Spi<u8> for Spi<'d, T, Tx, Rx> {
|
|||
|
||||
impl<'d, T: Instance, Tx: TxDmaChannel<T>, Rx> traits::Write<u8> for Spi<'d, T, Tx, Rx> {
|
||||
#[rustfmt::skip]
|
||||
type WriteFuture<'a> where Self: 'a = impl Future<Output = Result<(), Self::Error>> + 'a;
|
||||
type WriteFuture<'a> where Self: 'a = impl Future<Output=Result<(), Self::Error>> + 'a;
|
||||
|
||||
fn write<'a>(&'a mut self, data: &'a [u8]) -> Self::WriteFuture<'a> {
|
||||
self.write_dma_u8(data)
|
||||
|
@ -548,7 +572,7 @@ impl<'d, T: Instance, Tx: TxDmaChannel<T>, Rx: RxDmaChannel<T>> traits::Read<u8>
|
|||
for Spi<'d, T, Tx, Rx>
|
||||
{
|
||||
#[rustfmt::skip]
|
||||
type ReadFuture<'a> where Self: 'a = impl Future<Output = Result<(), Self::Error>> + 'a;
|
||||
type ReadFuture<'a> where Self: 'a = impl Future<Output=Result<(), Self::Error>> + 'a;
|
||||
|
||||
fn read<'a>(&'a mut self, data: &'a mut [u8]) -> Self::ReadFuture<'a> {
|
||||
self.read_dma_u8(data)
|
||||
|
@ -559,7 +583,7 @@ impl<'d, T: Instance, Tx: TxDmaChannel<T>, Rx: RxDmaChannel<T>> traits::FullDupl
|
|||
for Spi<'d, T, Tx, Rx>
|
||||
{
|
||||
#[rustfmt::skip]
|
||||
type WriteReadFuture<'a> where Self: 'a = impl Future<Output = Result<(), Self::Error>> + 'a;
|
||||
type WriteReadFuture<'a> where Self: 'a = impl Future<Output=Result<(), Self::Error>> + 'a;
|
||||
|
||||
fn read_write<'a>(
|
||||
&'a mut self,
|
||||
|
|
Loading…
Reference in a new issue