问题描述
我正在用Keil对Stm32F303K8 Nucleo板进行编程,我尝试配置Nrf24模块(在aliexpress上购买)。但是,它似乎只返回部分正确的数据。当我将0x01写入配置寄存器(0x20)时,它将返回0x0E(状态寄存器)和0x00,这是正确的。但是,当我尝试在以后读取数据时,得到0x0E(状态正确)和0x00(错误)。它应该返回0x01。也许有人看到我在做什么错了?
#include "stm32f3xx.h"
uint8_t spi_read_write(uint8_t address_byte);
void init_spi() {
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN_Msk;
GPIOA->MODER |= GPIO_MODER_MODER0_0; // CSN as output
GPIOA->MODER |= GPIO_MODER_MODER1_0; // CE as output
GPIOA->MODER |= GPIO_MODER_MODER5_1; // SCK as alternate function
GPIOA->MODER |= GPIO_MODER_MODER6_1; // MISO as alternate function
GPIOA->MODER |= GPIO_MODER_MODER7_1; // MOSI as alternate function
GPIOA->AFR[0] |= (0x5 << GPIO_AFRL_AFRL5_Pos); // SCK
GPIOA->AFR[0] |= (0x5 << GPIO_AFRL_AFRL6_Pos); // MISO
GPIOA->AFR[0] |= (0x5 << GPIO_AFRL_AFRL7_Pos); // MOSI
SPI1->CR1 = 0;
SPI1->CR2 = 0;
SPI1->CR1 |= SPI_CR1_MSTR_Msk; // set as master
SPI1->CR1 |= SPI_CR1_SSM_Msk; // SSM on
SPI1->CR1 |= SPI_CR1_SSI_Msk; // SSI
SPI1->CR1 |= SPI_CR1_BR; // baud rate 72MHz/256
SPI1->CR1 |= SPI_CR1_SPE; // spi enable
}
uint8_t spi_read_write(uint8_t data_byte) {
SPI1->DR = data_byte;
while((SPI1->SR & SPI_SR_TXE) != SPI_SR_TXE);
while((SPI1->SR & SPI_SR_RXNE) != SPI_SR_RXNE);
while((SPI1->SR & SPI_SR_BSY) == SPI_SR_BSY);
return SPI1->DR;
}
int main() {
init_spi();
while(1) {
uint8_t test = 0;
GPIOA->BSRR |= GPIO_BSRR_BR_1; // ce = low
GPIOA->BSRR |= GPIO_BSRR_BS_0; // csn = high
// here I write to the register 0
GPIOA->BSRR |= GPIO_BSRR_BR_0; // csn = low
test = spi_read_write(0x20); // returns 0x0E as expected
test = spi_read_write(0x01); // returns 0x00 as expected
GPIOA->BSRR |= GPIO_BSRR_BS_0; // csn = high
// here I read from the register 0
GPIOA->BSRR |= GPIO_BSRR_BR_0; // csn = low
test = spi_read_write(0x00); // returns 0x0E as expected
test = spi_read_write(0x00); // returns 0x00,but why? It should be 0x01
GPIOA->BSRR |= GPIO_BSRR_BS_0; // csn = high
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)