簡體   English   中英

如何通過 MISO 引腳使用 stm32f103(主)獲取 nRF24l01(從)寄存器數據

[英]How do I take nRF24l01(slave) Register data using stm32f103 (master) through MISO pin

我正在嘗試為 stm32f103 目標設備為 nRF24l01 制作自定義庫,並且正在為主要 TX 設備編寫代碼。 在這里,我試圖通過發送 R_REGISTER 命令以及我正在尋找的地址來讀取 nRF 的寄存器內容,但我無法弄清楚在 R_REGISTER 命令發送后如何讀取數據。

我正在使用標准 stm32f10x.h header 文件,該文件與 Kiel uVision5 上的啟動文件一起提供。

以下是配置,

時鍾設置

RCC->CR |= RCC_CR_HSION;    //HSI on
while( !(RCC_CR_HSIRDY & (RCC->CR)) );  //wait till its ready
//clocks for peripherals 
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; //enable clock forport A
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; //enable clock for alternate functions
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; //enable clock for SPI1

GPIO 設置這些是我自定義的功能,它們工作正常

//GPIO pin setup as alternate function
pin_mode(IOPA, GPIOA, 7, op_50MHz, op_afpp);    //MOSI pin as GPIO alternate_pin can run upto 50MHz
pin_mode(IOPA, GPIOA, 6, ip, ip_pupd);  //MISO pin as GPIO alternate_pin can run upto 50MHz
pin_mode(IOPA, GPIOA, 5, op_50MHz, op_afpp);    //SCK pin as GPIO alternate_pin can run upto 50MHz
pin_mode(IOPA, GPIOA, 4, op_50MHz, op_gppp);    //CS pin as GPIO general_puspose_pin can run upto 50MHz

SPI 設置

SPI1->CR1 |= SPI_CR1_MSTR;  //master mode
SPI1->CR1 |= SPI_CR1_BR_0 | SPI_CR1_BR_1 | SPI_CR1_BR_2;    //at 571Kbps, max 31Mbps
SPI1->CR1 |= SPI_CR1_SSI;   //Software slave management enabled
SPI1->CR2 |= SPI_CR2_SSOE;  //SS o/p enable
SPI1->CR1 |= SPI_CR1_SPE;   //turn on the SPI

我被困在這里

uint8_t SPI_read_uint8_t(uint8_t addr){
    uint8_t reg_val;
    //sending the read command first along with address where we are reading from
    delay_us(50);
    digital_writepin(GPIOA, 4, LOW);
    SPI1->DR = (R_REGISTER | addr);  //sending the R_REGISTER command along with address
    while( (SPI1->SR) & (SPI_SR_BSY) );

    //please help here, how do I read the Register data from MISO pin  

SPI 讀取操作應如下所示

uint8_t spi_read_write(uint8_t data)
{
    while(SPI1 -> SR & SPI_SR_RXNE) (void)*(volatile uint8_t *)&SPI1 -> DR;   //clean the FIFO
    *(volatile uint8_t *)&SPI1 -> DR = data;
    while(!(SPI1 -> SR & SPI_SR_RXNE));
    return *(volatile uint8_t *)&SPI1 -> DR;
}

uint8_t youroperation(uint8_t command, uint16_t *data)
{
    uint8_t status;
    setCSLine();
    status = spi_read_write(command);
    *data = spi_read_write(0);
    *data |= ((uint16_t)spi_read_write(0)) << 8;
    clearCSLine();   
    return status
}

youroperation將返回Sn狀態寄存器command參數表示Cn命令位data將包含 Dx 數據位

要從 SPI 從機讀取數據,您需要發送虛擬字節,因為主機為從機提供時鍾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM