-
Notifications
You must be signed in to change notification settings - Fork 62
Description
Problem
When doing a SPI transfer with the blocking traits the CS line goes high before the transfer is completed.
let mut buf: [u8; 1] = [0];
w5500_cs.set_low().unwrap();
spi.write(&[0x00, 0x39, 0x00]).unwrap();
spi.transfer(&mut buf).unwrap();
w5500_cs.set_high().unwrap();
Expected Behavior
When I add some hacky polling for the BSY
bit (0x80
) in the SPI status register to that code, the transfer works as expected, with the CS line going high only after completion of the SPI bus activity.
let mut buf: [u8; 1] = [0];
w5500_cs.set_low().unwrap();
spi.write(&[0x00, 0x39, 0x00]).unwrap();
let mut spi1_sr: u32 = unsafe { core::ptr::read_volatile(0x4001_3008 as *const u32) };
while spi1_sr & 0x80 != 0x00 {
spi1_sr = unsafe { core::ptr::read_volatile(0x4001_3008 as *const u32) };
}
spi.transfer(&mut buf).unwrap();
let mut spi1_sr: u32 = unsafe { core::ptr::read_volatile(0x4001_3008 as *const u32) };
while spi1_sr & 0x80 != 0x00 {
spi1_sr = unsafe { core::ptr::read_volatile(0x4001_3008 as *const u32) };
}
w5500_cs.set_high().unwrap();
This seems to be a case of under-specified behavior in the embedded-hal (which is fixed in 1.0.0), the docs do not specify if the blocking
part is just blocking for buffer space, after which the function returns, or blocking for buffer space, and polling for completion.
I think this is a bug though, because despite the under-specification other STM32 embedded HAL traits do block for completion (such as the stm32f1 which I also tested), this appears to be the odd one out.
Other Information
I am using a STM32F070CBTx.
Relevant Cargo.toml
:
[dependencies]
cortex-m = "0.6.4"
cortex-m-rt = { version = "0.6.13", features = ["device"] }
embedded-hal = "0.2.4"
stm32f0xx-hal = { version = "0.17.1", features = ["stm32f070xb"] }
rtt-target = "0.3.0"
$ cargo -V
cargo 1.50.0-nightly (a3c2627fb 2020-12-14)