微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 大哥些,求助啊。关于NRF24L01+ 的问题,能发送,不能接收

大哥些,求助啊。关于NRF24L01+ 的问题,能发送,不能接收

时间:10-02 整理:3721RD 点击:
单片机:STC89C52RC 无线模块:NRF24L01+ (注意带加号)
本人在网上找了N多代码,就是不能成功。接收端始终接收不到数据包,接收端采用中断方式接收。
就是一个发一个收;
发送端初始化如下:
sbit    IRQ        =P3^2;
sbit     MISO    =P1^3;
sbit     MOSI    =P1^4;
sbit    SCK        =P1^5;
sbit    CSN        =P1^6;
sbit    CE        =P1^7;
void init_NRF24L01(void)
{
    inerDelay_us(100);
     CE=0;    // chip enable
     CSN=1;   // Spi  disable
     SCK=0;   //

发送模式
void TX_Mode()  
{  
    CE = 0;  
    inerDelay_us(10);
    SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);// 写入发送地址  
    SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);// 为了应答接收设备,接收通道0地址和发送地址相同  
    SPI_RW_Reg(WRITE_REG + EN_AA,0x00);// 0x01);       // 使能接收通道0自动应答  
    SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);   // 使能接收通道0  
    SPI_RW_Reg(WRITE_REG + RF_CH, 0X40);//0x40);         // 选择射频通道0x40  
    SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);    // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益  
    SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);      // CRC使能,16位CRC校验,上电  
    CE = 1;  
        inerDelay_us(130);
}  
发送函数:
void nRF24L01_TxPacket(unsigned char * tx_buf)
{
    CE=0;           
     SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 写本地地址   
    SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址
    SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);              // 装载数据   
    CE=1;         //置高CE,激发数据发送
    inerDelay_us(100);
}

接收端:
sbit    IRQ        =P3^2;
sbit     MISO    =P1^3;
sbit     MOSI    =P1^4;
sbit    SCK        =P1^5;
sbit    CSN        =P1^6;
sbit    CE        =P1^7;
void init_NRF24L01(void)
{
    inerDelay_us(100);
     CE=0;    // chip enable
     CSN=1;   // Spi  disable
     SCK=0;   //

接收模式设置:
void RX_Mode(void)  
{  
    CE = 0;  
    inerDelay_us(100)
    SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);  // 接收设备接收通道0使用和发送设备相同的发送地址  
    SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);//0x01);               // 使能接收通道0自动应答  
    SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);           // 使能接收通道0  
    SPI_RW_Reg(WRITE_REG + RF_CH, 0X40);//0x40);//40);                 // 选择射频通道0x40
    SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);            // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益   
    SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);  // 接收通道0选择和发送通道相同有效数据宽度  
   
    SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);              // CRC使能,16位CRC校验,上电,接收模式
    CE = 1;                                            // 拉高CE启动接收设备  
    inerDelay_us(200);
}  
采用中断方式接收。IRQ连接P3^2引脚
void NRF_IRQ() interrupt 0     //视乎从来没有进入中断函数
{
   cnt++;
       sta=SPI_Read(STATUS);    // 读取状态寄存其来判断数据接收状况
    if(RX_DR)                // 判断是否接收到数据
    {
        CE = 0;             //SPI使能
        SPI_Read_Buf(RD_RX_PLOAD,RxBuf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
        SPI_RW_Reg(WRITE_REG+STATUS,0xff);   //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
    }
    SPI_RW_Reg(WRITE_REG+STATUS,sta);
    LCD_Clear();//清屏
   LCD_Write_String(1,0,uchartostr(cnt,str))//只是看看收到有没有中断
  
    if(cnt==250)
      cnt=1;
   Delay(10);
}

问题已经解决,电路问题,加个稳压电容就对了

大哥,我在nrf的函数里加了测距模块的内容(包含定时器),结果就失灵了

请问小编在哪里加的稳压电容 解决了接收端的问题,现在在做这个无线模块的温度采集,也碰到了接收端液晶屏不显示数据,所以想请教一下小编!

没有大神 啊   功能最多 使用最简单才最重要

顶一个

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top