SPI 프로토콜을 통해 STM32L1 (NUCLEO-L152RE 보드)에 연결된 BlueNRG 칩 (확장 보드 X-NUCLEO-IDB04A1)과 통신하려고합니다.알 수없는 BlueNRG SPI 응답
BlueNRG manual에 따르면, 읽기/쓰기 버퍼 크기와 장치 상태를 얻기 위해 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를 사용하여 작성되었습니다. MCU는 기본 클럭 (MSI에서 2048 MHz)을 실행 중입니다.
// 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에서 수정 : 여기 SPI 초기화에 대한 책임이있는 코드입니다. 방법을 설명 이들 BlueNRG 반응을 치료하기 -
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();
}
질문은 다음과 같이 보내기/코드가 구성되어 수신? 내가 사용하는 저수준 프로토콜에 대한 공식적인 설명을 찾을 수 없었습니다. 여기서는 HCI/ACI에 대해 말하지 않고 0x02
= 준비되지 않은 상태 코드에 대해서만 설명합니다. 하드웨어를 잘못 초기화하거나 여기에 명백한 내용이없는 경우도있을 수 있습니다. 어떤지도라도 감사 할 것입니다.
나는이 하드웨어를 모르지만, 내가 아는 모든 SPI 구현은 동시에 보내고 받는다. 즉, SPI를 통해 바이트를 전송하면 한 번의 작업으로 바이트가 다시 전송됩니다. 당신은'spi' 객체가 응답을 버퍼링합니까? 그렇지 않다면 각각의 '0'을 기록한 후에 바이트를 읽어야한다. – UncleO
정확합니다. 내 SPI는 아무 것도 버퍼링하지 않아서 동기식으로 읽고 쓸 필요가있었습니다. 고맙습니다! – kvark