我正在试着从传感器上读取一个值,在覆盆子PI Pico上的SPI为BMP280.但我得到了意想不到的价值.
我在rp2040-project-template的基础上创建了一个新的repo,并对其进行了修改以添加SPI功能.
我添加了这些导入:
use embedded_hal::prelude::_embedded_hal_spi_FullDuplex;
use rp_pico::hal::spi;
use rp_pico::hal::gpio;
use fugit::RateExtU32;
然后在main函数的底部设置SPI:
let _spi_sclk = pins.gpio2.into_mode::<gpio::FunctionSpi>();
let _spi_mosi = pins.gpio3.into_mode::<gpio::FunctionSpi>();
let _spi_miso = pins.gpio4.into_mode::<gpio::FunctionSpi>();
let mut spi_cs = pins.gpio5.into_push_pull_output_in_state(PinState::Low); // initial pull down, for SPI
let spi = spi::Spi::<_, _, 8>::new(pac.SPI0);
let mut spi = spi.init(
&mut pac.RESETS,
clocks.peripheral_clock.freq(),
10.MHz(), // bmp280 has 10MHz as maximum
&embedded_hal::spi::MODE_0,
);
spi_cs.set_high().unwrap(); // pull up, set as inactive after init
delay.delay_ms(200); // some delay for testing
然后我试着读取ID注册表
spi_cs.set_low().unwrap();
let res_w = spi.send(0xd0 as u8); // 0xd0 is address for ID, with msb 1
let res_r = spi.read();
spi_cs.set_high().unwrap();
// check results
match res_w {
Ok(_) => info!("write worked"),
Err(_) => info!("failed to write")
}
match res_r {
Ok(v) => info!("read value from SPI: {}", v),
Err(_) => info!("failed to read SPI")
}
有了这个代码,SPI read fails.为什么会这样呢?
在读取ID之前,也许有必要在传感器上设置mode.我可以将此代码添加到读取的上面,设置为forced mode.
spi_cs.set_low().unwrap();
spi.send(0xf4-128 as u8).expect("failed to send first byte"); // registry 0xf4 with msb 0
spi.send(0x1 as u8).expect("failed to send second byte");
spi_cs.set_high().unwrap();
现在ID registry的读数起作用了,但我得到的值是255
,而不是预期的0x58
.
我做错了什么?
我也用这个代码try 了transfer
:
let mut data: [u8; 2] = [0xd0, 0x0];
let transfer_success = spi.transfer(&mut data);
match transfer_success {
Ok(v) => info!("read data {}", v),
Err(_) => info!("failed to read")
}
但我在此代码中读取值为[255, 255]
,而不是预期的0x58
.