代码实现(文末附代码连接)

main.c函数

// An highlighted block
int main()
{
    u8 mode=0;
    //u8 mode=1;
    u8 rx_buf[33]="he bei ke ji da xue";    
    SysTick_Init(72);
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组 分2组
    LED_Init();
    USART1_Init(9600);
    NRF24L01_Init();
    OLED_Init();                // 初始化OLED  
    OLED_Clear();                 // 清屏
    OLED_ShowString(0, 0, "2.4G Telecontrol");
    
    //----------------------------
    //有这么多的 检测函数了,可以自己写一个检测OLED的函数***
    //----------------------------
    while(NRF24L01_Check())     //检测NRF24L01是否存在
    {
        OLED_ShowString(0, 2, "2G4 ERROR");            
    }
    OLED_ShowString(0, 2, "2G4 OK");

    if(mode==1)
    {
      NRF24L01_TX_Mode();//先设置为发送函数
        while(1)
        {
      NRF24L01_TxPacket(rx_buf);
//            if(NRF24L01_TxPacket(rx_buf)==TX_OK)//这个是检测函数,检测到是否发送。
//            {
//                
//                led2=!led2;
//                    
//            }
            
        }
    }

    //---------
    if(mode==0)
    {
        NRF24L01_RX_Mode();    
        while(1)
        {
        if(NRF24L01_RxPacket(rx_buf)==0) //接收到数据显示
        {
                rx_buf[32]='\0';
                printf("收到的数据是:%s\r\n",rx_buf);
            if(strcmp((const char*)rx_buf,"he bei ke ji da xue")==0)
                led2=!led2;    //打开LED1
//                if(rx_buf[0]='h')
//                {
//                 led2=!led2; //一秒钟改变一次状态
//                }
        }            
     }
 }
}

在主函数中有一个NRF24L01_Check()函数,这个函数的大致思路如下:

在同一个寄存器中写入数据(比如u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5}),然后再读出来,判断两者是否一样,如果一样,那么模块正常,否则检测失败

当初我有个疑问,因为SPI是写和读是同步的,那这个函数在写入的时候,肯定会返回一个数据,那再要去读的时候那?这个过程具体是怎么实现的?

在底层代码中,写的很清楚:

(1)写入u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5}时,肯定会有一个返回值,但是因为我是写入数据,返回的东西我不管是什么,不要了;

(2)当我要读的时候(注意,读数据的位置一定要和写数据的位置一样),我循环发字节(0xff)去触发,然后得到想要的返回值。而因为寄存器位置相同,返回值恰好是我刚刚写入的数据(这个也仅仅是我自己的理解^ 0 ^)。

这样基本就实现了。

如果你想实现其他功能的话,也可以往上面加,

①比如我判断收到的数据是否是” he bei ke ji da xue”,若果接受正确则让led状态反转。

②我现在发送和接受的是固定的值,那我也可以发送变量,比如加一个dht11温湿度采集模块,将温湿度实时上传。

③在②的基础上,我也可以将接受到的温湿度显示在OLED屏或者串口屏上
在这里插入图片描述

ZH 每一天! 加油。
代码链接: link
提取码:hlon