2.4G無線模塊NRF2401


RF24L01+,是工作在2.4~2.5GHz 頻段的,具備自動重發功能,6 個數據傳輸通道,最大無線傳輸速率為2Mbits。MCU 可與該芯片通過SPI 接口訪問芯片的寄存器進行配置,達到控制模塊、通過該模塊實現無線通訊的目的。            具體細節參考<<野火STM32--2.4G無線傳輸>>

優點:不需要建立連接就可以進行收發

PCB管腳

其中各個接口作用如下

在應用中我們需要一對收發,也就是一個主機和一個從機。主機和從機的驅動部分是一樣的(配置文件SPI_NRF.c 文件相同),區別是main函數中調用的模式不同,主機一般是發送模式NRF_TX_Mode();,而從機采用的是接收模式 NRF_RX_Mode();

應用的基本流程

注意事項:

(1)首先要檢查接線,一般配置的是SPI1,然后要對應程序里面的配置來接線

SPI1
SCK = PA5      MISO = PA6    MOSI = PA7
CE = PA4        CSN =PC4      IRQ = PC5

  后兩個是作為普通IO口,任意管腳均可

從機部分:

(1)SPI_NRF_Init();     //初始化SPI接口

(2)NRF_RX_Mode();  // 設置為接收模式

(3)while循環里等待接收,判斷接收狀態,並進行接收

 

#include "stm32f10x.h"
#include "bsp_usart1.h"
#include "bsp_spi_nrf.h"

u8 status;         //用於判斷接收/發送狀態
u8 rxbuf[4];     //接收緩沖
u8 i; 

int main(void)
{      
  /* 串口1初始化 */
  USART1_Config(); 
  /*SPI接口初始化*/   
  SPI_NRF_Init(); 
    
  printf("\r\n 這是一個 NRF24L01 無線傳輸實驗 \r\n");
  printf("\r\n 這是無線傳輸 從機端 的反饋信息\r\n");
  printf("\r\n   正在檢測NRF與MCU是否正常連接。。。\r\n");

  /*檢測NRF模塊與MCU的連接*/
  status = NRF_Check();           
  if(status == SUCCESS)       
    printf("\r\n      NRF與MCU連接成功\r\n");  
  else      
    printf("\r\n   正在檢測NRF與MCU是否正常連接。。。\r\n");
    
    NRF_RX_Mode();  // 設置為接收模式
    printf("\r\n 從機端 進入接收模式\r\n");
  while(1)
  {               
    /*等待接收數據*/
    status = NRF_Rx_Dat(rxbuf);
    /*判斷接收狀態*/
    switch(status)
    {
      case RX_DR:
      for(i=0;i<4;i++)
      {                    
        printf("\r\n 從機端 接收到 主機端 發送的數據為:%d \r\n",rxbuf[i]);
      }break;
      
      case ERROR:
        printf("\r\n 從機端 接收出錯。   \r\n");break;          
    } 
  } 
}

 

 

主機部分:

(1)SPI_NRF_Init();     //初始化SPI接口

(2)NRF_TX_Mode();  // 設置為發送模式

(3)發送數據,查看發送狀態,否則重發。比如用按鍵中斷來進行一次發送

注:一般都會顯示超時,但是實際接收端有接收到。

初始化和配置與從機相同,除了TX模式

發送部分的代碼:

 

void EXTI0_IRQHandler(void)
{
    int i=0;
    if(EXTI_GetITStatus(EXTI_Line0) != RESET)    // 確保是否產生了EXTI Line中斷!!
    {
        for(i=0;i<4;i++)
        txbuf[i]+=1;
        printf("\r\n exit \r\n");
        status = NRF_Tx_Dat(txbuf);     
      switch(status)
    {
      case MAX_RT:
        printf("\r\n 主機端 沒接收到應答信號,發送次數超過限定值,發送失敗。 \r\n");
      break;

      case ERROR:
        printf("\r\n 未知原因導致發送失敗。 \r\n");
      break;

      case TX_DS:
        printf("\r\n 主機端 接收到 從機端 的應答信號,發送成功! \r\n");             
      break;                                  
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM