一、概念

    Nrf24L01是在2.4GHz~2.5GHz的ISM频段的单片无线收发器芯片。

    2.4G:载波频率

    无线传输。

    一般传输距离为10m;若加天线,则传输距离为50m;若加天线+功放,则传输距离为1km。

    电压:1.9V ~ 3.6V

    传输速率:250kbps、1Mbps、2Mbps。传输速率越快,传输距离越短。

二、通信框架

Nrf24L01

    Nrf24L01共有6个管道,每个管道都有一个接收地址

三、PCB图

Nrf24L01

    GND--->接地

    VCC--->接电源

    CE--->使能射频(高电平有效)

    CSN--->片选(低电平有效),只有在操作时打开,不操作时应关闭。

    SCK--->时钟

    MOSI--->主出从入,STM32作主,nrf作从。

    MISO--->主入从出,STM32作主,nrf作从。

    IRQ--->中断(低电平有效),发送/接收完数据后该管脚被拉低。

四、时序图

Nrf24L01Nrf24L01

    SCK的每一个上升沿发送/接收一个数据,可以从数据的中心来判断是上升沿收/发数据。

    read:STM32从nrf的寄存器中读取数据。

    write:STM32往nrf的寄存器中写入数据。

五、原理图

Nrf24L01

六、程序

/*nrf24l01.h文件*/

#ifndef __SPI_NRF_H__
#define __SPI_NRF_H__

#include "stm32f4xx_conf.h"

//32字节
struct nrf_msg_st {
    u32 control;
    u32 value1;
    u32 value2;
    u32 value3;
    u8 buf[16];
};

//片选拉高
#define NRF_CSN_HIGH()      GPIO_SetBits(GPIOB, GPIO_Pin_12)
//片选拉低
#define NRF_CSN_LOW()          GPIO_ResetBits(GPIOB, GPIO_Pin_12)
//CE拉高
#define NRF_CE_HIGH()               GPIO_SetBits(GPIOG,GPIO_Pin_15)
//CE拉低
#define NRF_CE_LOW()               GPIO_ResetBits(GPIOG,GPIO_Pin_15)    
//读中断管脚
#define NRF_Read_IRQ()            GPIO_ReadInputDataBit(GPIOF, GPIO_Pin_10)

//MOSI拉高
#define NRF_MOSI_HIGH()            GPIO_SetBits(GPIOC, GPIO_Pin_3) 
//MOSI拉低
#define NRF_MOSI_LOW()            GPIO_ResetBits(GPIOC, GPIO_Pin_3)
//CLK拉高
#define NRF_CLK_HIGH()            GPIO_SetBits(GPIOB, GPIO_Pin_13) 
//CLK拉低
#define NRF_CLK_LOW()                GPIO_ResetBits(GPIOB, GPIO_Pin_13)
//STM32读
#define NRF_Read_MISO()            GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_2)

#define TX_ADR_WIDTH         5      //发射地址宽度

#define RX_ADR_WIDTH    5

// SPI(nRF24L01) commands
#define NRF_READ_REG    0x00  // Define read command to register
#define NRF_WRITE_REG   0x20  // Define write command to register
#define RD_RX_PLOAD         0x61  // Define RX payload register address
#define WR_TX_PLOAD         0xA0  // Define TX payload register address
#define FLUSH_TX            0xE1  // Define flush TX register command
#define FLUSH_RX            0xE2  // Define flush RX register command
#define REUSE_TX_PL         0xE3  // Define reuse TX payload register command
#define NOP                 0xFF  // Define No Operation, might be used to read status register

// SPI(nRF24L01) registers(addresses)
#define CONFIG              0x00  // 'Config' register address
#define EN_AA               0x01  // 'Enable Auto Acknowledgment' register address
#define EN_RXADDR           0x02  // 'Enabled RX addresses' register address
#define SETUP_AW            0x03  // 'Setup address width' register address
#define SETUP_RETR          0x04  // 'Setup Auto. Retrans' register address
#define RF_CH               0x05  // 'RF channel' register address
#define RF_SETUP            0x06  // 'RF setup' register address
#define STATUS              0x07  // 'Status' register address
#define OBSERVE_TX          0x08  // 'Observe TX' register address
#define CD                  0x09  // 'Carrier Detect' register address
#define RX_ADDR_P0          0x0A  // 'RX address pipe0' register address
#define RX_ADDR_P1          0x0B  // 'RX address pipe1' register address
#define RX_ADDR_P2          0x0C  // 'RX address pipe2' register address
#define RX_ADDR_P3          0x0D  // 'RX address pipe3' register address
#define RX_ADDR_P4          0x0E  // 'RX address pipe4' register address
#define RX_ADDR_P5          0x0F  // 'RX address pipe5' register address
#define TX_ADDR             0x10  // 'TX address' register address
#define RX_PW_P0            0x11  // 'RX payload width, pipe0' register address
#define RX_PW_P1            0x12  // 'RX payload width, pipe1' register address
#define RX_PW_P2            0x13  // 'RX payload width, pipe2' register address
#define RX_PW_P3            0x14  // 'RX payload width, pipe3' register address
#define RX_PW_P4            0x15  // 'RX payload width, pipe4' register address
#define RX_PW_P5            0x16  // 'RX payload width, pipe5' register address
#define FIFO_STATUS         0x17  // 'FIFO Status Register' register address

//发送超时
#define MAX_RT              0x10 //达到最大重发次数中断标志位
//发送OK
#define TX_DS                        0x20 //发送完成中断标志位      // 
//接收OK
#define RX_DR                        0x40 //接收到数据中断标志位

void SPI_NRF_Init(void);//对芯片初始化
u8 SPI_NRF_RW(u8 dat);//对芯片读写
u8 SPI_NRF_ReadReg(u8 reg);//读nrf的寄存器
u8 SPI_NRF_WriteReg(u8 reg,u8 dat);//写nrf寄存器
u8 SPI_NRF_ReadBuf(u8 reg,u8 *pBuf,u8 bytes);
u8 SPI_NRF_WriteBuf(u8 reg ,u8 *pBuf,u8 bytes);    

void NRF_RX_Mode(u8 *rxAddr, u8 channel, u8 recvLen);//把nrf设置为接收模式
void NRF_TX_Mode(u8 *txAddr, u8 channel);//把nrf设置为发送模式
u8 NRF_Rx_Dat(u8 *rxbuf, u8 recvLen);//接收数据
u8 NRF_Tx_Dat(u8 *txbuf, u8 recvLen);//发送数据
u8 NRF_Check(void); //检查STM32与nrf硬件上是否连接好

#endif 
 

/*nrf24l01.c文件*/

#include "nrf24l01.h"
#include "lcd.h"

/*以下代码与硬件相关*/
void SPI2_For_Nrf24l01(void)
{
    GPIO_InitTypeDef GPIO_InitStructure; 
    
    //打开时钟
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC, ENABLE);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_GPIOG, ENABLE);
    
    //CSN PB12
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_SetBits(GPIOB, GPIO_Pin_12);
    
    //CE PG15
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOG, &GPIO_InitStructure);
    GPIO_ResetBits(GPIOG, GPIO_Pin_15);
    
    //MOSI PC3
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
    
    //SPI2_CLK
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    
    //MISO
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
    
    //IRQ PF10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOF, &GPIO_InitStructure);
}

//延时
void Delay(__IO u32 nCount)
{
  for(; nCount != 0; nCount--);

//对芯片读写
u8 SPI_NRF_RW(u8 dat)
{      
    int count = 0;

    for(count = 0; count < 8; count++){
        NRF_CLK_LOW();//CLK拉低
        if(dat & 0x80) {//第7位为1时
            NRF_MOSI_HIGH();//输出1
        } else {
            NRF_MOSI_LOW();//输出0
        }
        dat <<= 1;
        NRF_CLK_HIGH();//CLK拉高,数据稳定
        //将数据发送出去,第0位就空下拉,然后将接收到的数据放置到该位上,一次类推
        dat |= NRF_Read_MISO();    //读取对方数据(只有在数据稳定时才能读数据)
    }
    NRF_CLK_LOW();    //将CLK拉低

    return dat;
}
/*以上代码与硬件相关*/
//----------------------------------------------------------------//


//----------以下代码与芯片无关------------------------------------//
/*
 * 函数名:SPI_NRF_WriteReg
 * 描述  :用于向NRF特定的寄存器写入数据
 * 输入  :reg:NRF的命令+寄存器地址。
            dat:将要向寄存器写入的数据
 * 输出  :NRF的status寄存器的状态
 * 调用  :内部调用
 */
void SPI_NRF_Init(void)
{
    SPI2_For_Nrf24l01();//调用GPIO的初始化
    NRF_CSN_HIGH(); //有无都可,在GPIO初始化函数中已经拉高
}

//向reg寄存器中写入数据dat
u8 SPI_NRF_WriteReg(u8 reg,u8 dat)
{
    u8 status;
    NRF_CE_LOW();//射频无效
    /*置低CSN,使能SPI传输*/
    NRF_CSN_LOW();
                
    /*发送命令及寄存器号 */
    status = SPI_NRF_RW(reg);
         
    /*向寄存器写入数据*/
    SPI_NRF_RW(dat); 
              
    /*CSN拉高,完成*/       
    NRF_CSN_HIGH();    
        
    /*返回状态寄存器的值*/
    return(status);
}


/*
 * 函数名:SPI_NRF_ReadReg
 * 描述  :用于从NRF特定的寄存器读出数据
 * 输入  :reg:NRF的命令+寄存器地址。
 * 输出  :寄存器中的数据
 * 调用  :内部调用
 */
u8 SPI_NRF_ReadReg(u8 reg)
{
     u8 reg_val;

    NRF_CE_LOW();//射频无效
    /*置低CSN,使能SPI传输*/
     NRF_CSN_LOW();
                
    /*发送寄存器号*/
    SPI_NRF_RW(reg); 

    /*读取寄存器的值 */
    reg_val = SPI_NRF_RW(NOP);
                
    /*CSN拉高,完成*/
    NRF_CSN_HIGH();        
       
    return reg_val;
}    


/*
 * 函数名:SPI_NRF_ReadBuf
 * 描述  :用于从NRF的寄存器中读出一串数据
 * 输入  :reg:NRF的命令+寄存器地址。
            pBuf:用于存储将被读出的寄存器数据的数组,外部定义
           bytes: pBuf的数据长度    
 * 输出  :NRF的status寄存器的状态
 * 调用  :外部调用
 */
u8 SPI_NRF_ReadBuf(u8 reg,u8 *pBuf,u8 bytes)
{
     u8 status, byte_cnt;

    NRF_CE_LOW();
    
    /*置低CSN,使能SPI传输*/
    NRF_CSN_LOW();
        
    /*发送寄存器号*/        
    status = SPI_NRF_RW(reg); 

     /*读取缓冲区数据*/
    for(byte_cnt=0;byte_cnt<bytes;byte_cnt++)          
        pBuf[byte_cnt] = SPI_NRF_RW(NOP); //从NRF24L01读取数据  

    /*CSN拉高,完成*/
    NRF_CSN_HIGH();    
        
     return status;        //返回寄存器状态值
}


/*
 * 函数名:SPI_NRF_WriteBuf
 * 描述  :用于向NRF的寄存器中写入一串数据
 * 输入  :reg:NRF的命令+寄存器地址。
            pBuf:存储了将要写入写寄存器数据的数组,外部定义
           bytes: pBuf的数据长度    
 * 输出  :NRF的status寄存器的状态
 * 调用  :外部调用
 */
u8 SPI_NRF_WriteBuf(u8 reg ,u8 *pBuf,u8 bytes)
{
    u8 status,byte_cnt;
    
    NRF_CE_LOW();
    /*置低CSN,使能SPI传输*/
    NRF_CSN_LOW();            

    /*发送寄存器号*/    
    status = SPI_NRF_RW(reg); 
     
    /*向缓冲区写入数据*/
    for(byte_cnt=0;byte_cnt<bytes;byte_cnt++)
        SPI_NRF_RW(*pBuf++);    //写数据到缓冲区      
             
    /*CSN拉高,完成*/
    NRF_CSN_HIGH();            
  
    return (status);    //返回NRF24L01的状态         
}

/*
 * 函数名:NRF_RX_Mode
 * 描述  :配置并进入接收模式
 * 输入  :无    
 * 输出  :无
 * 调用  :外部调用
 */
void NRF_RX_Mode(u8 *rxAddr, u8 channel, u8 recvLen)
{
    NRF_CE_LOW();    

    SPI_NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0,rxAddr,RX_ADR_WIDTH);//写RX节点地址
    SPI_NRF_WriteReg(NRF_WRITE_REG+EN_AA,0x01);    //使能通道0的自动应答    
    SPI_NRF_WriteReg(NRF_WRITE_REG+EN_RXADDR,0x01);//使能通道0的接收地址    
    SPI_NRF_WriteReg(NRF_WRITE_REG+SETUP_AW, 0x03);//地址为5位的
    SPI_NRF_WriteReg(NRF_WRITE_REG+RF_CH,channel);      //设置RF通信频率    
    SPI_NRF_WriteReg(NRF_WRITE_REG+RX_PW_P0,recvLen);//选择通道0的有效数据宽度      
    SPI_NRF_WriteReg(NRF_WRITE_REG+RF_SETUP,0x0f); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启   
    SPI_NRF_WriteReg(NRF_WRITE_REG+CONFIG, 0x0f);  //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式 
    
    /*CE拉高,进入接收模式*/    
  NRF_CE_HIGH();
    Delay(0xffff); 
}    

/*
 * 函数名:NRF_TX_Mode
 * 描述  :配置发送模式
 * 输入  :无    
 * 输出  :无
 * 调用  :外部调用
 */
void NRF_TX_Mode(u8 *txAddr, u8 channel)
{  
    NRF_CE_LOW();        

    SPI_NRF_WriteBuf(NRF_WRITE_REG+TX_ADDR,txAddr,TX_ADR_WIDTH);    //写TX节点地址 
    SPI_NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0,txAddr,RX_ADR_WIDTH); //设置RX节点地址,主要为了使能ACK   
    SPI_NRF_WriteReg(NRF_WRITE_REG+EN_AA,0x01);     //使能通道0的自动应答    
    SPI_NRF_WriteReg(NRF_WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址 
    SPI_NRF_WriteReg(NRF_WRITE_REG+SETUP_AW, 0x03);//地址为5位的
    SPI_NRF_WriteReg(NRF_WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次
    SPI_NRF_WriteReg(NRF_WRITE_REG+RF_CH,channel);       //设置RF通道为CHANAL
    SPI_NRF_WriteReg(NRF_WRITE_REG+RF_SETUP,0x0f);  //设置TX发射参数,0db增益,2Mbps,低噪声增益开启   
    SPI_NRF_WriteReg(NRF_WRITE_REG+CONFIG,0x0e);    //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,发射模式,开启所有中断
    
    /*CE拉高,进入发送模式*/    
  NRF_CE_HIGH();
    Delay(0xffff); //CE要拉高一段时间才进入发送模式
}


/*
 * 函数名:NRF_Check
 * 描述  :主要用于NRF与MCU是否正常连接
 * 输入  :无    
 * 输出  :SUCCESS/ERROR 连接正常/连接失败
 * 调用  :外部调用
 */
u8 NRF_Check(void)
{
    u8 buf[5]={0xC2,0xC2,0xC2,0xC2,0xC2};
    u8 buf1[5];
    u8 i; 
     
    /*写入5个字节的地址.  */  
    SPI_NRF_WriteBuf(NRF_WRITE_REG+TX_ADDR,buf,5);

    /*读出写入的地址 */
    SPI_NRF_ReadBuf(TX_ADDR,buf1,5); 
     
    /*比较*/               
    for(i=0;i<5;i++){
        if(buf1[i]!=0xC2)
            break;
    } 
           
    if(i==5){
        return SUCCESS ;        //MCU与NRF成功连接 
    }else{
        return ERROR ;        //MCU与NRF不正常连接
    }
}

 /*
 * 函数名:NRF_Tx_Dat
 * 描述  :用于向NRF的发送缓冲区中写入数据
 * 输入  :txBuf:存储了将要发送的数据的数组,外部定义    
 * 输出  :发送结果,成功返回TXDS,失败返回MAXRT或ERROR
 * 调用  :外部调用
 */ 
u8 NRF_Tx_Dat(u8 *txbuf, u8 sendLen)
{
    u8 state;
  
    /*ce为低,进入待机模式1*/
    NRF_CE_LOW();

    /*写数据到TX BUF 最大 32个字节*/                        
    SPI_NRF_WriteBuf(WR_TX_PLOAD,txbuf,sendLen);

    /*CE为高,txbuf非空,发送数据包 */   
    NRF_CE_HIGH();
          
    while(NRF_Read_IRQ()!=0); //等待发送完成
                                 
    state = SPI_NRF_ReadReg(STATUS);//确认数据是否发送完成
   
    /*清除TX_DS或MAX_RT中断标志*/                  
    SPI_NRF_WriteReg(NRF_WRITE_REG+STATUS,state);     
    SPI_NRF_WriteReg(FLUSH_TX,NOP);    //清除TX FIFO寄存器 

    /*判断中断类型*/    
    if(state&MAX_RT){                     //达到最大重发次数
             return MAX_RT; 
    }else if(state&TX_DS){                  //发送完成
             return TX_DS;
    }else{                          
            return ERROR;                 //其他原因发送失败
    }

 /*
 * 函数名:NRF_Rx_Dat
 * 描述  :用于从NRF的接收缓冲区中读出数据
 * 输入  :rxBuf:用于接收该数据的数组,外部定义    
 * 输出  :接收结果,
 * 调用  :外部调用
 */ 
u8 NRF_Rx_Dat(u8 *rxbuf, u8 recvLen)
{
    u8 state; 
    NRF_CE_HIGH();     //进入接收状态
     /*等待接收中断*/
    while(NRF_Read_IRQ()!=0); 
    
    NRF_CE_LOW();       //进入待机状态
    /*读取status寄存器的值  */               
    state=SPI_NRF_ReadReg(STATUS);
     
    /* 清除中断标志*/      
    SPI_NRF_WriteReg(NRF_WRITE_REG+STATUS,state);

    /*判断是否接收到数据*/
    if(state&RX_DR){                                 //接收到数据
      SPI_NRF_ReadBuf(RD_RX_PLOAD,rxbuf,recvLen);//读取数据
        SPI_NRF_WriteReg(FLUSH_RX,NOP);          //清除RX FIFO寄存器
      return RX_DR; 
    }else{    
        return ERROR;                    //没收到任何数据
    }
}

/*main.c(发数据)文件*/

#include "stm32f4xx_conf.h"
#include "led.h"
#include "button.h"
#include "eint.h"
#include "wdt.h"
#include "uart.h"
#include "lcd.h"
#include "ds18b20.h"
#include "dht11.h"
#include "adc.h"
#include "nrf24l01.h"

int count;

void countDown(void)
{
    if (count) {
        count--;
    }
}

void myDelay(int ms)
{
    count = ms;
    while (count);
}

int main(void)
{    
    u8 temp[5];
    int count;
    u8 ret;
    struct nrf_msg_st msg;
    u8 rxAddr[] = {0x10, 0x20, 0x30, 0x40, 0x51};
    u8 txAddr[] = {0x10, 0x20, 0x30, 0x40, 0x53};
    
    led_init();
    delay_init();
    LCD_Init();
    DS18B20_Init();
    dht11_init();
    pm25_init();
    SPI_NRF_Init();

    LCD_Display_Dir(L2R_U2D);
    LCD_Clear(0xf800);
    
    BRUSH_COLOR = 0xfff0;
    BACK_COLOR = 0xf800;
    
    ret = NRF_Check();
    if (ret == SUCCESS) {
        LCD_DisplayString(10, 5, 24, "spi ok");
        LCD_DisplayString(10, 240, 12, "R:0x10,0x20,0x30,0x40,0x53");
        LCD_DisplayString(10, 280, 12, "T:0x10,0x20,0x30,0x40,0x51");
    } else {
        LCD_DisplayString(10, 5, 24, "spi error");
    }

    NRF_TX_Mode(txAddr, 40);
    while (1) {
        get_temperature((char *)msg.buf);
        LCD_DisplayString(10, 55, 24, (u8 *)msg.buf);
        dht11_get_data(temp);
        LCD_DisplayNum(10, 80, temp[0], 3, 24, 0);
        LCD_DisplayNum(10, 105, temp[2], 3, 24, 0);
        msg.value1 = (int)temp[2];
        msg.value2 = (int)temp[0];
        adc_start();
        adc_wait();
        msg.value3 = get_pm25_value();
        LCD_DisplayNum(10, 130, msg.value3, 4, 24, 0);
        count = 0;
        send_again:
        delay_ms(20);
        ret = NRF_Tx_Dat((u8 *)&msg, sizeof(msg));
        if (ret == TX_DS) {
            LCD_DisplayString(10, 160, 24, "tx ok");
        } else {
            LCD_DisplayString(10, 160, 24, "tx error");
            count++;
            if (count < 5) {
                goto send_again;
            }
        }
        delay_ms(2000);
    }
}
 

/*main.c(收数据)文件*/

#include "stm32f4xx_conf.h"
#include "led.h"
#include "button.h"
#include "eint.h"
#include "wdt.h"
#include "uart.h"
#include "lcd.h"
#include "ds18b20.h"
#include "dht11.h"
#include "adc.h"
#include "nrf24l01.h"

int count;

void countDown(void)
{
    if (count) {
        count--;
    }
}

void myDelay(int ms)
{
    count = ms;
    while (count);
}

int main(void)
{    
    u8 temp[5];
    int count;
    u8 ret;
    struct nrf_msg_st msg;
    u8 rxAddr[] = {0x10, 0x20, 0x30, 0x40, 0x53};
    u8 txAddr[] = {0x10, 0x20, 0x30, 0x40, 0x51};
    
    led_init();
    delay_init();
    LCD_Init();
    DS18B20_Init();
    dht11_init();
    pm25_init();
    SPI_NRF_Init();

    LCD_Display_Dir(L2R_U2D);
    LCD_Clear(0xf800);
    
    BRUSH_COLOR = 0xfff0;
    BACK_COLOR = 0xf800;
    
    ret = NRF_Check();
    if (ret == SUCCESS) {
        LCD_DisplayString(10, 5, 24, "spi ok");
        LCD_DisplayString(10, 240, 12, "R:0x10,0x20,0x30,0x40,0x53");
        LCD_DisplayString(10, 280, 12, "T:0x10,0x20,0x30,0x40,0x51");
    } else {
        LCD_DisplayString(10, 5, 24, "spi error");
    }
    
    NRF_RX_Mode(rxAddr, 40, sizeof(struct nrf_msg_st));
    while (1) {
            ret = NRF_Rx_Dat((u8 *)&msg, sizeof(msg));
            if (ret == RX_DR) {
                LCD_DisplayString(10, 30, 24, "rx_ok");
                LCD_DisplayString(20, 60, 24, msg.buf);
                LCD_DisplayNum(20, 90, msg.control, 10, 24, 0);
                LCD_DisplayNum(20, 120, msg.value1, 10, 24, 0);
                LCD_DisplayNum(20, 150, msg.value2, 10, 24, 0);
                LCD_DisplayNum(20, 180, msg.value3, 10, 24, 0);
            } else {
                LCD_DisplayString(10, 30, 24, "rx_error");
            }
        }
}

相关文章:

  • 2021-08-21
  • 2021-07-17
  • 2022-01-13
  • 2021-04-01
  • 2021-06-23
  • 2021-07-28
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-11-02
  • 2022-01-22
  • 2022-12-23
  • 2021-05-02
  • 2022-01-09
  • 2022-12-23
相关资源
相似解决方案