微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > 射频无线通信设计 > 强烈求助!24L01的发送完成中断标志TX_DS不变化

强烈求助!24L01的发送完成中断标志TX_DS不变化

时间:10-02 整理:3721RD 点击:
强烈求助大神们!我调24L01已有半个月,先后试了9个24L01模块,所有的结果都是一样,就是TX_DS标志不变,也说明没有发送成功,但我检测发送缓存器是空的,具体的说,发送前我检测一下STATUS寄存器值为14(10)证明没有发送成功,FIFO_STATUS寄存器的值为1(10)证明有数据,接下来检测FFO_STATUS寄存器的值为17(10)证明没有数据,而这时STATUS寄存器的值还是14(10)说明没发送成功!到到底什么情况。求大神们帮看看,谢谢啦!程序如下!
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned  int
#define READ_REG        0x00          // 读寄存器指令
#define WRITE_REG       0x20         // 写寄存器指令
#define RD_RX_PLOAD     0x61          // 读取接收数据指令
#define WR_TX_PLOAD     0xA0          // 写待发数据指令
#define FLUSH_TX        0xE1         // 冲洗发送 FIFO指令
#define FLUSH_RX        0xE2          // 冲洗接收 FIFO指令
#define REUSE_TX_PL     0xE3          // 定义重复装载数据指令
#define NOP             0xFF          // 保留
#define CONFIG          0x00  // 配置收发状态,CRC校验模式以及收发状态响应方式
#define EN_AA           0x01  // 自动应答功能设置
#define EN_RXADDR       0x02  // 可用信道设置
#define SETUP_AW        0x03  // 收发地址宽度设置
#define SETUP_RETR      0x04  // 自动重发功能设置
#define RF_CH           0x05  // 工作频率设置
#define RF_SETUP        0x06  // 发射速率、功耗功能设置
#define STATUS          0x07  // 状态寄存器
#define OBSERVE_TX      0x08  // 发送监测功能
#define CD              0x09  // 地址检测           
#define RX_ADDR_P0      0x0A  // 频道0接收数据地址
#define RX_ADDR_P1      0x0B  // 频道1接收数据地址
#define RX_ADDR_P2      0x0C  // 频道2接收数据地址
#define RX_ADDR_P3      0x0D  // 频道3接收数据地址
#define RX_ADDR_P4      0x0E  // 频道4接收数据地址
#define RX_ADDR_P5      0x0F  // 频道5接收数据地址
#define TX_ADDR         0x10  // 发送地址寄存器
#define RX_PW_P0        0x11  // 接收频道0接收数据长度
#define RX_PW_P1        0x12  // 接收频道0接收数据长度
#define RX_PW_P2        0x13  // 接收频道0接收数据长度
#define RX_PW_P3        0x14  // 接收频道0接收数据长度
#define RX_PW_P4        0x15  // 接收频道0接收数据长度
#define RX_PW_P5        0x16  // 接收频道0接收数据长度
#define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置
#define TX_PLOAD_WIDTH  32   // 20 uints TX payload
#define RX_PLOAD_WIDTH  32
#define TX_ADR_WIDTH    5
uchar const TX_ADDRESS[5];
uchar const RX_ADDRESS[5];
sbit dula=P2^6;
sbit wela=P2^7;
sbit lcden=P3^4;
sbit lcddo=P3^5;
sbit CE=P1^7;
sbit CSN=P1^6;
sbit SCK=P1^5;
sbit MOSI=P1^4;
sbit MISO=P1^3;
sbit IRQ=P1^2;
uchar num;
uchar str[4];
uchar *uchartostr(uchar unm)
{
        uchar x00,xx,x0,x,n;
        x00=unm/100;
        xx=unm%100;
        x0=xx/10;
        x=xx%10;
        n=0;
        if(x00!=0)
        {
                str[n]=x00+48;
                n++;
        }
        if(!(x00==0&x0==0))
        {
                str[n]=x0+48;
                n++;
        }
        str[n]=x+48;
        n++;
        str[n]='\0';
        return str;
}
uchar SPI_RW(uchar uuchar)
{
uchar bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++)
        {
        MOSI=(uuchar&0x80);
        uuchar=(uuchar<<1);
        SCK=1;
        uuchar |=MISO;
        SCK=0;
        }
        return(uuchar);
}
uchar SPI_Read(uchar reg)
{
uchar reg_val;
CSN=0;
SPI_RW(reg);
reg_val=SPI_RW(0);
CSN=1;
return(reg_val);
}
uchar SPI_RW_Reg(uchar reg,uchar value)
{
uchar status;
CSN=0;
status=SPI_RW(reg);
SPI_RW(value);
CSN=1;
return(status);
}
void delay(uint z)
{  
  uint x,y;
  for(x=z;x>0;x--)
     for(y=110;y>0;y--);
}
void write_ord(uchar ord)
{
   lcddo=0;
   P0=ord;
   delay(5);
   lcden=1;
   delay(5);
   lcden=0;
}
void write_dat(uchar dat)
{
   lcddo=1;
   P0=dat;
   delay(5);
   lcden=1;
   delay(5);
   lcden=0;
}
void init()
{
        lcden=0;
        write_ord( 0x38  );
        write_ord( 0x0c  );
        write_ord( 0x06  );
        write_ord( 0x01  );
}
uchar SPI_Write_Buf(uchar reg,uchar *pBuf,uchar uchars)
{
uchar status,uchar_ctr;
CSN=0;
status=SPI_RW(reg);
for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
SPI_RW(*pBuf++);
CSN=1;
return(status);
}
void init_NRF24L01(void)
{
delay(1);
CE=0;
CSN=1;
SCK=0;
IRQ=1;
SPI_RW_Reg(WRITE_REG+EN_AA,0x00);
SPI_RW_Reg(WRITE_REG+SETUP_RETR,0x00);
SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01);
SPI_RW_Reg(WRITE_REG+RF_CH,1);
SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);
SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07);
}
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,RX_ADDRESS,TX_ADR_WIDTH);
SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);
SPI_RW_Reg(WRITE_REG+CONFIG,0x0e);
CE=1;
delay(1);
}
void main()
{
        uchar TxBuf[5]={1};
        uchar status;
        uchar fifo_s;
        delay(100);
        init_NRF24L01();
       
   init();
        while(1)
        {       
       
                uchar const TX_ADDRESS[5]={0,0,0,0,0};       
                uchar const RX_ADDRESS[5]={0,0,0,0,0};               
                SPI_RW_Reg(WRITE_REG+STATUS,0XFF);
                SPI_Write_Buf(WR_TX_PLOAD,TxBuf,TX_PLOAD_WIDTH);
                status=SPI_Read(STATUS);
                uchartostr(status);
                write_ord(0x80);
                for(num=0;num<2;num++)
                write_dat(str[num]);
      fifo_s=SPI_Read(FIFO_STATUS);
                uchartostr(fifo_s);
                for(num=0;num<2;num++)
                write_dat(str[num]);
                nRF24L01_TxPacket(TxBuf);
                status=SPI_Read(STATUS);
           uchartostr(status);
                write_ord(0x80+0x40);
                  
                  for(num=0;num<2;num++)
                  write_dat(str[num]);
                  fifo_s=SPI_Read(FIFO_STATUS);
                  uchartostr(fifo_s);
                  for(num=0;num<2;num++)
                  write_dat(str[num]);
                  delay(800);
        }
}
谢谢了!

呵呵  !还是我自己解答吧!我自己做的3V电源模块不好用!以接上24L01及变成1.2V了!所以其实24L01一直没工作!呵呵!上面的程序是好使的!

你好,我也是在搞这个有问题想请教你一下可以么?

精神可嘉哦!学习学习!

非常谢谢小编,完美解答我的问题。如果有其他同学有nrf的问题,可以加我qq12412823

我的数据发送成功了,但TX_DS一直不置位,STATUS发送数据成功读出来一直是0x1e,和数据没发送成功的一样,然后弄了有一会,发现也是24L01供电电压的问题

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

网站地图

Top