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;                                  
    }

 

posted @ 2016-11-08 10:58  Kevin1207  阅读(5043)  评论(0编辑  收藏  举报