微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从Nrf24寄存器读取STM32核返回错误结果

如何解决从Nrf24寄存器读取STM32核返回错误结果

我正在用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
     }
}

Nrf24 Datasheet

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?