我正在尝试通过 SPI 协议与连接到 STM32L1(在NUCLEO-L152RE板上)的 BlueNRG 芯片(在X-NUCLEO-IDB04A1扩展板上)进行通信。
根据 BlueNRG手册,我可以发送一个 5 字节的空 SPI 数据包:(0x0B, 0, 0, 0, 0)
以获取读/写缓冲区大小以及设备状态。状态应该是0x02
(准备好),或者0x00
设备0xFF
是否正在睡眠并且正在唤醒。
这是我得到的通讯:
Send (0x0B, 0, 0, 0, 0)
Receive (0x00, 0x00) // why 2 bytes?
Send (0x0B, 0, 0, 0, 0) // assuming device is waking up, re-trying
Receive (0x06, 0x00) // what is code 6?
我的测试应用程序是使用Zinc用 Rust 编写的。MCU 正在运行默认时钟(来自 MSI 的 2048 MHz)。下面是负责 SPI 初始化的代码:
// PB.3 = CLCK
let _spi_clock = pin::Pin::new(pin::PortB, 3,
pin::AltFunction(pin::AfSpi1_Spi2, pin::OutPushPull, pin::Medium),
pin::PullDown);
// PA.6 = MISO
let _spi_in = pin::Pin::new(pin::PortA, 6,
pin::AltFunction(pin::AfSpi1_Spi2, pin::OutPushPull, pin::Medium),
pin::PullNone);
// PA.7 = MOSI
let _spi_out = pin::Pin::new(pin::PortA, 7,
pin::AltFunction(pin::AfSpi1_Spi2, pin::OutPushPull, pin::Medium),
pin::PullNone);
// PA.1 = CS
let spi_csn = pin::Pin::new(pin::PortA, 1,
pin::GpioOut(pin::OutPushPull, pin::Medium),
pin::PullUp);
spi_csn.set_high();
let spi = spi::Spi::new(spi::Spi1, spi::DirFullDuplex, spi::RoleMaster,
spi::Data8b, spi::DataMsbFirst, 1); // baud pre-scaler = 2
let bnrg_reset = pin::Pin::new(pin::PortA, 8,
pin::GpioOut(pin::OutPushPull, pin::VeryLow),
pin::PullUp);
bnrg_reset.set_low();
// do something
bnrg_reset.set_high();
SPI 内部是从zinc master稍微修改的。发送/接收代码组织如下:
loop {
spi_csn.set_low();
// send a dummy read request
spi.write(SpiRead as u8); // = 0x0B
spi.write(0);
spi.write(0);
spi.write(0);
spi.write(0);
let status = spi.read();
// debug print status
while spi.has_more_data() {
let data = spi.read();
// debug print data
}
spi_csn.set_high();
}
问题是 -如何解释或处理这些 BlueNRG 响应?我无法找到它使用的低级协议的任何正式描述(这里不是在谈论 HCI/ACI,而是关于0x02
= ready 以外的状态代码)。我很可能只是错误地初始化了硬件,或者甚至在这里遗漏了一些明显的东西。将不胜感激任何指导。